From 099c373d49b02b578ab5436a63786f88a2627dbd Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Thu, 17 Aug 2023 13:01:15 -0500 Subject: [PATCH 001/148] Update FastAPI to 0.100.1 in preparation for Pydantic v2 support (#335) --- poetry.lock | 16 +++++++--------- pyproject.toml | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/poetry.lock b/poetry.lock index 414c5b54e1..c52f933e8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -686,24 +686,22 @@ tests = ["asttokens", "littleutils", "pytest", "rich"] [[package]] name = "fastapi" -version = "0.95.2" +version = "0.100.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, - {file = "fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, ] [package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" [package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] name = "filelock" @@ -3644,4 +3642,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "0551e88980b5e22957c5cbe641e6a7897a295a6e3d31b2cc4e0e074a1fa2e231" +content-hash = "0443b0a62b1438e51309c8d1606460f20dc2e51c6702fecc03a7b171a919b185" diff --git a/pyproject.toml b/pyproject.toml index c854e5fb9b..edcc4be869 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ azure-cognitiveservices-speech = "^1.27.0" websockets = "^11.0.2" requests = "^2.28.2" uvicorn = "^0.21.1" -fastapi = "^0.95.1" +fastapi = "^0.100.1" jinja2 = "^3.1.2" python-multipart = "^0.0.6" six = "^1.16.0" From 5642e025133acfaa9af0060bf63bd8976a8f7603 Mon Sep 17 00:00:00 2001 From: Kian Hooshmand Date: Thu, 17 Aug 2023 14:21:58 -0700 Subject: [PATCH 002/148] add error handling for vector db (#357) --- vocode/streaming/agent/chat_gpt_agent.py | 45 +++++++++++++----------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 5cd0e2d66e..7a4ee72408 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -141,27 +141,32 @@ async def generate_response( return assert self.transcript is not None + chat_parameters = {} if self.agent_config.vector_db_config: - docs_with_scores = await self.vector_db.similarity_search_with_score( - self.transcript.get_last_user_message()[1] - ) - docs_with_scores_str = "\n\n".join( - [ - "Document: " - + doc[0].metadata["source"] - + f" (Confidence: {doc[1]})\n" - + doc[0].lc_kwargs["page_content"].replace(r"\n", "\n") - for doc in docs_with_scores - ] - ) - vector_db_result = f"Found {len(docs_with_scores)} similar documents:\n{docs_with_scores_str}" - messages = format_openai_chat_messages_from_transcript( - self.transcript, self.agent_config.prompt_preamble - ) - messages.insert( - -1, vector_db_result_to_openai_chat_message(vector_db_result) - ) - chat_parameters = self.get_chat_parameters(messages) + try: + docs_with_scores = await self.vector_db.similarity_search_with_score( + self.transcript.get_last_user_message()[1] + ) + docs_with_scores_str = "\n\n".join( + [ + "Document: " + + doc[0].metadata["source"] + + f" (Confidence: {doc[1]})\n" + + doc[0].lc_kwargs["page_content"].replace(r"\n", "\n") + for doc in docs_with_scores + ] + ) + vector_db_result = f"Found {len(docs_with_scores)} similar documents:\n{docs_with_scores_str}" + messages = format_openai_chat_messages_from_transcript( + self.transcript, self.agent_config.prompt_preamble + ) + messages.insert( + -1, vector_db_result_to_openai_chat_message(vector_db_result) + ) + chat_parameters = self.get_chat_parameters(messages) + except Exception as e: + self.logger.error(f"Error while hitting vector db: {e}", exc_info=True) + chat_parameters = self.get_chat_parameters() else: chat_parameters = self.get_chat_parameters() chat_parameters["stream"] = True From df9cfbb38c00727543f545cc66d75ed34dd476af Mon Sep 17 00:00:00 2001 From: Ryan Tremblay Date: Fri, 18 Aug 2023 18:56:38 -0400 Subject: [PATCH 003/148] azure: stop specifying english for multilingual (#302) * azure: stop specifying english for multilingual * - adds language code parameter to synthesizer_config - splits on the voice_name to figure out the top level lang, then uses the language_code to house the message * move reading data into ephemeral thread --------- Co-authored-by: Ajay Raj --- vocode/streaming/models/synthesizer.py | 1 + .../streaming/synthesizer/azure_synthesizer.py | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index e872e01b0b..6641ba110f 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -81,6 +81,7 @@ class AzureSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.AZURE.value voice_name: str = AZURE_SYNTHESIZER_DEFAULT_VOICE_NAME pitch: int = AZURE_SYNTHESIZER_DEFAULT_PITCH rate: int = AZURE_SYNTHESIZER_DEFAULT_RATE + language_code: str = "en-US" DEFAULT_GOOGLE_LANGUAGE_CODE = "en-US" diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index dab63b5226..11144a6db0 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -169,12 +169,18 @@ def word_boundary_cb(self, evt, pool): def create_ssml( self, message: str, bot_sentiment: Optional[BotSentiment] = None ) -> str: + voice_language_code = self.synthesizer_config.voice_name[:5] ssml_root = ElementTree.fromstring( - '' + f'' ) voice = ElementTree.SubElement(ssml_root, "voice") voice.set("name", self.voice_name) - voice_root = voice + if self.synthesizer_config.language_code != "en-US": + lang = ElementTree.SubElement(voice, "{%s}lang" % NAMESPACES.get("")) + lang.set("xml:lang", self.synthesizer_config.language_code) + voice_root = lang + else: + voice_root = voice if bot_sentiment and bot_sentiment.emotion: styled = ElementTree.SubElement( voice, "{%s}express-as" % NAMESPACES.get("mstts") @@ -247,9 +253,10 @@ async def chunk_generator( audio_data_stream: speechsdk.AudioDataStream, chunk_transform=lambda x: x ): audio_buffer = bytes(chunk_size) - while not audio_data_stream.can_read_data(chunk_size): - await asyncio.sleep(0) - filled_size = audio_data_stream.read_data(audio_buffer) + filled_size = await asyncio.get_event_loop().run_in_executor( + self.thread_pool_executor, + lambda: audio_data_stream.read_data(audio_buffer), + ) if filled_size != chunk_size: yield SynthesisResult.ChunkResult( chunk_transform(audio_buffer[offset:]), True From fabe74e6108a131fb65ab5cec5d209ffcf146f82 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 18 Aug 2023 17:06:11 -0700 Subject: [PATCH 004/148] poetry bump (#360) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index edcc4be869..1ba947a2a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.111a4" +version = "0.1.111" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From 8ace1a6dbe20ad481c1f002e07da71ede2fe9efd Mon Sep 17 00:00:00 2001 From: SeungjinYang Date: Tue, 22 Aug 2023 10:40:24 -0700 Subject: [PATCH 005/148] Add AWS Polly Synthesizer (#356) * polly synthesizer * dependency update * typecheck fixes * pcm and streaming * fix sampling_rate type * remove convert span, apply changes to turn based synthesizer * fix typecheck errors * add get_messages_up_to implementation --- README.md | 1 + .../streaming/synthesizer/synthesize.py | 1 + poetry.lock | 1811 +++++++++-------- pyproject.toml | 1 + vocode/streaming/models/synthesizer.py | 12 + vocode/streaming/synthesizer/__init__.py | 1 + vocode/streaming/synthesizer/factory.py | 6 + .../synthesizer/polly_synthesizer.py | 141 ++ vocode/turn_based/synthesizer/__init__.py | 1 + .../synthesizer/polly_synthesizer.py | 47 + 10 files changed, 1134 insertions(+), 888 deletions(-) create mode 100644 vocode/streaming/synthesizer/polly_synthesizer.py create mode 100644 vocode/turn_based/synthesizer/polly_synthesizer.py diff --git a/README.md b/README.md index e30c2076de..45c6ea3b5f 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ We're actively looking for community maintainers, so please reach out if interes - [gTTS](https://gtts.readthedocs.io/) - [StreamElements](https://streamelements.com/) - [Bark](https://github.com/suno-ai/bark) + - [AWS Polly](https://aws.amazon.com/polly/) Check out our React SDK [here](https://github.com/vocodedev/vocode-react-sdk)! diff --git a/playground/streaming/synthesizer/synthesize.py b/playground/streaming/synthesizer/synthesize.py index 413ff6c8b1..41adfbef8b 100644 --- a/playground/streaming/synthesizer/synthesize.py +++ b/playground/streaming/synthesizer/synthesize.py @@ -10,6 +10,7 @@ PlayHtSynthesizerConfig, ElevenLabsSynthesizerConfig, RimeSynthesizerConfig, + PollySynthesizerConfig, ) from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.output_device.speaker_output import SpeakerOutput diff --git a/poetry.lock b/poetry.lock index c52f933e8a..08b5eb058d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,98 +2,98 @@ [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.8.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] @@ -172,13 +172,13 @@ dev = ["black (>=22.3.0)", "pytest"] [[package]] name = "anyio" -version = "3.7.0" +version = "3.7.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.7" files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, ] [package.dependencies] @@ -187,7 +187,7 @@ idna = ">=2.8" sniffio = ">=1.1" [package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (<0.22)"] @@ -221,13 +221,13 @@ test = ["astroid", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] @@ -250,17 +250,17 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte [[package]] name = "azure-cognitiveservices-speech" -version = "1.29.0" +version = "1.31.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:1beda741dd6e49564e9d970c606f1ea7e007969069842b19327abce119175774"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b189c4248b4adf69fc563abe30780c8f09bad6200414bb2b765abe2d44ed8c96"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:e9474e3ea19ed44f80c2aa7bc1c5c5e9711c5dbdf0662cb2eec31ff7821dbfa8"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cea4984bd3fa582c41ba8ec79cd37f55380bb386e09ca155ae2aac343c8bdac5"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-win32.whl", hash = "sha256:7cdc010e4a4586e78d3a265931520ca0422eed8145d37a7dd1e448e437945e08"}, - {file = "azure_cognitiveservices_speech-1.29.0-py3-none-win_amd64.whl", hash = "sha256:cdba9d39fd9e7ee7cf49c54e8a3ba2b217469219b3a35cb3c993f32ca00d217c"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, + {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, ] [[package]] @@ -276,36 +276,33 @@ files = [ [[package]] name = "black" -version = "23.3.0" +version = "23.7.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, + {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, + {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, + {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, + {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, + {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, + {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, + {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, + {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, + {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, + {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, + {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, + {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, + {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, + {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, ] [package.dependencies] @@ -323,6 +320,44 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "boto3" +version = "1.28.30" +description = "The AWS SDK for Python" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "boto3-1.28.30-py3-none-any.whl", hash = "sha256:e095ede98d3680e65966ab71f273b7d86938f5d853773ef96f4cb646277c2a4b"}, + {file = "boto3-1.28.30.tar.gz", hash = "sha256:2b509a959966a572f15db5768a18066ce1f53022ac53fca9421c620219fa3998"}, +] + +[package.dependencies] +botocore = ">=1.31.30,<1.32.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.6.0,<0.7.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + +[[package]] +name = "botocore" +version = "1.31.30" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">= 3.7" +files = [ + {file = "botocore-1.31.30-py3-none-any.whl", hash = "sha256:269f20dcadd8dfd0c26d0e6fbceb84814ff6638ff3aafcc5324b9fb9949a7051"}, + {file = "botocore-1.31.30.tar.gz", hash = "sha256:3cf6a9d7621b897c9ff23cd02113826141b3dd3d7e90273b661efc4dc05f84e2"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" + +[package.extras] +crt = ["awscrt (==0.16.26)"] + [[package]] name = "cachetools" version = "5.3.1" @@ -336,13 +371,13 @@ files = [ [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, ] [[package]] @@ -423,108 +458,108 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -543,30 +578,34 @@ files = [ [[package]] name = "cryptography" -version = "41.0.1" +version = "41.0.3" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, - {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, - {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, - {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, - {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, - {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, - {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, - {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, - {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, + {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, + {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, + {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, + {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, + {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, + {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, + {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, + {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, + {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, ] [package.dependencies] @@ -584,22 +623,18 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.5.8" -description = "Easily serialize dataclasses to and from JSON" +version = "0.5.14" +description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7,<3.13" files = [ - {file = "dataclasses-json-0.5.8.tar.gz", hash = "sha256:6572ac08ad9340abcb74fd8c4c8e9752db2a182a402c8e871d0a8aa119e3804e"}, - {file = "dataclasses_json-0.5.8-py3-none-any.whl", hash = "sha256:65b167c15fdf9bde27569c09ac18dd39bf1cc5b7998525024cb4678d2653946c"}, + {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, + {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, ] [package.dependencies] -marshmallow = ">=3.3.0,<4.0.0" -marshmallow-enum = ">=1.5.1,<2.0.0" -typing-inspect = ">=0.4.0" - -[package.extras] -dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=7.2.0)", "simplejson", "types-dataclasses"] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" [[package]] name = "decorator" @@ -631,40 +666,41 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "distlib" -version = "0.3.6" +version = "0.3.7" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, - {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, ] [[package]] name = "elevenlabs" -version = "0.2.18" +version = "0.2.24" description = "The official elevenlabs python package." optional = true python-versions = "*" files = [ - {file = "elevenlabs-0.2.18-py3-none-any.whl", hash = "sha256:328387891daaeccf303b7ca04768347ab470038e719d20eda4fcd1047334f541"}, - {file = "elevenlabs-0.2.18.tar.gz", hash = "sha256:5ce6578fdda5cddba8432bbc572c92365d004786edf1b063f08a338916b825ae"}, + {file = "elevenlabs-0.2.24-py3-none-any.whl", hash = "sha256:f1dc780e50ace7a499717cc67485b87bf5cd806a2711fca7a4fbf1b8b9f3a41c"}, + {file = "elevenlabs-0.2.24.tar.gz", hash = "sha256:7719816f8d74666c0da5567e737b6c0200f2807bed9d9c21ed750f14e8a3669d"}, ] [package.dependencies] ipython = ">=7.0" -pydantic = ">=1.10" +pydantic = ">=1.10,<2.0" requests = ">=2.20" +websockets = ">=11.0" [[package]] name = "exceptiongroup" -version = "1.1.1" +version = "1.1.3" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, ] [package.extras] @@ -720,126 +756,113 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] name = "google-api-core" -version = "2.11.0" +version = "2.11.1" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, - {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, + {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, + {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, ] [package.dependencies] -google-auth = ">=2.14.1,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, ] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -requests = ">=2.18.0,<3.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.20.0" +version = "2.22.0" description = "Google Authentication Library" optional = true python-versions = ">=3.6" files = [ - {file = "google-auth-2.20.0.tar.gz", hash = "sha256:030af34138909ccde0fbce611afc178f1d65d32fbff281f25738b1fe1c6f3eaa"}, - {file = "google_auth-2.20.0-py2.py3-none-any.whl", hash = "sha256:23b7b0950fcda519bfb6692bf0d5289d2ea49fc143717cc7188458ec620e63fa"}, + {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, + {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, ] [package.dependencies] @@ -858,13 +881,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.26.0" +version = "1.30.1" description = "Vertex AI API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-aiplatform-1.26.0.tar.gz", hash = "sha256:5314289acf732e02b92af61d473817e598ed57e66bc88923816eb96426fd2957"}, - {file = "google_cloud_aiplatform-1.26.0-py2.py3-none-any.whl", hash = "sha256:31de5152847cbaf094e4f635850d229adfd3fd0b1f1bb1436491f1a7d23fbc8b"}, + {file = "google-cloud-aiplatform-1.30.1.tar.gz", hash = "sha256:7552a6b2e66d7a9ff3c4b2bb95b0e9c182e7475dfb35d6347e9299f78779135a"}, + {file = "google_cloud_aiplatform-1.30.1-py2.py3-none-any.whl", hash = "sha256:ab1bbd4cf83cf583b7dea7e53421ad076f18b63e93cb22fb53c03176d5aa9258"}, ] [package.dependencies] @@ -882,26 +905,26 @@ autologging = ["mlflow (>=1.27.0,<=2.1.1)"] cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] datasets = ["pyarrow (>=3.0.0,<8.0dev)"] endpoint = ["requests (>=2.28.1)"] -full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pyyaml (>=5.3,<6)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] +full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] -pipelines = ["pyyaml (>=5.3,<6)"] +pipelines = ["pyyaml (>=5.3,<7)"] prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.76.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] -testing = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "grpcio-testing", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3,<6)", "requests (>=2.28.1)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +testing = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "grpcio-testing", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] vizier = ["google-vizier (==0.0.4)"] xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] [[package]] name = "google-cloud-bigquery" -version = "3.11.1" +version = "3.11.4" description = "Google BigQuery API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-3.11.1.tar.gz", hash = "sha256:cfe1158bc5818276ba765959da8a27afdcdaa11fa3fa9eed097d5639297dfe74"}, - {file = "google_cloud_bigquery-3.11.1-py2.py3-none-any.whl", hash = "sha256:738ae717f26bd7567f826f29f65be266f49bc3db0b069ac6030894fd8895ed6f"}, + {file = "google-cloud-bigquery-3.11.4.tar.gz", hash = "sha256:697df117241a2283bcbb93b21e10badc14e51c9a90800d2a7e1a3e1c7d842974"}, + {file = "google_cloud_bigquery-3.11.4-py2.py3-none-any.whl", hash = "sha256:5fa7897743a0ed949ade25a0942fc9e7557d8fce307c6f8a76d1b604cf27f1b1"}, ] [package.dependencies] @@ -930,13 +953,13 @@ tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] name = "google-cloud-core" -version = "2.3.2" +version = "2.3.3" description = "Google Cloud API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-core-2.3.2.tar.gz", hash = "sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a"}, - {file = "google_cloud_core-2.3.2-py2.py3-none-any.whl", hash = "sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe"}, + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, ] [package.dependencies] @@ -948,13 +971,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)"] [[package]] name = "google-cloud-resource-manager" -version = "1.10.1" +version = "1.10.3" description = "Google Cloud Resource Manager API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-resource-manager-1.10.1.tar.gz", hash = "sha256:c974fb6f9810476cf7b63ea89394c1a8df47f7f2dc2303e728bb74b500bcde67"}, - {file = "google_cloud_resource_manager-1.10.1-py2.py3-none-any.whl", hash = "sha256:41a2204532f084c707fde0bc1a9bc95c7e0b739d7072dd0b8a25106667a56184"}, + {file = "google-cloud-resource-manager-1.10.3.tar.gz", hash = "sha256:f80efcea36f10c5a81889afe93910926e3978b4b1ceeb82f563a2fc863072d14"}, + {file = "google_cloud_resource_manager-1.10.3-py2.py3-none-any.whl", hash = "sha256:1381a4b0f522248ebe0ebd1289d8822b99c54f4e1fe03924a6e723b2ed93dd7f"}, ] [package.dependencies] @@ -968,13 +991,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-speech" -version = "2.20.0" +version = "2.21.0" description = "Google Cloud Speech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-speech-2.20.0.tar.gz", hash = "sha256:e6c5b86ffe8e474b9c82b699ef902f75c9478e77e44ea39de3997b3ef8af3e2e"}, - {file = "google_cloud_speech-2.20.0-py2.py3-none-any.whl", hash = "sha256:baee6524836c1c86bd4ad508a6258bbf51601d329d6e22d71d163761c0b188e9"}, + {file = "google-cloud-speech-2.21.0.tar.gz", hash = "sha256:661c39bbb6f2b216ba56ace3b087260e9778dd19ade9efa3700adee9258009ad"}, + {file = "google_cloud_speech-2.21.0-py2.py3-none-any.whl", hash = "sha256:88e51aa35d385d7b8325c461327c5f4a19ac8ab38d92ffb0d61c4e91494a0171"}, ] [package.dependencies] @@ -987,13 +1010,13 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "google-cloud-storage" -version = "2.9.0" +version = "2.10.0" description = "Google Cloud Storage API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.9.0.tar.gz", hash = "sha256:9b6ae7b509fc294bdacb84d0f3ea8e20e2c54a8b4bbe39c5707635fec214eff3"}, - {file = "google_cloud_storage-2.9.0-py2.py3-none-any.whl", hash = "sha256:83a90447f23d5edd045e0037982c270302e3aeb45fc1288d2c2ca713d27bad94"}, + {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, + {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, ] [package.dependencies] @@ -1125,13 +1148,13 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.59.1" +version = "1.60.0" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.59.1.tar.gz", hash = "sha256:b35d530fe825fb4227857bc47ad84c33c809ac96f312e13182bdeaa2abe1178a"}, - {file = "googleapis_common_protos-1.59.1-py2.py3-none-any.whl", hash = "sha256:0cbedb6fb68f1c07e18eb4c48256320777707e7d0c55063ae56c15db3224a61e"}, + {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, + {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, ] [package.dependencies] @@ -1232,75 +1255,75 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4 [[package]] name = "grpcio" -version = "1.54.2" +version = "1.57.0" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.7" files = [ - {file = "grpcio-1.54.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:40e1cbf69d6741b40f750f3cccc64326f927ac6145a9914d33879e586002350c"}, - {file = "grpcio-1.54.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2288d76e4d4aa7ef3fe7a73c1c470b66ea68e7969930e746a8cd8eca6ef2a2ea"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c0e3155fc5335ec7b3b70f15230234e529ca3607b20a562b6c75fb1b1218874c"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bf88004fe086c786dc56ef8dd6cb49c026833fdd6f42cb853008bce3f907148"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be88c081e33f20630ac3343d8ad9f1125f32987968e9c8c75c051c9800896e8"}, - {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:33d40954199bddbb6a78f8f6f2b2082660f381cd2583ec860a6c2fa7c8400c08"}, - {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b52d00d1793d290c81ad6a27058f5224a7d5f527867e5b580742e1bd211afeee"}, - {file = "grpcio-1.54.2-cp310-cp310-win32.whl", hash = "sha256:881d058c5ccbea7cc2c92085a11947b572498a27ef37d3eef4887f499054dca8"}, - {file = "grpcio-1.54.2-cp310-cp310-win_amd64.whl", hash = "sha256:0212e2f7fdf7592e4b9d365087da30cb4d71e16a6f213120c89b4f8fb35a3ab3"}, - {file = "grpcio-1.54.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:1e623e0cf99a0ac114f091b3083a1848dbc64b0b99e181473b5a4a68d4f6f821"}, - {file = "grpcio-1.54.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:66233ccd2a9371158d96e05d082043d47dadb18cbb294dc5accfdafc2e6b02a7"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4cb283f630624ebb16c834e5ac3d7880831b07cbe76cb08ab7a271eeaeb8943e"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a1e601ee31ef30a9e2c601d0867e236ac54c922d32ed9f727b70dd5d82600d5"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8da84bbc61a4e92af54dc96344f328e5822d574f767e9b08e1602bb5ddc254a"}, - {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5008964885e8d23313c8e5ea0d44433be9bfd7e24482574e8cc43c02c02fc796"}, - {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2f5a1f1080ccdc7cbaf1171b2cf384d852496fe81ddedeb882d42b85727f610"}, - {file = "grpcio-1.54.2-cp311-cp311-win32.whl", hash = "sha256:b74ae837368cfffeb3f6b498688a123e6b960951be4dec0e869de77e7fa0439e"}, - {file = "grpcio-1.54.2-cp311-cp311-win_amd64.whl", hash = "sha256:8cdbcbd687e576d48f7886157c95052825ca9948c0ed2afdc0134305067be88b"}, - {file = "grpcio-1.54.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:782f4f8662a2157c4190d0f99eaaebc602899e84fb1e562a944e5025929e351c"}, - {file = "grpcio-1.54.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:714242ad0afa63a2e6dabd522ae22e1d76e07060b5af2ddda5474ba4f14c2c94"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f900ed4ad7a0f1f05d35f955e0943944d5a75f607a836958c6b8ab2a81730ef2"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96a41817d2c763b1d0b32675abeb9179aa2371c72aefdf74b2d2b99a1b92417b"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70fcac7b94f4c904152809a050164650ac81c08e62c27aa9f156ac518029ebbe"}, - {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fd6c6c29717724acf9fc1847c4515d57e4dc12762452457b9cb37461f30a81bb"}, - {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c2392f5b5d84b71d853918687d806c1aa4308109e5ca158a16e16a6be71041eb"}, - {file = "grpcio-1.54.2-cp37-cp37m-win_amd64.whl", hash = "sha256:51630c92591d6d3fe488a7c706bd30a61594d144bac7dee20c8e1ce78294f474"}, - {file = "grpcio-1.54.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:b04202453941a63b36876a7172b45366dc0cde10d5fd7855c0f4a4e673c0357a"}, - {file = "grpcio-1.54.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:89dde0ac72a858a44a2feb8e43dc68c0c66f7857a23f806e81e1b7cc7044c9cf"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:09d4bfd84686cd36fd11fd45a0732c7628308d094b14d28ea74a81db0bce2ed3"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fc2b4edb938c8faa4b3c3ea90ca0dd89b7565a049e8e4e11b77e60e4ed2cc05"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f7203e2767800edee7a1e1040aaaf124a35ce0c7fe0883965c6b762defe598"}, - {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e416c8baf925b5a1aff31f7f5aecc0060b25d50cce3a5a7255dc5cf2f1d4e5eb"}, - {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dc80c9c6b608bf98066a038e0172013a49cfa9a08d53335aefefda2c64fc68f4"}, - {file = "grpcio-1.54.2-cp38-cp38-win32.whl", hash = "sha256:8d6192c37a30a115f4663592861f50e130caed33efc4eec24d92ec881c92d771"}, - {file = "grpcio-1.54.2-cp38-cp38-win_amd64.whl", hash = "sha256:46a057329938b08e5f0e12ea3d7aed3ecb20a0c34c4a324ef34e00cecdb88a12"}, - {file = "grpcio-1.54.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:2296356b5c9605b73ed6a52660b538787094dae13786ba53080595d52df13a98"}, - {file = "grpcio-1.54.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:c72956972e4b508dd39fdc7646637a791a9665b478e768ffa5f4fe42123d5de1"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:9bdbb7624d65dc0ed2ed8e954e79ab1724526f09b1efa88dcd9a1815bf28be5f"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c44e1a765b31e175c391f22e8fc73b2a2ece0e5e6ff042743d8109b5d2eff9f"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cc928cfe6c360c1df636cf7991ab96f059666ac7b40b75a769410cc6217df9c"}, - {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a08920fa1a97d4b8ee5db2f31195de4a9def1a91bc003544eb3c9e6b8977960a"}, - {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4864f99aac207e3e45c5e26c6cbb0ad82917869abc2f156283be86c05286485c"}, - {file = "grpcio-1.54.2-cp39-cp39-win32.whl", hash = "sha256:b38b3de8cff5bc70f8f9c615f51b48eff7313fc9aca354f09f81b73036e7ddfa"}, - {file = "grpcio-1.54.2-cp39-cp39-win_amd64.whl", hash = "sha256:be48496b0e00460717225e7680de57c38be1d8629dc09dadcd1b3389d70d942b"}, - {file = "grpcio-1.54.2.tar.gz", hash = "sha256:50a9f075eeda5097aa9a182bb3877fe1272875e45370368ac0ee16ab9e22d019"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.54.2)"] + {file = "grpcio-1.57.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:092fa155b945015754bdf988be47793c377b52b88d546e45c6a9f9579ac7f7b6"}, + {file = "grpcio-1.57.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f7349786da979a94690cc5c2b804cab4e8774a3cf59be40d037c4342c906649"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82640e57fb86ea1d71ea9ab54f7e942502cf98a429a200b2e743d8672171734f"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40b72effd4c789de94ce1be2b5f88d7b9b5f7379fe9645f198854112a6567d9a"}, + {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f708a6a17868ad8bf586598bee69abded4996b18adf26fd2d91191383b79019"}, + {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60fe15288a0a65d5c1cb5b4a62b1850d07336e3ba728257a810317be14f0c527"}, + {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6907b1cf8bb29b058081d2aad677b15757a44ef2d4d8d9130271d2ad5e33efca"}, + {file = "grpcio-1.57.0-cp310-cp310-win32.whl", hash = "sha256:57b183e8b252825c4dd29114d6c13559be95387aafc10a7be645462a0fc98bbb"}, + {file = "grpcio-1.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7b400807fa749a9eb286e2cd893e501b110b4d356a218426cb9c825a0474ca56"}, + {file = "grpcio-1.57.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6ebecfb7a31385393203eb04ed8b6a08f5002f53df3d59e5e795edb80999652"}, + {file = "grpcio-1.57.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:00258cbe3f5188629828363ae8ff78477ce976a6f63fb2bb5e90088396faa82e"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:23e7d8849a0e58b806253fd206ac105b328171e01b8f18c7d5922274958cc87e"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5371bcd861e679d63b8274f73ac281751d34bd54eccdbfcd6aa00e692a82cd7b"}, + {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aed90d93b731929e742967e236f842a4a2174dc5db077c8f9ad2c5996f89f63e"}, + {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe752639919aad9ffb0dee0d87f29a6467d1ef764f13c4644d212a9a853a078d"}, + {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fada6b07ec4f0befe05218181f4b85176f11d531911b64c715d1875c4736d73a"}, + {file = "grpcio-1.57.0-cp311-cp311-win32.whl", hash = "sha256:bb396952cfa7ad2f01061fbc7dc1ad91dd9d69243bcb8110cf4e36924785a0fe"}, + {file = "grpcio-1.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:e503cb45ed12b924b5b988ba9576dc9949b2f5283b8e33b21dcb6be74a7c58d0"}, + {file = "grpcio-1.57.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:fd173b4cf02b20f60860dc2ffe30115c18972d7d6d2d69df97ac38dee03be5bf"}, + {file = "grpcio-1.57.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d7f8df114d6b4cf5a916b98389aeaf1e3132035420a88beea4e3d977e5f267a5"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:76c44efa4ede1f42a9d5b2fed1fe9377e73a109bef8675fb0728eb80b0b8e8f2"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4faea2cfdf762a664ab90589b66f416274887641ae17817de510b8178356bf73"}, + {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c60b83c43faeb6d0a9831f0351d7787a0753f5087cc6fa218d78fdf38e5acef0"}, + {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b363bbb5253e5f9c23d8a0a034dfdf1b7c9e7f12e602fc788c435171e96daccc"}, + {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1fb0fd4a1e9b11ac21c30c169d169ef434c6e9344ee0ab27cfa6f605f6387b2"}, + {file = "grpcio-1.57.0-cp37-cp37m-win_amd64.whl", hash = "sha256:34950353539e7d93f61c6796a007c705d663f3be41166358e3d88c45760c7d98"}, + {file = "grpcio-1.57.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:871f9999e0211f9551f368612460442a5436d9444606184652117d6a688c9f51"}, + {file = "grpcio-1.57.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:a8a8e560e8dbbdf29288872e91efd22af71e88b0e5736b0daf7773c1fecd99f0"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2313b124e475aa9017a9844bdc5eafb2d5abdda9d456af16fc4535408c7d6da6"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4098b6b638d9e0ca839a81656a2fd4bc26c9486ea707e8b1437d6f9d61c3941"}, + {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e5b58e32ae14658085c16986d11e99abd002ddbf51c8daae8a0671fffb3467f"}, + {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0f80bf37f09e1caba6a8063e56e2b87fa335add314cf2b78ebf7cb45aa7e3d06"}, + {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5b7a4ce8f862fe32b2a10b57752cf3169f5fe2915acfe7e6a1e155db3da99e79"}, + {file = "grpcio-1.57.0-cp38-cp38-win32.whl", hash = "sha256:9338bacf172e942e62e5889b6364e56657fbf8ac68062e8b25c48843e7b202bb"}, + {file = "grpcio-1.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:e1cb52fa2d67d7f7fab310b600f22ce1ff04d562d46e9e0ac3e3403c2bb4cc16"}, + {file = "grpcio-1.57.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fee387d2fab144e8a34e0e9c5ca0f45c9376b99de45628265cfa9886b1dbe62b"}, + {file = "grpcio-1.57.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b53333627283e7241fcc217323f225c37783b5f0472316edcaa4479a213abfa6"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f19ac6ac0a256cf77d3cc926ef0b4e64a9725cc612f97228cd5dc4bd9dbab03b"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fdf04e402f12e1de8074458549337febb3b45f21076cc02ef4ff786aff687e"}, + {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5613a2fecc82f95d6c51d15b9a72705553aa0d7c932fad7aed7afb51dc982ee5"}, + {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b670c2faa92124b7397b42303e4d8eb64a4cd0b7a77e35a9e865a55d61c57ef9"}, + {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a635589201b18510ff988161b7b573f50c6a48fae9cb567657920ca82022b37"}, + {file = "grpcio-1.57.0-cp39-cp39-win32.whl", hash = "sha256:d78d8b86fcdfa1e4c21f8896614b6cc7ee01a2a758ec0c4382d662f2a62cf766"}, + {file = "grpcio-1.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:20ec6fc4ad47d1b6e12deec5045ec3cd5402d9a1597f738263e98f490fe07056"}, + {file = "grpcio-1.57.0.tar.gz", hash = "sha256:4b089f7ad1eb00a104078bab8015b0ed0ebcb3b589e527ab009c53893fd4e613"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.57.0)"] [[package]] name = "grpcio-status" -version = "1.54.2" +version = "1.57.0" description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.54.2.tar.gz", hash = "sha256:3255cbec5b7c706caa3d4dd584606c080e6415e15631bb2f6215e2b70055836d"}, - {file = "grpcio_status-1.54.2-py3-none-any.whl", hash = "sha256:2a7cb4838225f1b53bd0448a3008c5b5837941e1f3a0b13fa38768f08a7b68c2"}, + {file = "grpcio-status-1.57.0.tar.gz", hash = "sha256:b098da99df1eebe58337f8f78e50df990273ccacc1226fddeb47c590e3df9e02"}, + {file = "grpcio_status-1.57.0-py3-none-any.whl", hash = "sha256:15d6af055914ebbc4ed17e55ebfb8e6bb17a45a57fea32e6af19978fb7844690"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.54.2" +grpcio = ">=1.57.0" protobuf = ">=4.21.6" [[package]] @@ -1335,13 +1358,13 @@ files = [ [[package]] name = "httpcore" -version = "0.17.2" +version = "0.17.3" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.7" files = [ - {file = "httpcore-0.17.2-py3-none-any.whl", hash = "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36"}, - {file = "httpcore-0.17.2.tar.gz", hash = "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af"}, + {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, + {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, ] [package.dependencies] @@ -1379,13 +1402,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "identify" -version = "2.5.24" +version = "2.5.26" description = "File identification library for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, - {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, + {file = "identify-2.5.26-py2.py3-none-any.whl", hash = "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54"}, + {file = "identify-2.5.26.tar.gz", hash = "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f"}, ] [package.extras] @@ -1404,13 +1427,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.0.1" +version = "6.8.0" description = "Read metadata from Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, - {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, ] [package.dependencies] @@ -1419,7 +1442,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +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" @@ -1487,21 +1510,21 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.0" description = "An autocompletion tool for Python that can be used for text editors." optional = true python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, + {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] @@ -1521,15 +1544,26 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] @@ -1571,13 +1605,13 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] name = "langchainplus-sdk" -version = "0.0.9" -description = "Client library to connect to the LangChainPlus LLM Tracing and Evaluation Platform." +version = "0.0.20" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchainplus_sdk-0.0.9-py3-none-any.whl", hash = "sha256:4fe1a60f28c93ae0e145dcd53e4dc5293374ed0a8518abcc51e201081809bf0b"}, - {file = "langchainplus_sdk-0.0.9.tar.gz", hash = "sha256:bbfdc54c64df5ca4334068ab2d7b89d3a894f313b1285939b4c4532fea62eeb7"}, + {file = "langchainplus_sdk-0.0.20-py3-none-any.whl", hash = "sha256:07a869d476755803aa04c4986ce78d00c2fe4ff584c0eaa57d7570c9664188db"}, + {file = "langchainplus_sdk-0.0.20.tar.gz", hash = "sha256:3d300e2e3290f68cc9d842c059f9458deba60e776c9e790309688cad1bfbb219"}, ] [package.dependencies] @@ -1646,38 +1680,24 @@ files = [ [[package]] name = "marshmallow" -version = "3.19.0" +version = "3.20.1" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, - {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, + {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, + {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] -[[package]] -name = "marshmallow-enum" -version = "1.5.1" -description = "Enum field for Marshmallow" -optional = false -python-versions = "*" -files = [ - {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, - {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, -] - -[package.dependencies] -marshmallow = ">=2.0.0" - [[package]] name = "matplotlib-inline" version = "0.1.6" @@ -1841,48 +1861,48 @@ files = [ [[package]] name = "mypy" -version = "1.3.0" +version = "1.5.1" description = "Optional static typing for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"}, - {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"}, - {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"}, - {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"}, - {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"}, - {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"}, - {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"}, - {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"}, - {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"}, - {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"}, - {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"}, - {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"}, - {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"}, - {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"}, - {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"}, - {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"}, - {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"}, - {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"}, - {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"}, - {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"}, - {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"}, - {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"}, - {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"}, - {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"}, - {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"}, - {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"}, + {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, + {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, + {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, + {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, + {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, + {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, + {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, + {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, + {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, + {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, + {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, + {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, + {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, + {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, + {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, + {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, + {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, + {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, + {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=3.10" +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] reports = ["lxml"] [[package]] @@ -1937,41 +1957,41 @@ setuptools = "*" [[package]] name = "numexpr" -version = "2.8.4" +version = "2.8.5" description = "Fast numerical expression evaluator for NumPy" optional = false python-versions = ">=3.7" files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, + {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, + {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, + {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, + {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, + {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, + {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, + {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, + {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, + {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, + {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, + {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, + {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, + {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, + {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, + {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, + {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, + {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, + {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, + {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, + {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, + {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, ] [package.dependencies] @@ -1979,49 +1999,49 @@ numpy = ">=1.13.3" [[package]] name = "numpy" -version = "1.24.3" +version = "1.24.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, ] [[package]] name = "nylas" -version = "5.14.0" +version = "5.14.1" description = "Python bindings for Nylas, the next-generation email platform." optional = true python-versions = "*" files = [ - {file = "nylas-5.14.0.tar.gz", hash = "sha256:f59c4db7628034d1a977168494dae2c3db183c0c460ed43afad10f0bd1370d47"}, + {file = "nylas-5.14.1.tar.gz", hash = "sha256:dfd83d957817a1e0be67c9c5ca677565cfe587d06120cbd08cb36bf89b3bb55f"}, ] [package.dependencies] @@ -2072,46 +2092,44 @@ pydantic = ">=1.8.2" [[package]] name = "opentelemetry-api" -version = "1.18.0" +version = "1.19.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.18.0-py3-none-any.whl", hash = "sha256:d05bcc94ec239fd76fd90d784c5e3ad081a8a1ac2ffc8a2c83a49ace052d1492"}, - {file = "opentelemetry_api-1.18.0.tar.gz", hash = "sha256:2bbf29739fcef268c419e3bf1735566c2e7f81026c14bcc78b62a0b97f8ecf2f"}, + {file = "opentelemetry_api-1.19.0-py3-none-any.whl", hash = "sha256:dcd2a0ad34b691964947e1d50f9e8c415c32827a1d87f0459a72deb9afdf5597"}, + {file = "opentelemetry_api-1.19.0.tar.gz", hash = "sha256:db374fb5bea00f3c7aa290f5d94cea50b659e6ea9343384c5f6c2bb5d5e8db65"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0.0,<6.1.0" -setuptools = ">=16.0" +importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-sdk" -version = "1.18.0" +version = "1.19.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.18.0-py3-none-any.whl", hash = "sha256:a097cc1e0db6ff33b4d250a9350dc17975d24a22aa667fca2866e60c51306723"}, - {file = "opentelemetry_sdk-1.18.0.tar.gz", hash = "sha256:cd3230930a2ab288b1df149d261e9cd2bd48dee54ad18465a777831cb6779e90"}, + {file = "opentelemetry_sdk-1.19.0-py3-none-any.whl", hash = "sha256:bb67ad676b1bc671766a40d7fc9d9563854c186fa11f0dc8fa2284e004bd4263"}, + {file = "opentelemetry_sdk-1.19.0.tar.gz", hash = "sha256:765928956262c7a7766eaba27127b543fb40ef710499cad075f261f52163a87f"}, ] [package.dependencies] -opentelemetry-api = "1.18.0" -opentelemetry-semantic-conventions = "0.39b0" -setuptools = ">=16.0" +opentelemetry-api = "1.19.0" +opentelemetry-semantic-conventions = "0.40b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.39b0" +version = "0.40b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.39b0-py3-none-any.whl", hash = "sha256:0dd7a9dc0dfde2335f643705bba8f7c44182c797bc208b7601f0b8e8211cfd5c"}, - {file = "opentelemetry_semantic_conventions-0.39b0.tar.gz", hash = "sha256:06a9f198574e0dab6ebc072b59d89092cf9f115638a8a02157586769b6b7a69a"}, + {file = "opentelemetry_semantic_conventions-0.40b0-py3-none-any.whl", hash = "sha256:7ebbaf86755a0948902e68637e3ae516c50222c30455e55af154ad3ffe283839"}, + {file = "opentelemetry_semantic_conventions-0.40b0.tar.gz", hash = "sha256:5a7a491873b15ab7c4907bbfd8737645cc87ca55a0a326c1755d1b928d8a0fae"}, ] [[package]] @@ -2142,13 +2160,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, ] [[package]] @@ -2178,28 +2196,28 @@ files = [ [[package]] name = "platformdirs" -version = "3.5.3" +version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.5.3-py3-none-any.whl", hash = "sha256:0ade98a4895e87dc51d47151f7d2ec290365a585151d97b4d8d6312ed6132fed"}, - {file = "platformdirs-3.5.3.tar.gz", hash = "sha256:e48fabd87db8f3a7df7150a4a5ea22c546ee8bc39bc2473244730d4b56d2cc4e"}, + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -2226,13 +2244,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prompt-toolkit" -version = "3.0.38" +version = "3.0.39" description = "Library for building powerful interactive command lines in Python" optional = true python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, ] [package.dependencies] @@ -2240,13 +2258,13 @@ wcwidth = "*" [[package]] name = "proto-plus" -version = "1.22.2" +version = "1.22.3" description = "Beautiful, Pythonic protocol buffers." optional = true python-versions = ">=3.6" files = [ - {file = "proto-plus-1.22.2.tar.gz", hash = "sha256:0e8cda3d5a634d9895b75c573c9352c16486cb75deb0e078b5fda34db4243165"}, - {file = "proto_plus-1.22.2-py3-none-any.whl", hash = "sha256:de34e52d6c9c6fcd704192f09767cb561bb4ee64e70eede20b0834d841f0be4d"}, + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, ] [package.dependencies] @@ -2257,24 +2275,24 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.23.2" +version = "4.24.1" description = "" optional = true python-versions = ">=3.7" files = [ - {file = "protobuf-4.23.2-cp310-abi3-win32.whl", hash = "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3"}, - {file = "protobuf-4.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a"}, - {file = "protobuf-4.23.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa"}, - {file = "protobuf-4.23.2-cp37-cp37m-win32.whl", hash = "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f"}, - {file = "protobuf-4.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea"}, - {file = "protobuf-4.23.2-cp38-cp38-win32.whl", hash = "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e"}, - {file = "protobuf-4.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511"}, - {file = "protobuf-4.23.2-cp39-cp39-win32.whl", hash = "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91"}, - {file = "protobuf-4.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f"}, - {file = "protobuf-4.23.2-py3-none-any.whl", hash = "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f"}, - {file = "protobuf-4.23.2.tar.gz", hash = "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7"}, + {file = "protobuf-4.24.1-cp310-abi3-win32.whl", hash = "sha256:d414199ca605eeb498adc4d2ba82aedc0379dca4a7c364ff9bc9a179aa28e71b"}, + {file = "protobuf-4.24.1-cp310-abi3-win_amd64.whl", hash = "sha256:5906c5e79ff50fe38b2d49d37db5874e3c8010826f2362f79996d83128a8ed9b"}, + {file = "protobuf-4.24.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:970c701ee16788d74f3de20938520d7a0aebc7e4fff37096a48804c80d2908cf"}, + {file = "protobuf-4.24.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fc361148e902949dcb953bbcb148c99fe8f8854291ad01107e4120361849fd0e"}, + {file = "protobuf-4.24.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:5d32363d14aca6e5c9e9d5918ad8fb65b091b6df66740ae9de50ac3916055e43"}, + {file = "protobuf-4.24.1-cp37-cp37m-win32.whl", hash = "sha256:df015c47d6855b8efa0b9be706c70bf7f050a4d5ac6d37fb043fbd95157a0e25"}, + {file = "protobuf-4.24.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d4af4fd9e9418e819be30f8df2a16e72fbad546a7576ac7f3653be92a6966d30"}, + {file = "protobuf-4.24.1-cp38-cp38-win32.whl", hash = "sha256:302e8752c760549ed4c7a508abc86b25d46553c81989343782809e1a062a2ef9"}, + {file = "protobuf-4.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:06437f0d4bb0d5f29e3d392aba69600188d4be5ad1e0a3370e581a9bf75a3081"}, + {file = "protobuf-4.24.1-cp39-cp39-win32.whl", hash = "sha256:0b2b224e9541fe9f046dd7317d05f08769c332b7e4c54d93c7f0f372dedb0b1a"}, + {file = "protobuf-4.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd39b9094a4cc003a1f911b847ab379f89059f478c0b611ba1215053e295132e"}, + {file = "protobuf-4.24.1-py3-none-any.whl", hash = "sha256:55dd644adc27d2a624339332755fe077c7f26971045b469ebb9732a69ce1f2ca"}, + {file = "protobuf-4.24.1.tar.gz", hash = "sha256:44837a5ed9c9418ad5d502f89f28ba102e9cd172b6668bc813f21716f9273348"}, ] [[package]] @@ -2340,47 +2358,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.9" +version = "1.10.12" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca"}, - {file = "pydantic-1.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896"}, - {file = "pydantic-1.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f"}, - {file = "pydantic-1.10.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4"}, - {file = "pydantic-1.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0"}, - {file = "pydantic-1.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d"}, - {file = "pydantic-1.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91"}, - {file = "pydantic-1.10.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8"}, - {file = "pydantic-1.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f"}, - {file = "pydantic-1.10.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a"}, - {file = "pydantic-1.10.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60"}, - {file = "pydantic-1.10.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf"}, - {file = "pydantic-1.10.9-cp37-cp37m-win_amd64.whl", hash = "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82"}, - {file = "pydantic-1.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766"}, - {file = "pydantic-1.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572"}, - {file = "pydantic-1.10.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e"}, - {file = "pydantic-1.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298"}, - {file = "pydantic-1.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60"}, - {file = "pydantic-1.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a"}, - {file = "pydantic-1.10.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4"}, - {file = "pydantic-1.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1"}, - {file = "pydantic-1.10.9-py3-none-any.whl", hash = "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305"}, - {file = "pydantic-1.10.9.tar.gz", hash = "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, + {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, + {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, + {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, + {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, + {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, + {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, + {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, + {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, + {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, + {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, + {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, + {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, + {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, + {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, + {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, + {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, + {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, + {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, + {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, + {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, + {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, + {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, ] [package.dependencies] @@ -2414,13 +2432,13 @@ files = [ [[package]] name = "pygments" -version = "2.15.1" +version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." optional = true python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, ] [package.extras] @@ -2428,13 +2446,13 @@ plugins = ["importlib-metadata"] [[package]] name = "pyjwt" -version = "2.7.0" +version = "2.8.0" description = "JSON Web Token implementation in Python" optional = true python-versions = ">=3.7" files = [ - {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, - {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, ] [package.dependencies] @@ -2448,13 +2466,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" -version = "7.3.2" +version = "7.4.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.3.2-py3-none-any.whl", hash = "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295"}, - {file = "pytest-7.3.2.tar.gz", hash = "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b"}, + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, ] [package.dependencies] @@ -2470,13 +2488,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-asyncio" -version = "0.21.0" +version = "0.21.1" description = "Pytest support for asyncio" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-asyncio-0.21.0.tar.gz", hash = "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b"}, - {file = "pytest_asyncio-0.21.0-py3-none-any.whl", hash = "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c"}, + {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, + {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, ] [package.dependencies] @@ -2490,7 +2508,7 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -optional = true +optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, @@ -2541,62 +2559,62 @@ files = [ [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] [[package]] name = "redis" -version = "4.5.5" +version = "4.6.0" description = "Python client for Redis database and key-value store" optional = true python-versions = ">=3.7" files = [ - {file = "redis-4.5.5-py3-none-any.whl", hash = "sha256:77929bc7f5dab9adf3acba2d3bb7d7658f1e0c2f1cafe7eb36434e751c471119"}, - {file = "redis-4.5.5.tar.gz", hash = "sha256:dc87a0bdef6c8bfe1ef1e1c40be7034390c2ae02d92dcd0c7ca1729443899880"}, + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, ] [package.dependencies] @@ -2608,99 +2626,99 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2023.6.3" +version = "2023.8.8" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.6" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, ] [[package]] @@ -2738,6 +2756,23 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "s3transfer" +version = "0.6.2" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, + {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + [[package]] name = "scipy" version = "1.10.1" @@ -2778,18 +2813,18 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "setuptools" -version = "67.8.0" +version = "68.1.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, + {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, + {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -2909,52 +2944,52 @@ whisper-api = ["openai"] [[package]] name = "sqlalchemy" -version = "2.0.16" +version = "2.0.20" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7641f6ed2682de84d77c4894cf2e43700f3cf7a729361d7f9cac98febf3d8614"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d3cbdb2f07fb0e4b897dc1df39166735e194fb946f28f26f4c9f9801c8b24f7"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08a791c75d6154d46914d1e23bd81d9455f2950ec1de81f2723848c593d2c8b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91eb8f89fcce8f709f8a4d65d265bc48a80264ee14c7c9e955f3222f19b4b39c"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc1dae11bd5167f9eb53b3ccad24a79813004612141e76de21cf4c028dc30b34"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b2801f85c5c0293aa710f8aa5262c707a83c1c203962ae5a22b4d9095e71aa9d"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win32.whl", hash = "sha256:c5e333b81fe10d14efebd4e9429b7bb865ed9463ca8bef07a7136dfa1fd4a37b"}, - {file = "SQLAlchemy-2.0.16-cp310-cp310-win_amd64.whl", hash = "sha256:f387b496a4c9474d8580195bb2660264a3f295a04d3a9d00f4fa15e9e597427e"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7be04dbe3470fe8dd332fdb48c979887c381ef6c635eddf2dec43d2766111be4"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2938edc512dd1fa48653e14c1655ab46144d4450f0e6b33da7acd8ba77fbfd7"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a2856e12cf5f54301ddf043bcbf0552561d61555e1bcf348b63f42b8e1eec2"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d320fde566b864adbc19abb40ecb80f4e25d6f084639969bb972d5cca16858"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e85e315725807c127ad8ba3d628fdb861cf9ebfb0e10c39a97c01e257cdd71b"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63ea36c08792a7a8a08958bc806ecff6b491386feeaf14607c3d9d2d9325e67f"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win32.whl", hash = "sha256:bdaf89dd82f4a0e1b8b5ffc9cdc0c9551be6175f7eee5af6a838e92ba2e57100"}, - {file = "SQLAlchemy-2.0.16-cp311-cp311-win_amd64.whl", hash = "sha256:5a934eff1a2882137be3384826f997db8441d43b61fda3094923e69fffe474be"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbcc51fdbc89fafe4f4fe66f59372a8be88ded04de34ef438ab04f980beb12d4"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff6496ad5e9dc8baeb93a151cc2f599d01e5f8928a2aaf0b09a06428fdbaf553"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6ef848e5afcd1bda3e9a843751f845c0ca888b61e669237680e913d84ec206"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3ef876615ff4b53e2033022195830ec4941a6e21068611f8d77de60203b90a98"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8544c6e62eacb77d5106e2055ef10f2407fc0dbd547e879f8745b2032eefd2bc"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win32.whl", hash = "sha256:2f3b6c31b915159b96b68372212fa77f69230b0a32acab40cf539d2823954f5a"}, - {file = "SQLAlchemy-2.0.16-cp37-cp37m-win_amd64.whl", hash = "sha256:d0c96592f54edd571e00ba6b1ed5df8263328ca1da9e78088c0ebc93c2e6562c"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a2e9f50a906d0b81292576a9fb458f8cace904c81a67088f4a2ca9ff2856f55d"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc97238fa44be86971270943a0c21c19ce18b8d1596919048e57912e8abc02cc"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0db6734cb5644c55d0262a813b764c6e2cda1e66e939a488b3d6298cdc7344c2"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131f0c894c6572cb1bdcf97c92d999d3128c4ff1ca13061296057072f61afe13"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f662cf69484c59f8a3435902c40dfc34d86050bdb15e23d437074ce9f153306b"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b72f4e4def50414164a1d899f2ce4e782a029fad0ed5585981d1611e8ae29a74"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win32.whl", hash = "sha256:0e4645b260cfe375a0603aa117f0a47680864cf37833129da870919e88b08d8f"}, - {file = "SQLAlchemy-2.0.16-cp38-cp38-win_amd64.whl", hash = "sha256:f409f35a0330ab0cb18ece736b86d8b8233c64f4461fcb10993f67afc0ac7e5a"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e19546924f0cf2ec930d1faf318b7365e5827276410a513340f31a2b423e96a4"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ce1fc3f64fd42d5f763d6b83651471f32920338a1ba107a3186211474861af57"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e2569dac4e3cb85365b91ab569d06a221e0e17e65ce59949d00c3958946282b"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f2035dea56ff1a429077e481496f813378beb02b823d2e3e7eb05bc1a7a8ca"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:81d867c1be5abd49f7e547c108391f371a9d980ba7ec34666c50d683f782b754"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2de1477af7f48c633b8ecb88245aedd811dca88e88aee9e9d787b388abe74c44"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win32.whl", hash = "sha256:5e8522b49e0e640287308b68f71cc338446bbe1c226c8f81743baa91b0246e92"}, - {file = "SQLAlchemy-2.0.16-cp39-cp39-win_amd64.whl", hash = "sha256:43e69c8c1cea0188b7094e22fb93ae1a1890aac748628b7e925024a206f75368"}, - {file = "SQLAlchemy-2.0.16-py3-none-any.whl", hash = "sha256:53081c6fce0d49bb36d05f12dc87e008c9b0df58a163b792c5fc4ac638925f98"}, - {file = "SQLAlchemy-2.0.16.tar.gz", hash = "sha256:1e2caba78e7d1f5003e88817b7a1754d4e58f4a8f956dc423bf8e304c568ab09"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"}, + {file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"}, + {file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"}, + {file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"}, + {file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"}, + {file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"}, + {file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"}, + {file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"}, ] [package.dependencies] @@ -2962,7 +2997,7 @@ greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or pl typing-extensions = ">=4.2.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] @@ -3024,13 +3059,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -3103,20 +3138,20 @@ files = [ [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -3138,13 +3173,13 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] [[package]] name = "twilio" -version = "8.2.2" +version = "8.5.0" description = "Twilio API client and TwiML generator" optional = true python-versions = ">=3.7.0" files = [ - {file = "twilio-8.2.2-py2.py3-none-any.whl", hash = "sha256:fa39d61757730a137d3a9c6ef84428fb3237616f21ff2b1c98116eee828d54e8"}, - {file = "twilio-8.2.2.tar.gz", hash = "sha256:6470a8bb6b1e240dd48c77f17e29fc1ee9041b75707bf437f880a585b6c722bc"}, + {file = "twilio-8.5.0-py2.py3-none-any.whl", hash = "sha256:a6fdea2252cb7a8a47b5750d58abe1888bba9777482bac8e9bc3be47970facc7"}, + {file = "twilio-8.5.0.tar.gz", hash = "sha256:f55da9b485f9070aef09836e56230d0e6fd83811d2e6668f20d9057dd3668143"}, ] [package.dependencies] @@ -3156,13 +3191,13 @@ requests = ">=2.0.0" [[package]] name = "types-pyopenssl" -version = "23.2.0.0" +version = "23.2.0.2" description = "Typing stubs for pyOpenSSL" optional = false python-versions = "*" files = [ - {file = "types-pyOpenSSL-23.2.0.0.tar.gz", hash = "sha256:43e307e8dfb3a7a8208a19874ca060305f460c529d4eaca8a2669ea89499f244"}, - {file = "types_pyOpenSSL-23.2.0.0-py3-none-any.whl", hash = "sha256:ba803a99440b0c2e9ab4e197084aeefc55bdfe8a580d367b2aa4210810a21240"}, + {file = "types-pyOpenSSL-23.2.0.2.tar.gz", hash = "sha256:6a010dac9ecd42b582d7dd2cc3e9e40486b79b3b64bb2fffba1474ff96af906d"}, + {file = "types_pyOpenSSL-23.2.0.2-py3-none-any.whl", hash = "sha256:19536aa3debfbe25a918cf0d898e9f5fbbe6f3594a429da7914bf331deb1b342"}, ] [package.dependencies] @@ -3170,13 +3205,13 @@ cryptography = ">=35.0.0" [[package]] name = "types-redis" -version = "4.5.5.2" +version = "4.6.0.4" description = "Typing stubs for redis" optional = false python-versions = "*" files = [ - {file = "types-redis-4.5.5.2.tar.gz", hash = "sha256:2fe82f374d9dddf007deaf23d81fddcfd9523d9522bf11523c5c43bc5b27099e"}, - {file = "types_redis-4.5.5.2-py3-none-any.whl", hash = "sha256:bf8692252038dbe03b007ca4fde87d3ae8e10610854a6858e3bf5d01721a7c4b"}, + {file = "types-redis-4.6.0.4.tar.gz", hash = "sha256:c475a9d3cf73dd696c3887d30644323fc56f5e00af96151035b3b5b52875c9b3"}, + {file = "types_redis-4.6.0.4-py3-none-any.whl", hash = "sha256:03a1e1659ae4d8f6543bc2b8b11e94b1ee53937f313b1dc6f67dc7bde7d38fe0"}, ] [package.dependencies] @@ -3185,24 +3220,24 @@ types-pyOpenSSL = "*" [[package]] name = "types-regex" -version = "2023.6.3.0" +version = "2023.8.8.0" description = "Typing stubs for regex" optional = false python-versions = "*" files = [ - {file = "types-regex-2023.6.3.0.tar.gz", hash = "sha256:5826da8557eb4af977b9df9d9b21cf68b10ec63d60454f1f92da7ad49284628b"}, - {file = "types_regex-2023.6.3.0-py3-none-any.whl", hash = "sha256:ff1a7ede4f449a4bbafd2070c16613b543bf0b070b29351b46af8daeb28fd116"}, + {file = "types-regex-2023.8.8.0.tar.gz", hash = "sha256:ec87fbb69802b7224d8067bf65048fbfa7bc061efde65cfe471471c0c4d561e0"}, + {file = "types_regex-2023.8.8.0-py3-none-any.whl", hash = "sha256:52cc3e7748292fc0157388166e23b6d7b661459ae9dda8cec3c6a85ead3b1f98"}, ] [[package]] name = "types-requests" -version = "2.31.0.1" +version = "2.31.0.2" description = "Typing stubs for requests" optional = false python-versions = "*" files = [ - {file = "types-requests-2.31.0.1.tar.gz", hash = "sha256:3de667cffa123ce698591de0ad7db034a5317457a596eb0b4944e5a9d9e8d1ac"}, - {file = "types_requests-2.31.0.1-py3-none-any.whl", hash = "sha256:afb06ef8f25ba83d59a1d424bd7a5a939082f94b94e90ab5e6116bd2559deaa3"}, + {file = "types-requests-2.31.0.2.tar.gz", hash = "sha256:6aa3f7faf0ea52d728bb18c0a0d1522d9bfd8c72d26ff6f61bfc3d06a411cf40"}, + {file = "types_requests-2.31.0.2-py3-none-any.whl", hash = "sha256:56d181c85b5925cbc59f4489a57e72a8b2166f18273fd8ba7b6fe0c0b986f12a"}, ] [package.dependencies] @@ -3210,24 +3245,24 @@ types-urllib3 = "*" [[package]] name = "types-urllib3" -version = "1.26.25.13" +version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" files = [ - {file = "types-urllib3-1.26.25.13.tar.gz", hash = "sha256:3300538c9dc11dad32eae4827ac313f5d986b8b21494801f1bf97a1ac6c03ae5"}, - {file = "types_urllib3-1.26.25.13-py3-none-any.whl", hash = "sha256:5dbd1d2bef14efee43f5318b5d36d805a489f6600252bb53626d4bfafd95e27c"}, + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, ] [[package]] name = "typing-extensions" -version = "4.6.3" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] [[package]] @@ -3291,38 +3326,38 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "virtualenv" -version = "20.23.1" +version = "20.24.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, - {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, + {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, + {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, ] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.12,<4" -platformdirs = ">=3.5.1,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" [package.extras] docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "vonage" -version = "3.5.2" +version = "3.8.0" description = "Vonage Server SDK for Python" optional = true python-versions = ">=3.7" files = [ - {file = "vonage-3.5.2-py2.py3-none-any.whl", hash = "sha256:7f230520b3b4a70ce50f424dd1c6f5a1d6c230c26e8142c68edadd3482681271"}, - {file = "vonage-3.5.2.tar.gz", hash = "sha256:49d4eb6c1467fcbfc81e8362c52e5c741c30918de9f801840489d80b843bffc6"}, + {file = "vonage-3.8.0-py2.py3-none-any.whl", hash = "sha256:05f8029479a0330f506b5cf5fa4bc773215d5ba4a2edef91c62868e631465888"}, + {file = "vonage-3.8.0.tar.gz", hash = "sha256:b793a0fa86d973ab2f2007d82a2844485f2658daa278512894b4197eb41099e7"}, ] [package.dependencies] Deprecated = "*" -pydantic = ">=1.10.2" +pydantic = ">=1.10,<2.dev0" pytz = ">=2018.5" requests = ">=2.4.2" vonage-jwt = ">=1.0.0" @@ -3618,18 +3653,18 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [extras] actions = ["nylas"] @@ -3642,4 +3677,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "0443b0a62b1438e51309c8d1606460f20dc2e51c6702fecc03a7b171a919b185" +content-hash = "60ee4d2395b06922d238968909c009a25d709310e7eee66ddc4f5fb16463e74e" diff --git a/pyproject.toml b/pyproject.toml index 1ba947a2a6..8236c0e5eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,7 @@ aiohttp = "^3.8.4" langchain = "^0.0.198" google-cloud-aiplatform = {version = "^1.26.0", optional = true} miniaudio = "^1.59" +boto3 = "^1.28.28" [tool.poetry.group.lint.dependencies] diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index 6641ba110f..c5b09de7e9 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -25,6 +25,7 @@ class SynthesizerType(str, Enum): COQUI_TTS = "synthesizer_coqui_tts" COQUI = "synthesizer_coqui" BARK = "synthesizer_bark" + POLLY = "synthesizer_polly" class SentimentConfig(BaseModel): @@ -196,3 +197,14 @@ class StreamElementsSynthesizerConfig( class BarkSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.BARK.value): preload_kwargs: Dict[str, Any] = {} generate_kwargs: Dict[str, Any] = {} + + +DEFAULT_POLLY_LANGUAGE_CODE = "en-US" +DEFAULT_POLLY_VOICE_ID = "Matthew" +DEFAULT_POLLY_SAMPLING_RATE = 16000 + + +class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value): + language_code: str = DEFAULT_POLLY_LANGUAGE_CODE + voice_id: str = DEFAULT_POLLY_VOICE_ID + sampling_rate: int = DEFAULT_POLLY_SAMPLING_RATE diff --git a/vocode/streaming/synthesizer/__init__.py b/vocode/streaming/synthesizer/__init__.py index c4e720a6dd..167c785743 100644 --- a/vocode/streaming/synthesizer/__init__.py +++ b/vocode/streaming/synthesizer/__init__.py @@ -8,6 +8,7 @@ from vocode.streaming.synthesizer.gtts_synthesizer import GTTSSynthesizer from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer from vocode.streaming.synthesizer.rime_synthesizer import RimeSynthesizer +from vocode.streaming.synthesizer.polly_synthesizer import PollySynthesizer from vocode.streaming.synthesizer.stream_elements_synthesizer import ( StreamElementsSynthesizer, ) diff --git a/vocode/streaming/synthesizer/factory.py b/vocode/streaming/synthesizer/factory.py index 3c19c40ed3..24a4f3f9d5 100644 --- a/vocode/streaming/synthesizer/factory.py +++ b/vocode/streaming/synthesizer/factory.py @@ -11,6 +11,7 @@ GoogleSynthesizerConfig, PlayHtSynthesizerConfig, RimeSynthesizerConfig, + PollySynthesizerConfig, StreamElementsSynthesizerConfig, SynthesizerConfig, SynthesizerType, @@ -21,6 +22,7 @@ from vocode.streaming.synthesizer.gtts_synthesizer import GTTSSynthesizer from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer from vocode.streaming.synthesizer.rime_synthesizer import RimeSynthesizer +from vocode.streaming.synthesizer.polly_synthesizer import PollySynthesizer from vocode.streaming.synthesizer.stream_elements_synthesizer import ( StreamElementsSynthesizer, ) @@ -66,5 +68,9 @@ def create_synthesizer( return CoquiTTSSynthesizer( synthesizer_config, logger=logger, aiohttp_session=aiohttp_session ) + elif isinstance(synthesizer_config, PollySynthesizerConfig): + return PollySynthesizer( + synthesizer_config, logger=logger, aiohttp_session=aiohttp_session + ) else: raise Exception("Invalid synthesizer config") diff --git a/vocode/streaming/synthesizer/polly_synthesizer.py b/vocode/streaming/synthesizer/polly_synthesizer.py new file mode 100644 index 0000000000..94ab09c43c --- /dev/null +++ b/vocode/streaming/synthesizer/polly_synthesizer.py @@ -0,0 +1,141 @@ +import asyncio +from concurrent.futures import ThreadPoolExecutor +import logging +from typing import Any, Optional +import aiohttp +import json + +from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.synthesizer.base_synthesizer import ( + BaseSynthesizer, + SynthesisResult, + tracer, + encode_as_wav, +) +from vocode.streaming.models.synthesizer import PollySynthesizerConfig, SynthesizerType +from vocode.streaming.utils.mp3_helper import decode_mp3 + +import boto3 + + +class PollySynthesizer(BaseSynthesizer[PollySynthesizerConfig]): + def __init__( + self, + synthesizer_config: PollySynthesizerConfig, + logger: Optional[logging.Logger] = None, + aiohttp_session: Optional[aiohttp.ClientSession] = None, + ): + super().__init__(synthesizer_config, aiohttp_session) + + client = boto3.client("polly") + + # AWS Polly supports sampling rate of 8k and 16k for pcm output + if synthesizer_config.sampling_rate not in [8000, 16000]: + raise Exception( + "Sampling rate not supported by AWS Polly", + synthesizer_config.sampling_rate, + ) + + self.sampling_rate = synthesizer_config.sampling_rate + self.client = client + self.language_code = synthesizer_config.language_code + self.voice_id = synthesizer_config.voice_id + self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) + + def synthesize(self, message: str) -> Any: + # Perform the text-to-speech request on the text input with the selected + # voice parameters and audio file type + return self.client.synthesize_speech( + Text=message, + LanguageCode=self.language_code, + TextType="text", + OutputFormat="pcm", + VoiceId=self.voice_id, + SampleRate=str(self.sampling_rate), + ) + + def get_speech_marks(self, message: str) -> Any: + return self.client.synthesize_speech( + Text=message, + LanguageCode=self.language_code, + TextType="text", + OutputFormat="json", + VoiceId=self.voice_id, + SampleRate=str(self.sampling_rate), + SpeechMarkTypes=["word"], + ) + + # given the number of seconds the message was allowed to go until, where did we get in the message? + def get_message_up_to( + self, + message: str, + seconds: int, + word_events, + ) -> str: + for event in word_events: + # time field is in ms + if event["time"] > seconds * 1000: + return message[: event["start"]] + return message + + async def create_speech( + self, + message: BaseMessage, + chunk_size: int, + bot_sentiment: Optional[BotSentiment] = None, + ) -> SynthesisResult: + create_speech_span = tracer.start_span( + f"synthesizer.{SynthesizerType.POLLY.value.split('_', 1)[-1]}.create_total", + ) + audio_response = await asyncio.get_event_loop().run_in_executor( + self.thread_pool_executor, self.synthesize, message.text + ) + audio_stream = audio_response.get("AudioStream") + + speech_marks_response = await asyncio.get_event_loop().run_in_executor( + self.thread_pool_executor, self.get_speech_marks, message.text + ) + word_events = [ + json.loads(v) + for v in speech_marks_response.get("AudioStream").read().decode().split() + if v + ] + + create_speech_span.end() + + async def chunk_generator(audio_data_stream, chunk_transform=lambda x: x): + audio_buffer = await asyncio.get_event_loop().run_in_executor( + self.thread_pool_executor, + lambda: audio_stream.read(chunk_size), + ) + if len(audio_buffer) != chunk_size: + yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer), True) + return + else: + yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer), False) + while True: + audio_buffer = audio_stream.read(chunk_size) + if len(audio_buffer) != chunk_size: + yield SynthesisResult.ChunkResult( + chunk_transform(audio_buffer[: len(audio_buffer)]), True + ) + break + yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer), False) + + if self.synthesizer_config.should_encode_as_wav: + output_generator = chunk_generator( + audio_stream, + lambda chunk: encode_as_wav(chunk, self.synthesizer_config), + ) + else: + output_generator = chunk_generator(audio_stream) + + return SynthesisResult( + output_generator, + lambda seconds: self.get_message_up_to( + message.text, + seconds, + word_events, + ), + ) diff --git a/vocode/turn_based/synthesizer/__init__.py b/vocode/turn_based/synthesizer/__init__.py index f73871975e..3353d6dd0f 100644 --- a/vocode/turn_based/synthesizer/__init__.py +++ b/vocode/turn_based/synthesizer/__init__.py @@ -8,6 +8,7 @@ from vocode.turn_based.synthesizer.gtts_synthesizer import GTTSSynthesizer from vocode.turn_based.synthesizer.play_ht_synthesizer import PlayHtSynthesizer from vocode.turn_based.synthesizer.rime_synthesizer import RimeSynthesizer +from vocode.turn_based.synthesizer.polly_synthesizer import PollySynthesizer from vocode.turn_based.synthesizer.stream_elements_synthesizer import ( StreamElementsSynthesizer, ) diff --git a/vocode/turn_based/synthesizer/polly_synthesizer.py b/vocode/turn_based/synthesizer/polly_synthesizer.py new file mode 100644 index 0000000000..e8ad71de5d --- /dev/null +++ b/vocode/turn_based/synthesizer/polly_synthesizer.py @@ -0,0 +1,47 @@ +import io +from pydub import AudioSegment +from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer + +import boto3 + +DEFAULT_SAMPLING_RATE = 16000 +DEFAULT_LANGUAGE_CODE = "en-US" +DEFAULT_VOICE_ID = "Matthew" + + +class PollySynthesizer(BaseSynthesizer): + def __init__( + self, + sampling_rate: int = DEFAULT_SAMPLING_RATE, + language_code: str = DEFAULT_LANGUAGE_CODE, + voice_id: str = DEFAULT_VOICE_ID, + ): + client = boto3.client("polly") + + # AWS Polly supports sampling rate of 8k and 16k for pcm output + if sampling_rate not in [8000, 16000]: + raise Exception( + "Sampling rate not supported by AWS Polly", + sampling_rate, + ) + + self.sampling_rate = sampling_rate + self.client = client + self.language_code = language_code + self.voice_id = voice_id + + def synthesize(self, message: str) -> AudioSegment: + response = self.client.synthesize_speech( + Text=message, + LanguageCode=self.language_code, + TextType="text", + OutputFormat="pcm", + VoiceId=self.voice_id, + ) + + return AudioSegment( + response.get("AudioStream").read(), + sample_width=2, + frame_rate=self.sampling_rate, + channels=1, + ) From c5a39b821328fc99a175615fc265beda84ca9fb1 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 22 Aug 2023 11:47:34 -0700 Subject: [PATCH 006/148] merge staging docs (#367) * checkpoint. routes first pass done, schemas not working * progress * restore some changes * change outline * update hosted quickstart * create docs for getting number (#293) * update code snippets for getting-number * finish using-actions * Add configuring numbers page * updates * nit * retrieve call data draft * use new openapi schema * updates * polish * schemas tab * Add vector db docs * vector db updates * update voices and add multilingual docs * context injection docs * remove environment params * adds dashboard link --------- Co-authored-by: Kian Co-authored-by: Hayden Housen Co-authored-by: zaptrem --- docs/agents.mdx | 10 + docs/api-reference/actions/create-action.mdx | 3 + docs/api-reference/actions/get-action.mdx | 3 + docs/api-reference/actions/list-actions.mdx | 3 + docs/api-reference/actions/update-action.mdx | 3 + docs/api-reference/agents/create-agent.mdx | 3 + docs/api-reference/agents/get-agent.mdx | 3 + docs/api-reference/agents/list-agents.mdx | 3 + docs/api-reference/agents/update-agent.mdx | 3 + docs/api-reference/calls/create-call.mdx | 3 + docs/api-reference/calls/end-call.mdx | 3 + docs/api-reference/calls/get-call.mdx | 3 + docs/api-reference/calls/list-calls.mdx | 3 + docs/api-reference/numbers/buy-number.mdx | 3 + docs/api-reference/numbers/cancel-number.mdx | 3 + docs/api-reference/numbers/get-number.mdx | 3 + docs/api-reference/numbers/list-numbers.mdx | 3 + docs/api-reference/numbers/update-number.mdx | 3 + docs/api-reference/schemas/action-config.mdx | 3 + docs/api-reference/schemas/action-type.mdx | 3 + docs/api-reference/usage/get-usage.mdx | 3 + docs/api-reference/voices/create-voice.mdx | 3 + docs/api-reference/voices/get-voice.mdx | 3 + docs/api-reference/voices/list-voices.mdx | 3 + docs/api-reference/voices/update-voice.mdx | 3 + .../api-reference/webhooks/create-webhook.mdx | 3 + docs/api-reference/webhooks/get-webhook.mdx | 3 + docs/api-reference/webhooks/list-webhooks.mdx | 3 + .../api-reference/webhooks/update-webhook.mdx | 3 + docs/call-object.mdx | 4 + docs/configuring-number.mdx | 190 ++ docs/getting-number.mdx | 38 + docs/hosted-quickstart.mdx | 85 + docs/how-to-use-it.mdx | 2 +- docs/inbound-calls.mdx | 8 + docs/injecting-context.mdx | 57 + docs/mint.json | 140 +- docs/multilingual.mdx | 41 + docs/open-source-quickstart.mdx | 39 + docs/{ => open-source}/action-agents.mdx | 0 docs/{ => open-source}/agent-factory.mdx | 0 docs/{ => open-source}/agent-reference.mdx | 0 docs/{ => open-source}/agent.mdx | 0 .../create-your-own-agent.mdx | 0 docs/{ => open-source}/events-manager.mdx | 0 docs/{ => open-source}/langchain-agent.mdx | 0 docs/{ => open-source}/language-support.mdx | 0 docs/{ => open-source}/local-conversation.mdx | 0 docs/{ => open-source}/playground.mdx | 0 docs/{ => open-source}/python-quickstart.mdx | 0 docs/{ => open-source}/react-quickstart.mdx | 0 .../synthesizer-reference.mdx | 0 docs/{ => open-source}/synthesizer.mdx | 0 docs/{ => open-source}/telephony.mdx | 0 docs/{ => open-source}/tracing.mdx | 0 .../transcriber-reference.mdx | 0 docs/{ => open-source}/transcriber.mdx | 0 .../turn-based-conversation.mdx | 0 docs/{ => open-source}/using-synthesizers.mdx | 0 docs/{ => open-source}/using-transcribers.mdx | 0 docs/openapi.json | 1671 +++++++++++++++++ docs/outbound-calls.mdx | 4 + docs/retrieve-call-data.mdx | 109 ++ docs/setting-up-webhook.mdx | 59 + docs/using-actions.mdx | 194 ++ docs/vectordb.mdx | 115 ++ docs/webhooks.mdx | 4 + docs/welcome.mdx | 66 +- 68 files changed, 2853 insertions(+), 67 deletions(-) create mode 100644 docs/agents.mdx create mode 100644 docs/api-reference/actions/create-action.mdx create mode 100644 docs/api-reference/actions/get-action.mdx create mode 100644 docs/api-reference/actions/list-actions.mdx create mode 100644 docs/api-reference/actions/update-action.mdx create mode 100644 docs/api-reference/agents/create-agent.mdx create mode 100644 docs/api-reference/agents/get-agent.mdx create mode 100644 docs/api-reference/agents/list-agents.mdx create mode 100644 docs/api-reference/agents/update-agent.mdx create mode 100644 docs/api-reference/calls/create-call.mdx create mode 100644 docs/api-reference/calls/end-call.mdx create mode 100644 docs/api-reference/calls/get-call.mdx create mode 100644 docs/api-reference/calls/list-calls.mdx create mode 100644 docs/api-reference/numbers/buy-number.mdx create mode 100644 docs/api-reference/numbers/cancel-number.mdx create mode 100644 docs/api-reference/numbers/get-number.mdx create mode 100644 docs/api-reference/numbers/list-numbers.mdx create mode 100644 docs/api-reference/numbers/update-number.mdx create mode 100644 docs/api-reference/schemas/action-config.mdx create mode 100644 docs/api-reference/schemas/action-type.mdx create mode 100644 docs/api-reference/usage/get-usage.mdx create mode 100644 docs/api-reference/voices/create-voice.mdx create mode 100644 docs/api-reference/voices/get-voice.mdx create mode 100644 docs/api-reference/voices/list-voices.mdx create mode 100644 docs/api-reference/voices/update-voice.mdx create mode 100644 docs/api-reference/webhooks/create-webhook.mdx create mode 100644 docs/api-reference/webhooks/get-webhook.mdx create mode 100644 docs/api-reference/webhooks/list-webhooks.mdx create mode 100644 docs/api-reference/webhooks/update-webhook.mdx create mode 100644 docs/call-object.mdx create mode 100644 docs/configuring-number.mdx create mode 100644 docs/getting-number.mdx create mode 100644 docs/hosted-quickstart.mdx create mode 100644 docs/inbound-calls.mdx create mode 100644 docs/injecting-context.mdx create mode 100644 docs/multilingual.mdx create mode 100644 docs/open-source-quickstart.mdx rename docs/{ => open-source}/action-agents.mdx (100%) rename docs/{ => open-source}/agent-factory.mdx (100%) rename docs/{ => open-source}/agent-reference.mdx (100%) rename docs/{ => open-source}/agent.mdx (100%) rename docs/{ => open-source}/create-your-own-agent.mdx (100%) rename docs/{ => open-source}/events-manager.mdx (100%) rename docs/{ => open-source}/langchain-agent.mdx (100%) rename docs/{ => open-source}/language-support.mdx (100%) rename docs/{ => open-source}/local-conversation.mdx (100%) rename docs/{ => open-source}/playground.mdx (100%) rename docs/{ => open-source}/python-quickstart.mdx (100%) rename docs/{ => open-source}/react-quickstart.mdx (100%) rename docs/{ => open-source}/synthesizer-reference.mdx (100%) rename docs/{ => open-source}/synthesizer.mdx (100%) rename docs/{ => open-source}/telephony.mdx (100%) rename docs/{ => open-source}/tracing.mdx (100%) rename docs/{ => open-source}/transcriber-reference.mdx (100%) rename docs/{ => open-source}/transcriber.mdx (100%) rename docs/{ => open-source}/turn-based-conversation.mdx (100%) rename docs/{ => open-source}/using-synthesizers.mdx (100%) rename docs/{ => open-source}/using-transcribers.mdx (100%) create mode 100644 docs/openapi.json create mode 100644 docs/outbound-calls.mdx create mode 100644 docs/retrieve-call-data.mdx create mode 100644 docs/setting-up-webhook.mdx create mode 100644 docs/using-actions.mdx create mode 100644 docs/vectordb.mdx create mode 100644 docs/webhooks.mdx diff --git a/docs/agents.mdx b/docs/agents.mdx new file mode 100644 index 0000000000..d2e168e479 --- /dev/null +++ b/docs/agents.mdx @@ -0,0 +1,10 @@ +--- +title: "Agents" +description: "🚧 Under construction" +--- + +# What are agents + +# How to configure an agent + +# API Schema diff --git a/docs/api-reference/actions/create-action.mdx b/docs/api-reference/actions/create-action.mdx new file mode 100644 index 0000000000..7004502fb8 --- /dev/null +++ b/docs/api-reference/actions/create-action.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/actions/create +--- \ No newline at end of file diff --git a/docs/api-reference/actions/get-action.mdx b/docs/api-reference/actions/get-action.mdx new file mode 100644 index 0000000000..2d91b642c9 --- /dev/null +++ b/docs/api-reference/actions/get-action.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/actions/ +--- \ No newline at end of file diff --git a/docs/api-reference/actions/list-actions.mdx b/docs/api-reference/actions/list-actions.mdx new file mode 100644 index 0000000000..2787766819 --- /dev/null +++ b/docs/api-reference/actions/list-actions.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/actions/list +--- \ No newline at end of file diff --git a/docs/api-reference/actions/update-action.mdx b/docs/api-reference/actions/update-action.mdx new file mode 100644 index 0000000000..4f6c699418 --- /dev/null +++ b/docs/api-reference/actions/update-action.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/actions/update +--- \ No newline at end of file diff --git a/docs/api-reference/agents/create-agent.mdx b/docs/api-reference/agents/create-agent.mdx new file mode 100644 index 0000000000..ca3436ce00 --- /dev/null +++ b/docs/api-reference/agents/create-agent.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/agents/create +--- \ No newline at end of file diff --git a/docs/api-reference/agents/get-agent.mdx b/docs/api-reference/agents/get-agent.mdx new file mode 100644 index 0000000000..1c44beed8f --- /dev/null +++ b/docs/api-reference/agents/get-agent.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/agents/ +--- \ No newline at end of file diff --git a/docs/api-reference/agents/list-agents.mdx b/docs/api-reference/agents/list-agents.mdx new file mode 100644 index 0000000000..7dfc2ed372 --- /dev/null +++ b/docs/api-reference/agents/list-agents.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/agents/list +--- \ No newline at end of file diff --git a/docs/api-reference/agents/update-agent.mdx b/docs/api-reference/agents/update-agent.mdx new file mode 100644 index 0000000000..7aae67bd3f --- /dev/null +++ b/docs/api-reference/agents/update-agent.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/agents/update +--- \ No newline at end of file diff --git a/docs/api-reference/calls/create-call.mdx b/docs/api-reference/calls/create-call.mdx new file mode 100644 index 0000000000..fe6c67a847 --- /dev/null +++ b/docs/api-reference/calls/create-call.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/calls/create +--- \ No newline at end of file diff --git a/docs/api-reference/calls/end-call.mdx b/docs/api-reference/calls/end-call.mdx new file mode 100644 index 0000000000..ab86c29499 --- /dev/null +++ b/docs/api-reference/calls/end-call.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/calls/end +--- \ No newline at end of file diff --git a/docs/api-reference/calls/get-call.mdx b/docs/api-reference/calls/get-call.mdx new file mode 100644 index 0000000000..fd1771b73f --- /dev/null +++ b/docs/api-reference/calls/get-call.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/calls/ +--- \ No newline at end of file diff --git a/docs/api-reference/calls/list-calls.mdx b/docs/api-reference/calls/list-calls.mdx new file mode 100644 index 0000000000..e61154204e --- /dev/null +++ b/docs/api-reference/calls/list-calls.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/calls/list +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/buy-number.mdx b/docs/api-reference/numbers/buy-number.mdx new file mode 100644 index 0000000000..3ebd7b4b14 --- /dev/null +++ b/docs/api-reference/numbers/buy-number.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/numbers/buy +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/cancel-number.mdx b/docs/api-reference/numbers/cancel-number.mdx new file mode 100644 index 0000000000..01a1ac41db --- /dev/null +++ b/docs/api-reference/numbers/cancel-number.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/numbers/cancel +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/get-number.mdx b/docs/api-reference/numbers/get-number.mdx new file mode 100644 index 0000000000..32fa9b91cc --- /dev/null +++ b/docs/api-reference/numbers/get-number.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/numbers/ +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/list-numbers.mdx b/docs/api-reference/numbers/list-numbers.mdx new file mode 100644 index 0000000000..d349670491 --- /dev/null +++ b/docs/api-reference/numbers/list-numbers.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/numbers/list +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/update-number.mdx b/docs/api-reference/numbers/update-number.mdx new file mode 100644 index 0000000000..6b2ff2b462 --- /dev/null +++ b/docs/api-reference/numbers/update-number.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/numbers/update +--- \ No newline at end of file diff --git a/docs/api-reference/schemas/action-config.mdx b/docs/api-reference/schemas/action-config.mdx new file mode 100644 index 0000000000..526132b73b --- /dev/null +++ b/docs/api-reference/schemas/action-config.mdx @@ -0,0 +1,3 @@ +--- +openapi-schema: ActionConfig +--- diff --git a/docs/api-reference/schemas/action-type.mdx b/docs/api-reference/schemas/action-type.mdx new file mode 100644 index 0000000000..d2394e7c29 --- /dev/null +++ b/docs/api-reference/schemas/action-type.mdx @@ -0,0 +1,3 @@ +--- +openapi-schema: ActionType +--- diff --git a/docs/api-reference/usage/get-usage.mdx b/docs/api-reference/usage/get-usage.mdx new file mode 100644 index 0000000000..0cab456124 --- /dev/null +++ b/docs/api-reference/usage/get-usage.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/usage/ +--- \ No newline at end of file diff --git a/docs/api-reference/voices/create-voice.mdx b/docs/api-reference/voices/create-voice.mdx new file mode 100644 index 0000000000..366f68ab1a --- /dev/null +++ b/docs/api-reference/voices/create-voice.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/voices/create +--- \ No newline at end of file diff --git a/docs/api-reference/voices/get-voice.mdx b/docs/api-reference/voices/get-voice.mdx new file mode 100644 index 0000000000..5ca0e16892 --- /dev/null +++ b/docs/api-reference/voices/get-voice.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/voices/ +--- \ No newline at end of file diff --git a/docs/api-reference/voices/list-voices.mdx b/docs/api-reference/voices/list-voices.mdx new file mode 100644 index 0000000000..a34e94606d --- /dev/null +++ b/docs/api-reference/voices/list-voices.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/voices/list +--- \ No newline at end of file diff --git a/docs/api-reference/voices/update-voice.mdx b/docs/api-reference/voices/update-voice.mdx new file mode 100644 index 0000000000..2d9c0a2d8d --- /dev/null +++ b/docs/api-reference/voices/update-voice.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/voices/update +--- \ No newline at end of file diff --git a/docs/api-reference/webhooks/create-webhook.mdx b/docs/api-reference/webhooks/create-webhook.mdx new file mode 100644 index 0000000000..b3292bef72 --- /dev/null +++ b/docs/api-reference/webhooks/create-webhook.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/webhooks/create +--- \ No newline at end of file diff --git a/docs/api-reference/webhooks/get-webhook.mdx b/docs/api-reference/webhooks/get-webhook.mdx new file mode 100644 index 0000000000..64b8b79f4d --- /dev/null +++ b/docs/api-reference/webhooks/get-webhook.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/webhooks/ +--- \ No newline at end of file diff --git a/docs/api-reference/webhooks/list-webhooks.mdx b/docs/api-reference/webhooks/list-webhooks.mdx new file mode 100644 index 0000000000..f02210b5a4 --- /dev/null +++ b/docs/api-reference/webhooks/list-webhooks.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/webhooks/list +--- \ No newline at end of file diff --git a/docs/api-reference/webhooks/update-webhook.mdx b/docs/api-reference/webhooks/update-webhook.mdx new file mode 100644 index 0000000000..0481ac2c55 --- /dev/null +++ b/docs/api-reference/webhooks/update-webhook.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/webhooks/update +--- \ No newline at end of file diff --git a/docs/call-object.mdx b/docs/call-object.mdx new file mode 100644 index 0000000000..592a0eba75 --- /dev/null +++ b/docs/call-object.mdx @@ -0,0 +1,4 @@ +--- +title: "Call Object" +description: "🚧 Under construction" +--- diff --git a/docs/configuring-number.mdx b/docs/configuring-number.mdx new file mode 100644 index 0000000000..61361a9b57 --- /dev/null +++ b/docs/configuring-number.mdx @@ -0,0 +1,190 @@ +--- +title: "Configuring your number" +description: "Learn how to configure your phone number with an agent." +--- + +# Configuring Numbers + +Once you have purchased a number, you can configure it with an inbound agent to set its prompt, voice, and actions. + +## Pick your Number + +First, list your numbers and pick the number you want to configure. + + + +```python Python +numbers = vocode_client.numbers.list_numbers() +``` + +```javascript TypeScript +const numbers = await vocode.numbers.listNumbers(); +``` + + + +## Changing the Prompt + +All phone numbers come with the default agent configuration. Let's change the +prompt so the AI responds like Yoda. + + + +```python Python +from vocode import AgentUpdateParams + +yoda_prompt = "I want you to act as Yoda. Respond as Yoda would." +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(prompt=yoda_prompt) +) +``` + +```javascript TypeScript +const yoda_prompt = "I want you to act as Yoda. Respond as Yoda would."; +const number = await vocode.numbers.updateNumber({ + phoneNumber: "YOUR_NUMBER", + inboundAgent: { prompt: yoda_prompt }, +}); +``` + + + +## Changing the Voice + +Our prompt has been updated. Now let's use a voice provided by other API providers. + +### Rime + + + +```python Python +from vocode import RimeVoiceParams, VoiceType + +rime_voice = RimeVoiceParams( + type=VoiceType.VOICE_RIME, + speaker="RIME_SPEAKER", +) +voice = vocode_client.voices.create_voice(request=rime_voice) +``` + +```javascript TypeScript +import { VoiceType } from "@vocode/vocode-api/api"; + +const rimeVoice = { + type: VoiceType.VoiceRime, + voiceId: "RIME_SPEAKER", +}; +const number = await vocode.voices.createVoice(rimeVoice); +``` + + + +### Play.ht + + + +```python Python +from vocode import PlayHtVoiceParams, VoiceType + +play_ht_voice = PlayHtVoiceParams( + type=VoiceType.VOICE_PLAY_HT, + voice_id="PLAY_HT_VOICE_ID", + api_user_id="PLAY_HT_USER_ID", + api_key="PLAY_HT_API_KEY", +) +voice = vocode_client.voices.create_voice(request=play_ht_voice) +``` + +```javascript TypeScript +import { VoiceType } from "@vocode/vocode-api/api"; + +const playHtVoice = { + type: VoiceType.VoicePlayHt, + voiceId: "PLAY_HT_VOICE_ID", + apiUserId: "PLAY_HT_USER_ID", + apiKey: "PLAY_HT_API_KEY, +}; +const number = await vocode.voices.createVoice(playHtVoice); +``` + + + +### ElevenLabs + +We will use the `rachel` voice from ElevenLabs. Instead of updating our existing agent directly, +we'll create a new voice config and set the agent to use it. + + + +```python Python +from vocode import ElevenLabsVoiceParams, VoiceType + +elevenlabs_voice = ElevenLabsVoiceParams( + type=VoiceType.VOICE_ELEVEN_LABS, + voice_id="ELEVEN_LABS_VOICE_ID", + api_key="ELEVEN_LABS_API_KEY", +) +voice = vocode_client.voices.create_voice(request=elevenlabs_voice) +``` + +```javascript TypeScript +import { VoiceType } from "@vocode/vocode-api/api"; + +const elevenlabsVoice = { + type: VoiceType.VoiceElevenLabs, + voiceId: "ELEVEN_LABS_VOICE_ID", + apiKey: "ELEVEN_LABS_API_KEY", +}; +const number = await vocode.voices.createVoice(elevenlabsVoice); +``` + + + +Now, we have our `voice_id` and can update our agent to use it. + + + +```python Python +from vocode import AgentUpdateParams + +agent = vocode_client.agents.update_agent( + id="AGENT_ID", + request=AgentUpdateParams(voice="VOICE_ID"), +) +``` + +```javascript TypeScript +const agent = await vocode.agents.updateAgent({ + id: "AGENT_ID", + body: { voice: "VOICE_ID" }, +}); +console.log(agent); +``` + + + +## Adding an Initial Message + +The initial message will be spoken as soon as the call starts before the user says anything. Let's make our agent say "Hello, I am Yoda" when the call starts. + + + +```python Python +from vocode import AgentUpdateParams + +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(initial_message="Hello, I am Yoda.") +) + +``` + +```javascript TypeScript +import { VocodeClient } from "@vocode/vocode-api"; + +const number = await vocode.numbers.updateNumber({ + phoneNumber: "YOUR_NUMBER", + inboundAgent: { initialMessage: "Hello, I am Yoda." }, +}); +``` + + diff --git a/docs/getting-number.mdx b/docs/getting-number.mdx new file mode 100644 index 0000000000..dce7c09b67 --- /dev/null +++ b/docs/getting-number.mdx @@ -0,0 +1,38 @@ +--- +title: "Getting a number" +--- + +If you're on the Free plan, you'll have to head to the [dashboard](https://app.vocode.dev) to buy numbers. The Developer and +Enterprise plans both come with numbers included in the subscription. For more info, see [Pricing](https://vocode.dev/pricing). + + + +```python Python +phone_number = vocode_client.numbers.buy_number() +``` + +```typescript TypeScript +const phoneNumber = await vocode.numbers.buyNumber(); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/numbers/buy \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' +``` + + + +You'll get a response that looks like: + +```json +{ + "id": "***", + "user_id": "***", + "number": "11234567890", + "inbound_agent": {...} +} +``` + +Your phone number is now active! Call the phone number and have a conversation with your AI. diff --git a/docs/hosted-quickstart.mdx b/docs/hosted-quickstart.mdx new file mode 100644 index 0000000000..016fde2a0c --- /dev/null +++ b/docs/hosted-quickstart.mdx @@ -0,0 +1,85 @@ +--- +title: "Hosted Quickstart" +description: "Deploy AI to phone calls via API" +--- + +# Introduction + +The Vocode hosted service allows you to automate inbound and outbound phone calls +via our API and SDKs. You can configure agents to answer phone calls (inbound) or make +phone calls on your behalf (outbound). + +The hosted API is built to be scalable and production ready. Vocode provides guardrails +to make sure agents perform the intended goals reliably and metrics to analyze performance. + +# Getting started + +To get started with Vocode, you can start by installing either of our Python or Node SDKs, or +hitting the API directly. + +### Python + +Install the `vocode-api` package using a package manager. + + +```bash poetry +poetry add vocode-api +``` + +```bash pip +pip install vocode-api +``` + + + +Initialize the Vocode client like so: + +```python +from vocode.client import Vocode + +vocode_client = Vocode( + token="YOUR_API_KEY" +) + +list_numbers_response = vocode_client.numbers.list_numbers() + +print(list_numbers_response) +``` + +### Node + +Install the `vocode-api` package using a package manager. + + +```bash npm +npm install --save @vocode/vocode-api +``` + +```bash yarn +yarn add @vocode/vocode-api +``` + + + +Initialize the Vocode client like so: + +```typescript +import { VocodeClient } from "@vocode/vocode-api"; + +const vocode = new VocodeClient({ + token: "YOUR_API_KEY", +}); + +vocode.numbers.listNumbers().then((numbers) => { + console.log("My numbers:", numbers); +}); +``` + +### API Reference + +If you'd prefer to hit our API directly, take a look at our [API Reference](/api-reference). + +# Hosted Walkthrough + +Once you have Vocode installed, we suggest going through the [Hosted Walkthrough](/getting-number) which will +show you how to start interacting with the API. diff --git a/docs/how-to-use-it.mdx b/docs/how-to-use-it.mdx index 7eb692829f..faf6912c3e 100644 --- a/docs/how-to-use-it.mdx +++ b/docs/how-to-use-it.mdx @@ -1,6 +1,6 @@ --- title: "How to use it" -description: "The different ways to use the Vocode." +description: "The different ways to use Vocode." --- ## Understanding our libraries diff --git a/docs/inbound-calls.mdx b/docs/inbound-calls.mdx new file mode 100644 index 0000000000..c13b581bf4 --- /dev/null +++ b/docs/inbound-calls.mdx @@ -0,0 +1,8 @@ +--- +title: "Inbound Calls" +description: "🚧 Under construction" +--- + +# Buying a number + +# Configuring a number diff --git a/docs/injecting-context.mdx b/docs/injecting-context.mdx new file mode 100644 index 0000000000..8ae811d8c4 --- /dev/null +++ b/docs/injecting-context.mdx @@ -0,0 +1,57 @@ +--- +title: "[Beta] Injecting context" +description: "Add context to inbound calls" +--- + +When a call comes in, some applications may want to inject context (eg the caller's first name, if +the number is recognized). In order to support injecting context, the Vocode API allows prompts +to be templated. When an inbound call comes in, the template variables can then be filled in +at runtime. + +# How it works + +At a high level, context injection works like this: + +- set your Vocode prompt to include template values +- include a `context_endpoint` parameter to your bot +- when an inbound call comes in, Vocode will query the context endpoint provided with + the caller phone number +- the queried information from the endpoint is then filled into the prompt template + +# Context injection example + +In order to have your bot use injected variables, the prompt must include template variables. Let's set up +our prompt to accept a user's first name and link it to our context endpoint. + +```python +from vocode import AgentUpdateParams + +name_prompt = "You are talking to ${name}" +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", + inbound_agent=AgentUpdateParams(prompt=name_prompt), + context_endpoint="YOUR_CONTEXT_URL" +) +``` + +Now, let's set up a simple context endpoint that will return the user's first name: + +```python +from fastapi import FastAPI + +app = FastAPI() + +@app.get("/my-context-endpoint") +def endpoint(request: Request): + if req.body.phone_number == "123": + return {"name": "Kian"} + elif req.body.phone_number == "456": + return {"name": "Ajay"} + else: + return {} +``` + +Now, when either Kian or Ajay call the bot – the prompt will reflect the name of the person +the bot is talking to! + +Note: This feature is experimental... improvements and proper authentication coming. diff --git a/docs/mint.json b/docs/mint.json index 3aa92dcd0f..52f85392da 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -20,6 +20,16 @@ "url": "https://github.com/vocodedev/vocode-python" }, "anchors": [ + { + "name": "API Reference", + "icon": "rectangle-terminal", + "url": "api-reference" + }, + { + "name": "Open Source", + "icon": "leaf", + "url": "open-source" + }, { "name": "Community", "icon": "discord", @@ -39,50 +49,124 @@ "navigation": [ { "group": "Getting Started", + "pages": ["welcome", "hosted-quickstart", "open-source-quickstart"] + }, + { + "group": "Vocode 101", + "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] + }, + { + "group": "Guides", "pages": [ - "welcome" + "open-source/python-quickstart", + "open-source/telephony", + "open-source/create-your-own-agent", + "open-source/langchain-agent", + "open-source/action-agents", + "open-source/local-conversation", + "open-source/events-manager", + "open-source/using-synthesizers", + "open-source/using-transcribers", + "open-source/react-quickstart", + "open-source/playground", + "open-source/turn-based-conversation", + "open-source/language-support", + "open-source/tracing", + "open-source/agent-factory" ] }, { - "group": "Vocode 101", + "group": "Python", "pages": [ - "what-is-vocode", - "how-it-works", - "how-to-use-it" + "open-source/transcriber-reference", + "open-source/agent-reference", + "open-source/synthesizer-reference" ] }, { - "group": "Guides", + "group": "Numbers", "pages": [ - "python-quickstart", - "telephony", - "create-your-own-agent", - "langchain-agent", - "action-agents", - "local-conversation", - "events-manager", - "using-synthesizers", - "using-transcribers", - "react-quickstart", - "playground", - "turn-based-conversation", - "language-support", - "tracing", - "agent-factory" + "api-reference/numbers/list-numbers", + "api-reference/numbers/get-number", + "api-reference/numbers/buy-number", + "api-reference/numbers/update-number", + "api-reference/numbers/cancel-number" ] }, { - "group": "Python", + "group": "Calls", + "pages": [ + "api-reference/calls/list-calls", + "api-reference/calls/get-call", + "api-reference/calls/end-call", + "api-reference/calls/create-call" + ] + }, + { + "group": "Usage", + "pages": ["api-reference/usage/get-usage"] + }, + { + "group": "Actions", "pages": [ - "transcriber-reference", - "agent-reference", - "synthesizer-reference" + "api-reference/actions/get-action", + "api-reference/actions/list-actions", + "api-reference/actions/create-action", + "api-reference/actions/update-action" + ] + }, + { + "group": "Agents", + "pages": [ + "api-reference/agents/get-agent", + "api-reference/agents/list-agents", + "api-reference/agents/create-agent", + "api-reference/agents/update-agent" + ] + }, + { + "group": "Voices", + "pages": [ + "api-reference/voices/get-voice", + "api-reference/voices/list-voices", + "api-reference/voices/create-voice", + "api-reference/voices/update-voice" + ] + }, + { + "group": "Webhooks", + "pages": [ + "api-reference/webhooks/get-webhook", + "api-reference/webhooks/list-webhooks", + "api-reference/webhooks/create-webhook", + "api-reference/webhooks/update-webhook" + ] + }, + { + "group": "Schemas", + "pages": ["api-reference/schemas/action-type"] + }, + { + "group": "Hosted Walkthrough", + "pages": [ + "getting-number", + "configuring-number", + "retrieve-call-data", + "setting-up-webhook", + "using-actions", + "vectordb", + "multilingual", + "injecting-context" ] } ], + "api": { + "playground": { + "mode": "simple" + } + }, "footerSocials": { "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" - }, - "backgroundImage": "images/background-image.png" -} \ No newline at end of file + } +} diff --git a/docs/multilingual.mdx b/docs/multilingual.mdx new file mode 100644 index 0000000000..ef1e6fb472 --- /dev/null +++ b/docs/multilingual.mdx @@ -0,0 +1,41 @@ +--- +title: "[Beta] Multilingual bots" +description: "How to make bots speak different languages" +--- + +Vocode bots speak English by default but they can be configured to speak and understand +different languages. This feature is in beta and is currently being worked on. As of right now, +this feature works best with ElevenLabs multilingual voices. + +# Supported Languages + +Right now, our supported languages include: + +- English +- Spanish +- German + +with plans to support more in the future. If you have any particular requests, please email support@vocode.dev. + +# Set agent language + + + +```python Python +from vocode import AgentUpdateParams + +language = "es" # ["en", "es", "de"] +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(language=language) +) +``` + +```javascript TypeScript +const language = "es"; // ["en", "es", "de"] +const number = await vocode.numbers.updateNumber({ + phoneNumber: "YOUR_NUMBER", + inboundAgent: { language: language }, +}); +``` + + diff --git a/docs/open-source-quickstart.mdx b/docs/open-source-quickstart.mdx new file mode 100644 index 0000000000..d253cfe532 --- /dev/null +++ b/docs/open-source-quickstart.mdx @@ -0,0 +1,39 @@ +--- +title: "Open Source Quickstart" +description: "How to get Vocode up and running on your own machine" +--- + +## Start Developing + + + + Quickly get up and running with Vocode by following our Python quick start + guide. + + + +### Replit Templates + + + + Spin up a phone number with ChatGPT on the other end. + + + Create a website that you can talk to. + + + Use Vocode as a tool to call someone in the real world. + + diff --git a/docs/action-agents.mdx b/docs/open-source/action-agents.mdx similarity index 100% rename from docs/action-agents.mdx rename to docs/open-source/action-agents.mdx diff --git a/docs/agent-factory.mdx b/docs/open-source/agent-factory.mdx similarity index 100% rename from docs/agent-factory.mdx rename to docs/open-source/agent-factory.mdx diff --git a/docs/agent-reference.mdx b/docs/open-source/agent-reference.mdx similarity index 100% rename from docs/agent-reference.mdx rename to docs/open-source/agent-reference.mdx diff --git a/docs/agent.mdx b/docs/open-source/agent.mdx similarity index 100% rename from docs/agent.mdx rename to docs/open-source/agent.mdx diff --git a/docs/create-your-own-agent.mdx b/docs/open-source/create-your-own-agent.mdx similarity index 100% rename from docs/create-your-own-agent.mdx rename to docs/open-source/create-your-own-agent.mdx diff --git a/docs/events-manager.mdx b/docs/open-source/events-manager.mdx similarity index 100% rename from docs/events-manager.mdx rename to docs/open-source/events-manager.mdx diff --git a/docs/langchain-agent.mdx b/docs/open-source/langchain-agent.mdx similarity index 100% rename from docs/langchain-agent.mdx rename to docs/open-source/langchain-agent.mdx diff --git a/docs/language-support.mdx b/docs/open-source/language-support.mdx similarity index 100% rename from docs/language-support.mdx rename to docs/open-source/language-support.mdx diff --git a/docs/local-conversation.mdx b/docs/open-source/local-conversation.mdx similarity index 100% rename from docs/local-conversation.mdx rename to docs/open-source/local-conversation.mdx diff --git a/docs/playground.mdx b/docs/open-source/playground.mdx similarity index 100% rename from docs/playground.mdx rename to docs/open-source/playground.mdx diff --git a/docs/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx similarity index 100% rename from docs/python-quickstart.mdx rename to docs/open-source/python-quickstart.mdx diff --git a/docs/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx similarity index 100% rename from docs/react-quickstart.mdx rename to docs/open-source/react-quickstart.mdx diff --git a/docs/synthesizer-reference.mdx b/docs/open-source/synthesizer-reference.mdx similarity index 100% rename from docs/synthesizer-reference.mdx rename to docs/open-source/synthesizer-reference.mdx diff --git a/docs/synthesizer.mdx b/docs/open-source/synthesizer.mdx similarity index 100% rename from docs/synthesizer.mdx rename to docs/open-source/synthesizer.mdx diff --git a/docs/telephony.mdx b/docs/open-source/telephony.mdx similarity index 100% rename from docs/telephony.mdx rename to docs/open-source/telephony.mdx diff --git a/docs/tracing.mdx b/docs/open-source/tracing.mdx similarity index 100% rename from docs/tracing.mdx rename to docs/open-source/tracing.mdx diff --git a/docs/transcriber-reference.mdx b/docs/open-source/transcriber-reference.mdx similarity index 100% rename from docs/transcriber-reference.mdx rename to docs/open-source/transcriber-reference.mdx diff --git a/docs/transcriber.mdx b/docs/open-source/transcriber.mdx similarity index 100% rename from docs/transcriber.mdx rename to docs/open-source/transcriber.mdx diff --git a/docs/turn-based-conversation.mdx b/docs/open-source/turn-based-conversation.mdx similarity index 100% rename from docs/turn-based-conversation.mdx rename to docs/open-source/turn-based-conversation.mdx diff --git a/docs/using-synthesizers.mdx b/docs/open-source/using-synthesizers.mdx similarity index 100% rename from docs/using-synthesizers.mdx rename to docs/open-source/using-synthesizers.mdx diff --git a/docs/using-transcribers.mdx b/docs/open-source/using-transcribers.mdx similarity index 100% rename from docs/using-transcribers.mdx rename to docs/open-source/using-transcribers.mdx diff --git a/docs/openapi.json b/docs/openapi.json new file mode 100644 index 0000000000..4a2b4e4761 --- /dev/null +++ b/docs/openapi.json @@ -0,0 +1,1671 @@ +{ + "openapi": "3.0.2", + "info": { + "title": "Vocode Hosted API", + "description": "\n Vocode's Hosted API helps you automate phone calls in minutes. 🚀\n\n ## Numbers\n\n You can buy phone lines and place agents on them.\n\n ## Calls\n\n You can start, end, and get information about calls.\n ", + "termsOfService": "http://example.com/terms/", + "contact": { "name": "Support", "email": "support@vocode.dev" }, + "version": "1.0.0" + }, + "servers": [ + { + "url": "https://api.vocode.dev", + "description": "Production environment" + }, + { + "url": "https://staging.vocode.dev", + "description": "Staging environment" + } + ], + "paths": { + "/v1/numbers/list": { + "get": { + "tags": ["numbers"], + "summary": "List Numbers", + "operationId": "list_numbers", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Numbers V1 Numbers List Get", + "type": "array", + "items": { + "$ref": "#/components/schemas/NormalizedPhoneNumber" + } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/numbers/": { + "get": { + "tags": ["numbers"], + "summary": "Get Number", + "operationId": "get_number", + "parameters": [ + { + "required": true, + "schema": { "title": "Phone Number", "type": "string" }, + "name": "phone_number", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PhoneNumber" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/numbers/buy": { + "post": { + "tags": ["numbers"], + "summary": "Buy Number", + "operationId": "buy_number", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PhoneNumber" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/numbers/update": { + "post": { + "tags": ["numbers"], + "summary": "Update Number", + "operationId": "update_number", + "parameters": [ + { + "required": true, + "schema": { "title": "Phone Number", "type": "string" }, + "name": "phone_number", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UpdateNumberRequest" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PhoneNumber" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/numbers/cancel": { + "post": { + "tags": ["numbers"], + "summary": "Cancel Number", + "operationId": "cancel_number", + "parameters": [ + { + "required": true, + "schema": { "title": "Phone Number", "type": "string" }, + "name": "phone_number", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PhoneNumber" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/calls/list": { + "get": { + "tags": ["calls"], + "summary": "List Calls", + "operationId": "list_calls", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Calls V1 Calls List Get", + "type": "array", + "items": { "$ref": "#/components/schemas/NormalizedCall" } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/calls/": { + "get": { + "tags": ["calls"], + "summary": "Get Call", + "operationId": "get_call", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Call" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/calls/end": { + "post": { + "tags": ["calls"], + "summary": "End Call", + "operationId": "end_call", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Call" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/calls/create": { + "post": { + "tags": ["calls"], + "summary": "Create Call", + "operationId": "create_call", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/CreateCallRequest" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Call" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/calls/recording": { + "get": { + "tags": ["calls"], + "summary": "Recording", + "operationId": "recording", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/usage/": { + "get": { + "tags": ["usage"], + "summary": "Get Usage", + "operationId": "get_usage", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Usage" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/actions/": { + "get": { + "tags": ["actions"], + "summary": "Get Action", + "operationId": "get_action", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Get Action V1 Actions Get", + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/actions/list": { + "get": { + "tags": ["actions"], + "summary": "List Actions", + "operationId": "list_actions", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Actions V1 Actions List Get", + "type": "array", + "items": { + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ] + } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/actions/create": { + "post": { + "tags": ["actions"], + "summary": "Create Action", + "operationId": "create_action", + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "Params", + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallActionParams" }, + { + "$ref": "#/components/schemas/EndConversationActionParams" + }, + { "$ref": "#/components/schemas/DTMFActionParams" } + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Create Action V1 Actions Create Post", + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/actions/update": { + "post": { + "tags": ["actions"], + "summary": "Update Action", + "operationId": "update_action", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "Update Params", + "anyOf": [ + { + "$ref": "#/components/schemas/TransferCallActionUpdateParams" + }, + { + "$ref": "#/components/schemas/EndConversationActionUpdateParams" + }, + { "$ref": "#/components/schemas/DTMFActionUpdateParams" } + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Update Action V1 Actions Update Post", + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/agents/": { + "get": { + "tags": ["agents"], + "summary": "Get Agent", + "operationId": "get_agent", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Agent" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/agents/list": { + "get": { + "tags": ["agents"], + "summary": "List Agents", + "operationId": "list_agents", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Agents V1 Agents List Get", + "type": "array", + "items": { "$ref": "#/components/schemas/NormalizedAgent" } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/agents/create": { + "post": { + "tags": ["agents"], + "summary": "Create Agent", + "operationId": "create_agent", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AgentParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Agent" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/agents/update": { + "post": { + "tags": ["agents"], + "summary": "Update Agent", + "operationId": "update_agent", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AgentUpdateParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Agent" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/voices/": { + "get": { + "tags": ["voices"], + "summary": "Get Voice", + "operationId": "get_voice", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Get Voice V1 Voices Get", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/voices/list": { + "get": { + "tags": ["voices"], + "summary": "List Voices", + "operationId": "list_voices", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Voices V1 Voices List Get", + "type": "array", + "items": { + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" } + ] + } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/voices/create": { + "post": { + "tags": ["voices"], + "summary": "Create Voice", + "operationId": "create_voice", + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "Params", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoiceParams" }, + { "$ref": "#/components/schemas/RimeVoiceParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceParams" } + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Create Voice V1 Voices Create Post", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/voices/update": { + "post": { + "tags": ["voices"], + "summary": "Update Voice", + "operationId": "update_voice", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "title": "Update Params", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, + { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" } + ] + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response Update Voice V1 Voices Update Post", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" } + ] + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/webhooks/": { + "get": { + "tags": ["webhooks"], + "summary": "Get Webhook", + "operationId": "get_webhook", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Webhook" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/webhooks/list": { + "get": { + "tags": ["webhooks"], + "summary": "List Webhooks", + "operationId": "list_webhooks", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response List Webhooks V1 Webhooks List Get", + "type": "array", + "items": { "$ref": "#/components/schemas/Webhook" } + } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/webhooks/create": { + "post": { + "tags": ["webhooks"], + "summary": "Create Webhook", + "operationId": "create_webhook", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WebhookParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Webhook" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/webhooks/update": { + "post": { + "tags": ["webhooks"], + "summary": "Update Webhook", + "operationId": "update_webhook", + "parameters": [ + { + "required": true, + "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/WebhookUpdateParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Webhook" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + } + }, + "components": { + "schemas": { + "ActionType": { + "title": "ActionType", + "enum": [ + "action_end_conversation", + "action_dtmf", + "action_transfer_call" + ], + "type": "string", + "description": "An enumeration." + }, + "Agent": { + "title": "Agent", + "required": ["id", "user_id", "prompt", "actions", "voice"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "prompt": { "title": "Prompt", "type": "string" }, + "actions": { + "title": "Actions", + "type": "array", + "items": { + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ] + } + }, + "voice": { + "title": "Voice", + "anyOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" } + ] + }, + "initial_message": { "title": "Initial Message", "type": "string" }, + "webhook": { "$ref": "#/components/schemas/Webhook" } + } + }, + "AgentParams": { + "title": "AgentParams", + "required": ["prompt", "voice"], + "type": "object", + "properties": { + "prompt": { "title": "Prompt", "type": "string" }, + "actions": { + "title": "Actions", + "type": "array", + "items": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/TransferCallActionParams" }, + { "$ref": "#/components/schemas/EndConversationActionParams" }, + { "$ref": "#/components/schemas/DTMFActionParams" } + ] + }, + "default": [] + }, + "voice": { + "title": "Voice", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/AzureVoiceParams" }, + { "$ref": "#/components/schemas/RimeVoiceParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceParams" } + ] + }, + "initial_message": { "title": "Initial Message", "type": "string" }, + "webhook": { + "title": "Webhook", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/WebhookParams" } + ] + } + } + }, + "AgentUpdateParams": { + "title": "AgentUpdateParams", + "type": "object", + "properties": { + "prompt": { + "title": "Prompt", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "actions": { + "title": "Actions", + "anyOf": [ + { + "type": "array", + "items": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { + "$ref": "#/components/schemas/TransferCallActionUpdateParams" + }, + { + "$ref": "#/components/schemas/EndConversationActionUpdateParams" + }, + { "$ref": "#/components/schemas/DTMFActionUpdateParams" } + ] + } + }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "voice": { + "title": "Voice", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, + { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "initial_message": { + "title": "Initial Message", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "webhook": { + "title": "Webhook", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/WebhookUpdateParams" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "AzureVoice": { + "title": "AzureVoice", + "required": ["id", "user_id", "voice_name"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], + "default": "voice_azure" + }, + "voice_name": { "title": "Voice Name", "type": "string" }, + "pitch": { "title": "Pitch", "type": "integer", "default": 0 }, + "rate": { "title": "Rate", "type": "integer", "default": 15 } + } + }, + "AzureVoiceParams": { + "title": "AzureVoiceParams", + "required": ["type", "voice_name"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "voice_name": { "title": "Voice Name", "type": "string" }, + "pitch": { "title": "Pitch", "type": "integer", "default": 0 }, + "rate": { "title": "Rate", "type": "integer", "default": 15 } + } + }, + "AzureVoiceUpdateParams": { + "title": "AzureVoiceUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "voice_name": { + "title": "Voice Name", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "pitch": { + "title": "Pitch", + "anyOf": [ + { "type": "integer" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "rate": { + "title": "Rate", + "anyOf": [ + { "type": "integer" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "Call": { + "title": "Call", + "required": ["id", "user_id", "to_number", "from_number", "agent"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "status": { + "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], + "default": "not_started" + }, + "error_message": { "title": "Error Message", "type": "string" }, + "recording_available": { + "title": "Recording Available", + "type": "boolean", + "default": false + }, + "transcript": { "title": "Transcript", "type": "string" }, + "to_number": { "title": "To Number", "type": "string" }, + "from_number": { "title": "From Number", "type": "string" }, + "agent": { "$ref": "#/components/schemas/Agent" } + } + }, + "CallStatus": { + "title": "CallStatus", + "enum": ["not_started", "in_progress", "error", "ended"], + "type": "string", + "description": "An enumeration." + }, + "CreateCallRequest": { + "title": "CreateCallRequest", + "required": ["from_number", "to_number", "agent"], + "type": "object", + "properties": { + "from_number": { "title": "From Number", "type": "string" }, + "to_number": { "title": "To Number", "type": "string" }, + "agent": { + "title": "Agent", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/AgentParams" } + ] + } + } + }, + "DTMFAction": { + "title": "DTMFAction", + "required": ["id", "user_id"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/ActionType" }], + "default": "action_dtmf" + }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + } + }, + "DTMFActionParams": { + "title": "DTMFActionParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + } + }, + "DTMFActionUpdateParams": { + "title": "DTMFActionUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { + "title": "Config", + "anyOf": [ + { "$ref": "#/components/schemas/EmptyActionConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "ElevenLabsVoice": { + "title": "ElevenLabsVoice", + "required": ["id", "user_id", "voice_id", "api_key"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], + "default": "voice_eleven_labs" + }, + "voice_id": { "title": "Voice Id", "type": "string" }, + "stability": { "title": "Stability", "type": "number" }, + "similarity_boost": { "title": "Similarity Boost", "type": "number" }, + "api_key": { "title": "Api Key", "type": "string" } + } + }, + "ElevenLabsVoiceParams": { + "title": "ElevenLabsVoiceParams", + "required": ["type", "voice_id", "api_key"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "voice_id": { "title": "Voice Id", "type": "string" }, + "stability": { "title": "Stability", "type": "number" }, + "similarity_boost": { "title": "Similarity Boost", "type": "number" }, + "api_key": { "title": "Api Key", "type": "string" } + } + }, + "ElevenLabsVoiceUpdateParams": { + "title": "ElevenLabsVoiceUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "voice_id": { + "title": "Voice Id", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "stability": { + "title": "Stability", + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "similarity_boost": { + "title": "Similarity Boost", + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "api_key": { + "title": "Api Key", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "EmptyActionConfig": { + "title": "EmptyActionConfig", + "type": "object", + "properties": {} + }, + "EndConversationAction": { + "title": "EndConversationAction", + "required": ["id", "user_id"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/ActionType" }], + "default": "action_end_conversation" + }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + } + }, + "EndConversationActionParams": { + "title": "EndConversationActionParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + } + }, + "EndConversationActionUpdateParams": { + "title": "EndConversationActionUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { + "title": "Config", + "anyOf": [ + { "$ref": "#/components/schemas/EmptyActionConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "EventType": { + "title": "EventType", + "enum": [ + "event_message", + "event_action", + "event_phone_call_connected", + "event_phone_call_ended", + "event_transcript", + "event_recording" + ], + "type": "string", + "description": "An enumeration." + }, + "HTTPMethod": { + "title": "HTTPMethod", + "enum": ["GET", "POST"], + "type": "string", + "description": "An enumeration." + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": { "$ref": "#/components/schemas/ValidationError" } + } + } + }, + "NormalizedAgent": { + "title": "NormalizedAgent", + "required": ["id", "user_id", "prompt", "actions", "voice"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "prompt": { "title": "Prompt", "type": "string" }, + "actions": { + "title": "Actions", + "type": "array", + "items": { "type": "string", "format": "uuid" } + }, + "voice": { "title": "Voice", "type": "string", "format": "uuid" }, + "initial_message": { "title": "Initial Message", "type": "string" }, + "webhook": { "title": "Webhook", "type": "string", "format": "uuid" } + } + }, + "NormalizedCall": { + "title": "NormalizedCall", + "required": ["id", "user_id", "to_number", "from_number", "agent"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "status": { + "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], + "default": "not_started" + }, + "error_message": { "title": "Error Message", "type": "string" }, + "recording_available": { + "title": "Recording Available", + "type": "boolean", + "default": false + }, + "transcript": { "title": "Transcript", "type": "string" }, + "to_number": { "title": "To Number", "type": "string" }, + "from_number": { "title": "From Number", "type": "string" }, + "agent": { "title": "Agent", "type": "string", "format": "uuid" } + } + }, + "NormalizedPhoneNumber": { + "title": "NormalizedPhoneNumber", + "required": ["id", "user_id", "inbound_agent", "number"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "active": { "title": "Active", "type": "boolean", "default": true }, + "inbound_agent": { + "title": "Inbound Agent", + "type": "string", + "format": "uuid" + }, + "number": { "title": "Number", "type": "string" } + } + }, + "PhoneNumber": { + "title": "PhoneNumber", + "required": ["id", "user_id", "inbound_agent", "number"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "active": { "title": "Active", "type": "boolean", "default": true }, + "inbound_agent": { "$ref": "#/components/schemas/Agent" }, + "number": { "title": "Number", "type": "string" } + } + }, + "PlanType": { + "title": "PlanType", + "enum": ["free", "developer", "enterprise"], + "type": "string", + "description": "An enumeration." + }, + "RimeVoice": { + "title": "RimeVoice", + "required": ["id", "user_id", "speaker"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], + "default": "voice_rime" + }, + "speaker": { "title": "Speaker", "type": "string" } + } + }, + "RimeVoiceParams": { + "title": "RimeVoiceParams", + "required": ["type", "speaker"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "speaker": { "title": "Speaker", "type": "string" } + } + }, + "RimeVoiceUpdateParams": { + "title": "RimeVoiceUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/VoiceType" }, + "speaker": { + "title": "Speaker", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "TransferCallAction": { + "title": "TransferCallAction", + "required": ["id", "user_id", "config"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "type": { + "allOf": [{ "$ref": "#/components/schemas/ActionType" }], + "default": "action_transfer_call" + }, + "config": { "$ref": "#/components/schemas/TransferCallConfig" } + } + }, + "TransferCallActionParams": { + "title": "TransferCallActionParams", + "required": ["type", "config"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { "$ref": "#/components/schemas/TransferCallConfig" } + } + }, + "TransferCallActionUpdateParams": { + "title": "TransferCallActionUpdateParams", + "required": ["type"], + "type": "object", + "properties": { + "type": { "$ref": "#/components/schemas/ActionType" }, + "config": { + "title": "Config", + "anyOf": [ + { "$ref": "#/components/schemas/TransferCallConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + }, + "TransferCallConfig": { + "title": "TransferCallConfig", + "required": ["phone_number"], + "type": "object", + "properties": { + "phone_number": { "title": "Phone Number", "type": "string" } + } + }, + "Undefined": { "title": "Undefined", "type": "object", "properties": {} }, + "UpdateNumberRequest": { + "title": "UpdateNumberRequest", + "required": ["inbound_agent"], + "type": "object", + "properties": { + "inbound_agent": { + "title": "Inbound Agent", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/AgentUpdateParams" } + ] + } + } + }, + "Usage": { + "title": "Usage", + "required": [ + "user_id", + "plan_type", + "monthly_usage_minutes", + "monthly_usage_limit_minutes" + ], + "type": "object", + "properties": { + "user_id": { "title": "User Id", "type": "string" }, + "plan_type": { "$ref": "#/components/schemas/PlanType" }, + "monthly_usage_minutes": { + "title": "Monthly Usage Minutes", + "type": "integer" + }, + "monthly_usage_limit_minutes": { + "title": "Monthly Usage Limit Minutes", + "type": "integer" + } + } + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] } + }, + "msg": { "title": "Message", "type": "string" }, + "type": { "title": "Error Type", "type": "string" } + } + }, + "VoiceType": { + "title": "VoiceType", + "enum": [ + "voice_base", + "voice_azure", + "voice_rime", + "voice_eleven_labs" + ], + "type": "string", + "description": "An enumeration." + }, + "Webhook": { + "title": "Webhook", + "required": ["id", "user_id", "subscriptions", "url"], + "type": "object", + "properties": { + "id": { "title": "Id", "type": "string", "format": "uuid" }, + "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "subscriptions": { + "type": "array", + "items": { "$ref": "#/components/schemas/EventType" } + }, + "url": { "title": "Url", "type": "string" }, + "method": { + "allOf": [{ "$ref": "#/components/schemas/HTTPMethod" }], + "default": "POST" + } + } + }, + "WebhookParams": { + "title": "WebhookParams", + "required": ["subscriptions", "url"], + "type": "object", + "properties": { + "subscriptions": { + "type": "array", + "items": { "$ref": "#/components/schemas/EventType" } + }, + "url": { "title": "Url", "type": "string" }, + "method": { + "allOf": [{ "$ref": "#/components/schemas/HTTPMethod" }], + "default": "POST" + } + } + }, + "WebhookUpdateParams": { + "title": "WebhookUpdateParams", + "type": "object", + "properties": { + "subscriptions": { + "title": "Subscriptions", + "anyOf": [ + { + "type": "array", + "items": { "$ref": "#/components/schemas/EventType" } + }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "url": { + "title": "Url", + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ] + }, + "method": { + "title": "Method", + "anyOf": [ + { "$ref": "#/components/schemas/HTTPMethod" }, + { "$ref": "#/components/schemas/Undefined" } + ] + } + } + } + }, + "securitySchemes": { "HTTPBearer": { "type": "http", "scheme": "bearer" } } + }, + "tags": [ + { "name": "numbers", "description": "Operations with phone numbers." }, + { "name": "calls", "description": "Manage calls." } + ] +} diff --git a/docs/outbound-calls.mdx b/docs/outbound-calls.mdx new file mode 100644 index 0000000000..58b62757d1 --- /dev/null +++ b/docs/outbound-calls.mdx @@ -0,0 +1,4 @@ +--- +title: "Outbound Calls" +description: "🚧 Under construction" +--- diff --git a/docs/retrieve-call-data.mdx b/docs/retrieve-call-data.mdx new file mode 100644 index 0000000000..b3b808def3 --- /dev/null +++ b/docs/retrieve-call-data.mdx @@ -0,0 +1,109 @@ +--- +title: "Retrieve Call Data" +description: "Get information on in-progress and completed calls" +--- + + + With the Vocode API in-progress and completed calls are accessible as Call + objects. + + +To list your call history: + + + +```python Python +calls = vocode_client.calls.list_calls() +``` + +```javascript TypeScript +const calls = await vocode.calls.listCalls(); +``` + +```curl cURL +curl --request GET \ + --url https://api.vocode.dev/v1/calls/list \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' +``` + + + +The resulting list of Call objects is structured like this: + +```json +[ + { + id: 'call_id', + userId: 'user_id', + toNumber: '123456789', + fromNumber: '123456789', + agent: { + id: 'agent_id', + userId: 'user_id', + prompt: 'The assistant is having a pleasant conversation about life.', + actions: [], + voice: [Object], + initialMessage: undefined, + webhook: undefined + }, + goal: undefined, + transcript: undefined, + recordingUrl: undefined, + status: 'ended', + errorMessage: undefined, + recordingAvailable: false + } +] +``` + +## Get a specific call + +If you have a call ID, you can get the call object for that call. + + + +```python Python +vocode_client.calls.get_call(id="CALL_ID") +``` + +```javascript TypeScript +const calls = await vocode.calls.getCall({ id: "CALL_ID" }); +``` + +```curl cURL +curl --request GET \ + --url https://api.vocode.dev/v1/calls/recording/ \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' +``` + + + +## Download a call recording + +If you enabled call recording, you can download the call recording file. + + +```python Python +vocode_client.calls.recording(id="CALL_ID") +``` + +```javascript TypeScript +const calls = await vocode.calls.listCalls(); +const recording = await vocode.calls.recording({ id: calls[0].id }); +``` + +```curl cURL +curl --request GET \ + --url https://api.vocode.dev/v1/calls/recording/ \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' +``` + + diff --git a/docs/setting-up-webhook.mdx b/docs/setting-up-webhook.mdx new file mode 100644 index 0000000000..ed57ba291c --- /dev/null +++ b/docs/setting-up-webhook.mdx @@ -0,0 +1,59 @@ +--- +title: "Setting up webhooks" +description: "Listen to events on your phone calls" +--- + +You can set up webhooks on agents so that you can +listen to events in realtime or for post-call automation. + +## Adding Webhooks + +To get data from the agent during a call, you can add a webhook and assign it to listen for specific events. +Let's send a POST request to "https://example.com" every time a call ends. + + + +```python Python +from vocode import AgentUpdateParams, EventType, HttpMethod, WebhookUpdateParams + +new_webhook = WebhookUpdateParams( + subscriptions=[EventType.EVENT_PHONE_CALL_ENDED], + url="https://example.com", + method=HttpMethod.POST, +) + +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", + inbound_agent=AgentUpdateParams( + webhook=new_webhook, + ), +) +``` + +```javascript TypeScript +import { EventType, HttpMethod } from "@vocode/vocode-api/api"; + +const number = await vocode.numbers.updateNumber({ + phoneNumber: "YOUR_NUMBER", + inboundAgent: { + webhook: { + subscriptions: [EventType.EventPhoneCallConnected], + url: "https://example.com", + method: HttpMethod.Post, + }, + }, +}); +``` + + + +## EventTypes + +The full list of `EventType` is listed here: + +- `EVENT_MESSAGE`: A message in the conversation. +- `EVENT_ACTION`: An action taken during the conversation. +- `EVENT_PHONE_CALL_CONNECTED`: Indicating the phone call has connected. +- `EVENT_PHONE_CALL_ENDED`: Indicating the phone call has ended. +- `EVENT_TRANSCRIPT`: The transcription of the entire conversation. +- `EVENT_RECORDING`: The recording of the conversation has become available. diff --git a/docs/using-actions.mdx b/docs/using-actions.mdx new file mode 100644 index 0000000000..606a0798c8 --- /dev/null +++ b/docs/using-actions.mdx @@ -0,0 +1,194 @@ +--- +title: "Using actions" +description: "Make agents on your phone calls take actions" +--- + +Agents on phone calls can take three actions: + +`EndConversation`: allows the agent to end the call, e.g. if the user says "Goodbye!" + + + +```python Python +vocode_client.actions.create_action( + request=CreateActionRequest( + type=ActionType.ACTION_END_CONVERSATION + ) +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_end_conversation", +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_end_conversation" +}' +``` + + + +`DTMF`: allows the agent to hit dial tones during a call, e.g. navigating a phone tree + + + +```python Python +vocode_client.actions.create_action( + request=CreateActionRequest( + type=ActionType.ACTION_DTMF + ) +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_dtmf", +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_dtmf" +}' +``` + + + +`TransferCall`: allows the agent to transfer the call to another phone number + + + +```python Python +vocode_client.actions.create_action( + request=CreateActionRequest( + type=ActionType.ACTION_TRANSFER_CALL, + config=TransferCallActionUpdateParamsConfig( + phone_number="11234567890" + ) + ) +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_transfer_call", + config: { + phoneNumber: "11234567890", + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_transfer_call", + "config": { + "phone_number": "11234567890" + } +}' +``` + + + +You can attach these as IDs to your phone number agent as follows: + + + +```python Python +vocode_client.numbers.update_number( + phone_number="11234567890", + inbound_agent=UpdateNumberRequestInboundAgent( + actions=[""] + ) +) +``` + +```typescript TypeScript +vocode.numbers.updateNumber({ + phoneNumber: "11234567890", + inboundAgent: { + actions: [""], + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/numbers/update?phone_number=11234567890 \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "inbound_agent": { + "actions": [""] + } +}' +``` + + + +You can also add these as actions as raw payloads as follows: + + + +```python Python +vocode_client.numbers.update_number( + phone_number="11234567890", + inbound_agent=UpdateNumberRequestInboundAgent( + actions=[TransferCallActionUpdateParams( + type=ActionType.ACTION_TRANSFER_CALL, + config=TransferCallActionUpdateParamsConfig( + phone_number="11234567890" + ) + )] + ) +) +``` + +```typescript TypeScript +vocode.numbers.updateNumber({ + phoneNumber: "11234567890", + inboundAgent: { + actions: [ + { + type: "action_transfer_call", + config: { + phoneNumber: "11234567890", + }, + }, + ], + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/numbers/update?phone_number=11234567890 \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "inbound_agent": { + "actions": [{ + "type": "action_transfer_call", + "config": { + "phone_number": "11234567890" + } + }] + } +}' +``` + + diff --git a/docs/vectordb.mdx b/docs/vectordb.mdx new file mode 100644 index 0000000000..b8dc24b258 --- /dev/null +++ b/docs/vectordb.mdx @@ -0,0 +1,115 @@ +--- +title: "Vector databases" +description: "Give your agents knowledge via embeddings" +--- + +## Introduction + +For many practical use cases it may be necessary to give bots information; but, due to limited +context windows, there may not be enough room in the prompt. Thus, Vocode allows you to plug into +vector databases that contain embeddings. + +Each time the bot receives a message, it can query for the most similar embeddings; these embeddings will +be shown to the agent to guide its responses. + +Currently, we support [Pinecone](https://www.pinecone.io/). Under the hood, we use an approach similar +to Langchain to store the documents in Pinecone. Each vector in Pinecone must have two pieces of metadata +to be compatible with Vocode: + +- `text`: The text that will be shown to the agent. +- `source`: The name of the document where the text comes from. This could be the title of an article, + for example. + +## Connecting to Pinecone + +To add your vector database to your agent, you need to add a vector database config to your agent: + + + +```python update_agent.py +from vocode import PineconeVectorDatabaseUpdateParams + +agent = vocode_client.agents.update_agent( + id="AGENT_ID", + request=PineconeVectorDatabaseUpdateParams( + type="vector_database_pinecone", + index="PINECONE_INDEX", + api_key="PINECONE_API_KEY", + api_environment="PINECONE_API_ENVIRONMENT", + ), +) +``` + +```javascript updateAgent.js +const agent = await vocode.agents.updateAgent({ + id: "AGENT_ID", + body: { + vector_database: { + type: "vector_database_pinecone", + index: "PINECONE_INDEX", + api_key: "PINECONE_API_KEY", + api_environment: "PINECONE_API_ENVIRONMENTr", + }, + }, +}); + +main(); +``` + + + +Now your agent will query the vector database for each user message. + +## Document loading script + +You can manaully add documents to Pinecone any way you like as long as you include the required metadata. +If you have a folder of PDFs, docx files, text files, etc. that you want to add to pinecone, you can use +the below script which uses [Unstructured](https://github.com/Unstructured-IO/unstructured) to parse +many kinds of files types, extract the text, and add it to pinecone. + +The script was tested with these package versions: + +``` +python = "^3.10" +langchain = "^0.0.237" +spacy = "^3.6.0" +unstructured = {extras = ["local-inference"], version = "^0.8.1"} +layoutparser = {extras = ["layoutmodels", "tesseract"], version = "^0.3.4"} +pinecone-client = "^2.2.2" +openai = "^0.27.8" +torch = ">=2.0.0, !=2.0.1" +tiktoken = "^0.4.0" +``` + +```python +import os +import pinecone +from langchain.embeddings.openai import OpenAIEmbeddings +from langchain.text_splitter import SpacyTextSplitter +from langchain.vectorstores import Pinecone +from langchain.document_loaders import DirectoryLoader, UnstructuredFileLoader + +PINECONE_API_KEY = os.environ["PINECONE_API_KEY"] +PINECONE_ENVIRONMENT = os.environ["PINECONE_ENVIRONMENT"] +OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] + + +loader = DirectoryLoader('./docs', glob="**/*.*", show_progress=True, loader_cls=UnstructuredFileLoader) +print("Loading documents...") +documents = loader.load() +text_splitter = SpacyTextSplitter(chunk_size=1000) +print("Splitting documents...") +docs = text_splitter.split_documents(documents) + +embeddings = OpenAIEmbeddings() + +pinecone.init( + api_key=PINECONE_API_KEY, + environment=PINECONE_ENVIRONMENT, +) + +index_name = "your_index_name" + +print("Creating index...") +docsearch = Pinecone.from_documents(docs, embeddings, index_name=index_name) +``` diff --git a/docs/webhooks.mdx b/docs/webhooks.mdx new file mode 100644 index 0000000000..8a8437ca16 --- /dev/null +++ b/docs/webhooks.mdx @@ -0,0 +1,4 @@ +--- +title: "Webhooks" +description: "🚧 Under construction" +--- diff --git a/docs/welcome.mdx b/docs/welcome.mdx index e4d283b297..94c2ffb666 100644 --- a/docs/welcome.mdx +++ b/docs/welcome.mdx @@ -15,6 +15,34 @@ to answer/make phone calls, act as personal assistants, join Zoom meetings, and - Integrations to all of the best speech-to-text/text-to-speech providers - Cross-platform support (telephony, web, Zoom) +## Hosted Service + +The Vocode hosted service allows you to automate inbound/outbound calls via API. Users can program agents to +execute arbitrary tasks and leverage our integrations, or build their own. + +It is built with maximum developer flexibility in mind so you can embed an AI call center directly in your product or +operations flows. Get started with the [Hosted Service](/hosted-quickstart). + +## Open Source Library + +Most of what we build is open source and free to use! Leverage all of the features mentioned in the introduction by taking a look +at our open source repos. Get started with [Open Source](/open-source-quickstart). + +## Quickstarts + + + + Start using the hosted telephony service. + + + Run Vocode self hosted. + + + ## Demos @@ -75,44 +103,6 @@ to answer/make phone calls, act as personal assistants, join Zoom meetings, and -## Start Developing - - - - Quickly get up and running with Vocode by following our Python quick start - guide. - - - Learn the basics of what Vocode does, how it works, and how it can help you. - - - -### Replit Templates - - - - Spin up a phone number with ChatGPT on the other end. - - - Create a website that you can talk to. - - - Use Vocode as a tool to call someone in the real world. - - - ## How to contact us Learn more about how to take your documentation to the next level From 9c1d84150700d0344657e222fc10592c7ef87612 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 22 Aug 2023 22:27:18 -0700 Subject: [PATCH 007/148] fix link --- docs/open-source-quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/open-source-quickstart.mdx b/docs/open-source-quickstart.mdx index d253cfe532..342bf336e9 100644 --- a/docs/open-source-quickstart.mdx +++ b/docs/open-source-quickstart.mdx @@ -6,7 +6,7 @@ description: "How to get Vocode up and running on your own machine" ## Start Developing - + Quickly get up and running with Vocode by following our Python quick start guide. From 456140cde445a8e65b9fe63397faf2983d72d04b Mon Sep 17 00:00:00 2001 From: Kian Hooshmand Date: Thu, 24 Aug 2023 15:17:27 -0700 Subject: [PATCH 008/148] fix openai get token method (#373) * fix openai get token method * use continue and update tests --------- Co-authored-by: Ajay Raj --- tests/streaming/agent/test_utils.py | 22 ++++++++++++++++++---- vocode/streaming/agent/utils.py | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/tests/streaming/agent/test_utils.py b/tests/streaming/agent/test_utils.py index 96cb4848e1..cd1be9ec09 100644 --- a/tests/streaming/agent/test_utils.py +++ b/tests/streaming/agent/test_utils.py @@ -28,11 +28,17 @@ async def _agen_from_list(l): def create_chatgpt_openai_object( - delta: Dict[str, str], finish_reason: Optional[Any] = None + delta: Optional[Dict[str, str]] = None, + finish_reason: Optional[Any] = None, + prompt_annotations=None, ): - return OpenAIObject.construct_from( - {"choices": [{"delta": delta, "finish_reason": finish_reason}]} - ) + inner_obj = {} + if prompt_annotations: + inner_obj["prompt_annotations"] = prompt_annotations + inner_obj["choices"] = [] + elif delta: + inner_obj["choices"] = [{"delta": delta, "finish_reason": finish_reason}] + return OpenAIObject.construct_from(inner_obj) class StreamOpenAIResponseTestCase(BaseModel): @@ -43,6 +49,14 @@ class StreamOpenAIResponseTestCase(BaseModel): OPENAI_OBJECTS = [ [ + { + "prompt_annotations": [ + { + "prompt_index": 0, + "content_filter_results": {}, + } + ] + }, {"delta": {"role": "assistant"}, "finish_reason": None}, {"delta": {"content": "Hello"}, "finish_reason": None}, {"delta": {"content": "!"}, "finish_reason": None}, diff --git a/vocode/streaming/agent/utils.py b/vocode/streaming/agent/utils.py index 8d725c950f..31b4864fc9 100644 --- a/vocode/streaming/agent/utils.py +++ b/vocode/streaming/agent/utils.py @@ -75,7 +75,7 @@ async def openai_get_tokens(gen) -> AsyncGenerator[Union[str, FunctionFragment], async for event in gen: choices = event.get("choices", []) if len(choices) == 0: - break + continue choice = choices[0] if choice.finish_reason: break From 2975ece03aeeac3d9e0fcc8a823307ac4aab5c97 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 25 Aug 2023 15:29:36 -0700 Subject: [PATCH 009/148] change types to use literals and bump openapi spec (#377) * change types to use literals and bump openapi spec * fix api reference --- docs/api-reference/actions/get-action.mdx | 4 +- docs/api-reference/agents/get-agent.mdx | 4 +- docs/api-reference/calls/get-call.mdx | 4 +- docs/api-reference/numbers/get-number.mdx | 4 +- docs/api-reference/schemas/action-config.mdx | 3 - docs/api-reference/schemas/action-type.mdx | 3 - docs/api-reference/usage/get-usage.mdx | 4 +- docs/api-reference/voices/get-voice.mdx | 4 +- docs/api-reference/webhooks/get-webhook.mdx | 4 +- docs/configuring-number.mdx | 24 +- docs/mint.json | 4 - docs/openapi.json | 1685 ++++++++++++------ docs/using-actions.mdx | 8 +- 13 files changed, 1195 insertions(+), 560 deletions(-) delete mode 100644 docs/api-reference/schemas/action-config.mdx delete mode 100644 docs/api-reference/schemas/action-type.mdx diff --git a/docs/api-reference/actions/get-action.mdx b/docs/api-reference/actions/get-action.mdx index 2d91b642c9..76e95b3f56 100644 --- a/docs/api-reference/actions/get-action.mdx +++ b/docs/api-reference/actions/get-action.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/actions/ ---- \ No newline at end of file +openapi: get /v1/actions +--- diff --git a/docs/api-reference/agents/get-agent.mdx b/docs/api-reference/agents/get-agent.mdx index 1c44beed8f..01787c1cce 100644 --- a/docs/api-reference/agents/get-agent.mdx +++ b/docs/api-reference/agents/get-agent.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/agents/ ---- \ No newline at end of file +openapi: get /v1/agents +--- diff --git a/docs/api-reference/calls/get-call.mdx b/docs/api-reference/calls/get-call.mdx index fd1771b73f..575834b26c 100644 --- a/docs/api-reference/calls/get-call.mdx +++ b/docs/api-reference/calls/get-call.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/calls/ ---- \ No newline at end of file +openapi: get /v1/calls +--- diff --git a/docs/api-reference/numbers/get-number.mdx b/docs/api-reference/numbers/get-number.mdx index 32fa9b91cc..d2d2d7e8ea 100644 --- a/docs/api-reference/numbers/get-number.mdx +++ b/docs/api-reference/numbers/get-number.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/numbers/ ---- \ No newline at end of file +openapi: get /v1/numbers +--- diff --git a/docs/api-reference/schemas/action-config.mdx b/docs/api-reference/schemas/action-config.mdx deleted file mode 100644 index 526132b73b..0000000000 --- a/docs/api-reference/schemas/action-config.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi-schema: ActionConfig ---- diff --git a/docs/api-reference/schemas/action-type.mdx b/docs/api-reference/schemas/action-type.mdx deleted file mode 100644 index d2394e7c29..0000000000 --- a/docs/api-reference/schemas/action-type.mdx +++ /dev/null @@ -1,3 +0,0 @@ ---- -openapi-schema: ActionType ---- diff --git a/docs/api-reference/usage/get-usage.mdx b/docs/api-reference/usage/get-usage.mdx index 0cab456124..7a7d8d33c6 100644 --- a/docs/api-reference/usage/get-usage.mdx +++ b/docs/api-reference/usage/get-usage.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/usage/ ---- \ No newline at end of file +openapi: get /v1/usage +--- diff --git a/docs/api-reference/voices/get-voice.mdx b/docs/api-reference/voices/get-voice.mdx index 5ca0e16892..dd86432856 100644 --- a/docs/api-reference/voices/get-voice.mdx +++ b/docs/api-reference/voices/get-voice.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/voices/ ---- \ No newline at end of file +openapi: get /v1/voices +--- diff --git a/docs/api-reference/webhooks/get-webhook.mdx b/docs/api-reference/webhooks/get-webhook.mdx index 64b8b79f4d..f25d185ab2 100644 --- a/docs/api-reference/webhooks/get-webhook.mdx +++ b/docs/api-reference/webhooks/get-webhook.mdx @@ -1,3 +1,3 @@ --- -openapi: get /v1/webhooks/ ---- \ No newline at end of file +openapi: get /v1/webhooks +--- diff --git a/docs/configuring-number.mdx b/docs/configuring-number.mdx index 61361a9b57..96e9690a2c 100644 --- a/docs/configuring-number.mdx +++ b/docs/configuring-number.mdx @@ -58,20 +58,18 @@ Our prompt has been updated. Now let's use a voice provided by other API provide ```python Python -from vocode import RimeVoiceParams, VoiceType +from vocode import RimeVoiceParams rime_voice = RimeVoiceParams( - type=VoiceType.VOICE_RIME, + type="voice_rime", speaker="RIME_SPEAKER", ) voice = vocode_client.voices.create_voice(request=rime_voice) ``` ```javascript TypeScript -import { VoiceType } from "@vocode/vocode-api/api"; - const rimeVoice = { - type: VoiceType.VoiceRime, + type: "voice_rime", voiceId: "RIME_SPEAKER", }; const number = await vocode.voices.createVoice(rimeVoice); @@ -84,10 +82,10 @@ const number = await vocode.voices.createVoice(rimeVoice); ```python Python -from vocode import PlayHtVoiceParams, VoiceType +from vocode import PlayHtVoiceParams play_ht_voice = PlayHtVoiceParams( - type=VoiceType.VOICE_PLAY_HT, + type="voice_play_ht", voice_id="PLAY_HT_VOICE_ID", api_user_id="PLAY_HT_USER_ID", api_key="PLAY_HT_API_KEY", @@ -96,10 +94,8 @@ voice = vocode_client.voices.create_voice(request=play_ht_voice) ``` ```javascript TypeScript -import { VoiceType } from "@vocode/vocode-api/api"; - const playHtVoice = { - type: VoiceType.VoicePlayHt, + type: "voice_play_ht", voiceId: "PLAY_HT_VOICE_ID", apiUserId: "PLAY_HT_USER_ID", apiKey: "PLAY_HT_API_KEY, @@ -117,10 +113,10 @@ we'll create a new voice config and set the agent to use it. ```python Python -from vocode import ElevenLabsVoiceParams, VoiceType +from vocode import ElevenLabsVoiceParams elevenlabs_voice = ElevenLabsVoiceParams( - type=VoiceType.VOICE_ELEVEN_LABS, + type="voice_eleven_labs", voice_id="ELEVEN_LABS_VOICE_ID", api_key="ELEVEN_LABS_API_KEY", ) @@ -128,10 +124,8 @@ voice = vocode_client.voices.create_voice(request=elevenlabs_voice) ``` ```javascript TypeScript -import { VoiceType } from "@vocode/vocode-api/api"; - const elevenlabsVoice = { - type: VoiceType.VoiceElevenLabs, + type: "voice_eleven_labs", voiceId: "ELEVEN_LABS_VOICE_ID", apiKey: "ELEVEN_LABS_API_KEY", }; diff --git a/docs/mint.json b/docs/mint.json index 52f85392da..84021ee9ae 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -142,10 +142,6 @@ "api-reference/webhooks/update-webhook" ] }, - { - "group": "Schemas", - "pages": ["api-reference/schemas/action-type"] - }, { "group": "Hosted Walkthrough", "pages": [ diff --git a/docs/openapi.json b/docs/openapi.json index 4a2b4e4761..608d25b0d2 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1,5 +1,5 @@ { - "openapi": "3.0.2", + "openapi": "3.1.0", "info": { "title": "Vocode Hosted API", "description": "\n Vocode's Hosted API helps you automate phone calls in minutes. 🚀\n\n ## Numbers\n\n You can buy phone lines and place agents on them.\n\n ## Calls\n\n You can start, end, and get information about calls.\n ", @@ -10,11 +10,8 @@ "servers": [ { "url": "https://api.vocode.dev", - "description": "Production environment" - }, - { - "url": "https://staging.vocode.dev", - "description": "Staging environment" + "description": "Production environment", + "x-fern-server-name": "Production" } ], "paths": { @@ -23,18 +20,34 @@ "tags": ["numbers"], "summary": "List Numbers", "operationId": "list_numbers", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Numbers V1 Numbers List Get", - "type": "array", - "items": { - "$ref": "#/components/schemas/NormalizedPhoneNumber" - } - } + "schema": { "$ref": "#/components/schemas/PhoneNumberPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -42,7 +55,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/numbers/": { + "/v1/numbers": { "get": { "tags": ["numbers"], "summary": "Get Number", @@ -50,7 +63,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Phone Number", "type": "string" }, + "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", "in": "query" } @@ -102,7 +115,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Phone Number", "type": "string" }, + "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", "in": "query" } @@ -144,7 +157,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Phone Number", "type": "string" }, + "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", "in": "query" } @@ -175,16 +188,34 @@ "tags": ["calls"], "summary": "List Calls", "operationId": "list_calls", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Calls V1 Calls List Get", - "type": "array", - "items": { "$ref": "#/components/schemas/NormalizedCall" } - } + "schema": { "$ref": "#/components/schemas/CallPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -192,7 +223,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/calls/": { + "/v1/calls": { "get": { "tags": ["calls"], "summary": "Get Call", @@ -200,7 +231,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -234,7 +265,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -297,12 +328,12 @@ "/v1/calls/recording": { "get": { "tags": ["calls"], - "summary": "Recording", - "operationId": "recording", + "summary": "Get Recording", + "operationId": "get_recording", "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string" }, + "schema": { "type": "string", "title": "Id" }, "name": "id", "in": "query" } @@ -324,7 +355,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/usage/": { + "/v1/usage": { "get": { "tags": ["usage"], "summary": "Get Usage", @@ -342,7 +373,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/actions/": { + "/v1/actions": { "get": { "tags": ["actions"], "summary": "Get Action", @@ -350,7 +381,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -360,14 +391,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Get Action V1 Actions Get", - "anyOf": [ - { "$ref": "#/components/schemas/TransferCallAction" }, - { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } - ] - } + "schema": { "$ref": "#/components/schemas/ActionResponseModel" } } } }, @@ -388,22 +412,34 @@ "tags": ["actions"], "summary": "List Actions", "operationId": "list_actions", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Actions V1 Actions List Get", - "type": "array", - "items": { - "anyOf": [ - { "$ref": "#/components/schemas/TransferCallAction" }, - { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } - ] - } - } + "schema": { "$ref": "#/components/schemas/ActionPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -419,16 +455,7 @@ "requestBody": { "content": { "application/json": { - "schema": { - "title": "Params", - "anyOf": [ - { "$ref": "#/components/schemas/TransferCallActionParams" }, - { - "$ref": "#/components/schemas/EndConversationActionParams" - }, - { "$ref": "#/components/schemas/DTMFActionParams" } - ] - } + "schema": { "$ref": "#/components/schemas/ActionParamsRequest" } } }, "required": true @@ -438,14 +465,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Create Action V1 Actions Create Post", - "anyOf": [ - { "$ref": "#/components/schemas/TransferCallAction" }, - { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } - ] - } + "schema": { "$ref": "#/components/schemas/ActionResponseModel" } } } }, @@ -469,7 +489,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -478,16 +498,7 @@ "content": { "application/json": { "schema": { - "title": "Update Params", - "anyOf": [ - { - "$ref": "#/components/schemas/TransferCallActionUpdateParams" - }, - { - "$ref": "#/components/schemas/EndConversationActionUpdateParams" - }, - { "$ref": "#/components/schemas/DTMFActionUpdateParams" } - ] + "$ref": "#/components/schemas/ActionUpdateParamsRequest" } } }, @@ -498,14 +509,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Update Action V1 Actions Update Post", - "anyOf": [ - { "$ref": "#/components/schemas/TransferCallAction" }, - { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } - ] - } + "schema": { "$ref": "#/components/schemas/ActionResponseModel" } } } }, @@ -521,7 +525,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/agents/": { + "/v1/agents": { "get": { "tags": ["agents"], "summary": "Get Agent", @@ -529,7 +533,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -560,16 +564,34 @@ "tags": ["agents"], "summary": "List Agents", "operationId": "list_agents", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Agents V1 Agents List Get", - "type": "array", - "items": { "$ref": "#/components/schemas/NormalizedAgent" } - } + "schema": { "$ref": "#/components/schemas/AgentPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -619,7 +641,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -653,7 +675,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/voices/": { + "/v1/voices": { "get": { "tags": ["voices"], "summary": "Get Voice", @@ -661,7 +683,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -671,14 +693,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Get Voice V1 Voices Get", - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoice" }, - { "$ref": "#/components/schemas/RimeVoice" }, - { "$ref": "#/components/schemas/ElevenLabsVoice" } - ] - } + "schema": { "$ref": "#/components/schemas/VoiceResponseModel" } } } }, @@ -699,22 +714,34 @@ "tags": ["voices"], "summary": "List Voices", "operationId": "list_voices", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Voices V1 Voices List Get", - "type": "array", - "items": { - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoice" }, - { "$ref": "#/components/schemas/RimeVoice" }, - { "$ref": "#/components/schemas/ElevenLabsVoice" } - ] - } - } + "schema": { "$ref": "#/components/schemas/VoicePage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -730,14 +757,7 @@ "requestBody": { "content": { "application/json": { - "schema": { - "title": "Params", - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoiceParams" }, - { "$ref": "#/components/schemas/RimeVoiceParams" }, - { "$ref": "#/components/schemas/ElevenLabsVoiceParams" } - ] - } + "schema": { "$ref": "#/components/schemas/VoiceParamsRequest" } } }, "required": true @@ -747,14 +767,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Create Voice V1 Voices Create Post", - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoice" }, - { "$ref": "#/components/schemas/RimeVoice" }, - { "$ref": "#/components/schemas/ElevenLabsVoice" } - ] - } + "schema": { "$ref": "#/components/schemas/VoiceResponseModel" } } } }, @@ -778,7 +791,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -787,12 +800,7 @@ "content": { "application/json": { "schema": { - "title": "Update Params", - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, - { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, - { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" } - ] + "$ref": "#/components/schemas/VoiceUpdateParamsRequest" } } }, @@ -803,14 +811,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response Update Voice V1 Voices Update Post", - "anyOf": [ - { "$ref": "#/components/schemas/AzureVoice" }, - { "$ref": "#/components/schemas/RimeVoice" }, - { "$ref": "#/components/schemas/ElevenLabsVoice" } - ] - } + "schema": { "$ref": "#/components/schemas/VoiceResponseModel" } } } }, @@ -826,7 +827,7 @@ "security": [{ "HTTPBearer": [] }] } }, - "/v1/webhooks/": { + "/v1/webhooks": { "get": { "tags": ["webhooks"], "summary": "Get Webhook", @@ -834,7 +835,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -865,16 +866,34 @@ "tags": ["webhooks"], "summary": "List Webhooks", "operationId": "list_webhooks", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "title": "Response List Webhooks V1 Webhooks List Get", - "type": "array", - "items": { "$ref": "#/components/schemas/Webhook" } - } + "schema": { "$ref": "#/components/schemas/WebhookPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } @@ -924,7 +943,7 @@ "parameters": [ { "required": true, - "schema": { "title": "Id", "type": "string", "format": "uuid" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -961,393 +980,713 @@ }, "components": { "schemas": { - "ActionType": { - "title": "ActionType", - "enum": [ - "action_end_conversation", - "action_dtmf", - "action_transfer_call" + "ActionPage": { + "properties": { + "items": { + "items": { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_transfer_call": "#/components/schemas/TransferCallAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_dtmf": "#/components/schemas/DTMFAction" + } + } + }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "ActionPage" + }, + "ActionParamsRequest": { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallActionParams" }, + { "$ref": "#/components/schemas/EndConversationActionParams" }, + { "$ref": "#/components/schemas/DTMFActionParams" } ], - "type": "string", - "description": "An enumeration." + "title": "ActionParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "action_transfer_call": "#/components/schemas/TransferCallActionParams", + "action_end_conversation": "#/components/schemas/EndConversationActionParams", + "action_dtmf": "#/components/schemas/DTMFActionParams" + } + } + }, + "ActionResponseModel": { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallAction" }, + { "$ref": "#/components/schemas/EndConversationAction" }, + { "$ref": "#/components/schemas/DTMFAction" } + ], + "title": "ActionResponseModel", + "discriminator": { + "propertyName": "type", + "mapping": { + "action_transfer_call": "#/components/schemas/TransferCallAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_dtmf": "#/components/schemas/DTMFAction" + } + } + }, + "ActionUpdateParamsRequest": { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallActionUpdateParams" }, + { "$ref": "#/components/schemas/EndConversationActionUpdateParams" }, + { "$ref": "#/components/schemas/DTMFActionUpdateParams" } + ], + "title": "ActionUpdateParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "action_transfer_call": "#/components/schemas/TransferCallActionUpdateParams", + "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", + "action_dtmf": "#/components/schemas/DTMFActionUpdateParams" + } + } }, "Agent": { - "title": "Agent", - "required": ["id", "user_id", "prompt", "actions", "voice"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, - "prompt": { "title": "Prompt", "type": "string" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "prompt": { "type": "string", "title": "Prompt" }, + "language": { + "allOf": [{ "$ref": "#/components/schemas/Language" }], + "default": "en" + }, "actions": { - "title": "Actions", - "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/TransferCallAction" }, { "$ref": "#/components/schemas/EndConversationAction" }, { "$ref": "#/components/schemas/DTMFAction" } - ] - } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_transfer_call": "#/components/schemas/TransferCallAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_dtmf": "#/components/schemas/DTMFAction" + } + } + }, + "type": "array", + "title": "Actions" }, "voice": { - "title": "Voice", - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/AzureVoice" }, { "$ref": "#/components/schemas/RimeVoice" }, - { "$ref": "#/components/schemas/ElevenLabsVoice" } - ] + { "$ref": "#/components/schemas/ElevenLabsVoice" }, + { "$ref": "#/components/schemas/PlayHtVoice" } + ], + "title": "Voice", + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", + "voice_play_ht": "#/components/schemas/PlayHtVoice" + } + } }, - "initial_message": { "title": "Initial Message", "type": "string" }, - "webhook": { "$ref": "#/components/schemas/Webhook" } - } + "initial_message": { "type": "string", "title": "Initial Message" }, + "webhook": { "$ref": "#/components/schemas/Webhook" }, + "vector_database": { + "$ref": "#/components/schemas/PineconeVectorDatabase" + }, + "interrupt_sensitivity": { + "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], + "default": "high" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, + "type": "object", + "required": ["id", "user_id", "prompt", "actions", "voice"], + "title": "Agent" }, - "AgentParams": { - "title": "AgentParams", - "required": ["prompt", "voice"], + "AgentPage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/NormalizedAgent" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "AgentPage" + }, + "AgentParams": { "properties": { - "prompt": { "title": "Prompt", "type": "string" }, + "prompt": { "type": "string", "title": "Prompt" }, + "language": { + "allOf": [{ "$ref": "#/components/schemas/Language" }], + "default": "en" + }, "actions": { - "title": "Actions", - "type": "array", "items": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/TransferCallActionParams" }, - { "$ref": "#/components/schemas/EndConversationActionParams" }, - { "$ref": "#/components/schemas/DTMFActionParams" } + { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallActionParams" }, + { + "$ref": "#/components/schemas/EndConversationActionParams" + }, + { "$ref": "#/components/schemas/DTMFActionParams" } + ] + } ] }, + "type": "array", + "title": "Actions", "default": [] }, "voice": { - "title": "Voice", "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/AzureVoiceParams" }, - { "$ref": "#/components/schemas/RimeVoiceParams" }, - { "$ref": "#/components/schemas/ElevenLabsVoiceParams" } - ] + { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoiceParams" }, + { "$ref": "#/components/schemas/RimeVoiceParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, + { "$ref": "#/components/schemas/PlayHtVoiceParams" } + ] + } + ], + "title": "Voice" }, - "initial_message": { "title": "Initial Message", "type": "string" }, + "initial_message": { "type": "string", "title": "Initial Message" }, "webhook": { - "title": "Webhook", "anyOf": [ { "type": "string", "format": "uuid" }, { "$ref": "#/components/schemas/WebhookParams" } - ] - } - } + ], + "title": "Webhook" + }, + "vector_database": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + ], + "title": "Vector Database" + }, + "interrupt_sensitivity": { + "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], + "default": "high" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, + "type": "object", + "required": ["prompt", "voice"], + "title": "AgentParams" }, "AgentUpdateParams": { - "title": "AgentUpdateParams", - "type": "object", "properties": { "prompt": { - "title": "Prompt", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Prompt" + }, + "language": { + "anyOf": [ + { "$ref": "#/components/schemas/Language" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Language" }, "actions": { - "title": "Actions", "anyOf": [ { - "type": "array", "items": { "anyOf": [ { "type": "string", "format": "uuid" }, { - "$ref": "#/components/schemas/TransferCallActionUpdateParams" - }, - { - "$ref": "#/components/schemas/EndConversationActionUpdateParams" - }, - { "$ref": "#/components/schemas/DTMFActionUpdateParams" } + "oneOf": [ + { + "$ref": "#/components/schemas/TransferCallActionUpdateParams" + }, + { + "$ref": "#/components/schemas/EndConversationActionUpdateParams" + }, + { + "$ref": "#/components/schemas/DTMFActionUpdateParams" + } + ] + } ] - } + }, + "type": "array" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Actions" }, "voice": { - "title": "Voice", "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, - { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, - { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" }, + { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, + { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, + { + "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" + }, + { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" } + ] + }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Voice" }, "initial_message": { - "title": "Initial Message", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Initial Message" }, "webhook": { - "title": "Webhook", "anyOf": [ { "type": "string", "format": "uuid" }, { "$ref": "#/components/schemas/WebhookUpdateParams" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Webhook" + }, + "vector_database": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { + "$ref": "#/components/schemas/PineconeVectorDatabaseUpdateParams" + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Vector Database" + }, + "interrupt_sensitivity": { + "anyOf": [ + { "$ref": "#/components/schemas/InterruptSensitivity" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Interrupt Sensitivity" + }, + "context_endpoint": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Context Endpoint" } - } + }, + "type": "object", + "title": "AgentUpdateParams" }, "AzureVoice": { - "title": "AzureVoice", - "required": ["id", "user_id", "voice_name"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], - "default": "voice_azure" + "type": "string", + "enum": ["voice_azure"], + "title": "Type" }, - "voice_name": { "title": "Voice Name", "type": "string" }, - "pitch": { "title": "Pitch", "type": "integer", "default": 0 }, - "rate": { "title": "Rate", "type": "integer", "default": 15 } - } + "voice_name": { "type": "string", "title": "Voice Name" }, + "pitch": { "type": "integer", "title": "Pitch", "default": 0 }, + "rate": { "type": "integer", "title": "Rate", "default": 15 } + }, + "type": "object", + "required": ["id", "user_id", "type", "voice_name"], + "title": "AzureVoice" }, "AzureVoiceParams": { - "title": "AzureVoiceParams", - "required": ["type", "voice_name"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, - "voice_name": { "title": "Voice Name", "type": "string" }, - "pitch": { "title": "Pitch", "type": "integer", "default": 0 }, - "rate": { "title": "Rate", "type": "integer", "default": 15 } - } + "type": { + "type": "string", + "enum": ["voice_azure"], + "title": "Type" + }, + "voice_name": { "type": "string", "title": "Voice Name" }, + "pitch": { "type": "integer", "title": "Pitch", "default": 0 }, + "rate": { "type": "integer", "title": "Rate", "default": 15 } + }, + "type": "object", + "required": ["type", "voice_name"], + "title": "AzureVoiceParams" }, "AzureVoiceUpdateParams": { - "title": "AzureVoiceUpdateParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, + "type": { + "type": "string", + "enum": ["voice_azure"], + "title": "Type" + }, "voice_name": { - "title": "Voice Name", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Voice Name" }, "pitch": { - "title": "Pitch", "anyOf": [ { "type": "integer" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Pitch" }, "rate": { - "title": "Rate", "anyOf": [ { "type": "integer" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Rate" } - } + }, + "type": "object", + "required": ["type"], + "title": "AzureVoiceUpdateParams" }, "Call": { - "title": "Call", - "required": ["id", "user_id", "to_number", "from_number", "agent"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "status": { "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], "default": "not_started" }, - "error_message": { "title": "Error Message", "type": "string" }, + "error_message": { "type": "string", "title": "Error Message" }, "recording_available": { - "title": "Recording Available", "type": "boolean", + "title": "Recording Available", "default": false }, - "transcript": { "title": "Transcript", "type": "string" }, - "to_number": { "title": "To Number", "type": "string" }, - "from_number": { "title": "From Number", "type": "string" }, - "agent": { "$ref": "#/components/schemas/Agent" } - } + "transcript": { "type": "string", "title": "Transcript" }, + "to_number": { "type": "string", "title": "To Number" }, + "from_number": { "type": "string", "title": "From Number" }, + "agent": { "$ref": "#/components/schemas/Agent" }, + "agent_phone_number": { + "type": "string", + "title": "Agent Phone Number" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "Start Time" + }, + "end_time": { + "type": "string", + "format": "date-time", + "title": "End Time" + } + }, + "type": "object", + "required": [ + "id", + "user_id", + "to_number", + "from_number", + "agent", + "agent_phone_number" + ], + "title": "Call" + }, + "CallPage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/NormalizedCall" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "CallPage" }, "CallStatus": { - "title": "CallStatus", - "enum": ["not_started", "in_progress", "error", "ended"], "type": "string", + "enum": ["not_started", "in_progress", "error", "ended"], + "title": "CallStatus", "description": "An enumeration." }, - "CreateCallRequest": { - "title": "CreateCallRequest", - "required": ["from_number", "to_number", "agent"], + "CreateCallAgentParams": { + "properties": { + "prompt": { "type": "string", "title": "Prompt" }, + "language": { + "allOf": [{ "$ref": "#/components/schemas/Language" }], + "default": "en" + }, + "actions": { + "items": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { + "oneOf": [ + { "$ref": "#/components/schemas/TransferCallActionParams" }, + { + "$ref": "#/components/schemas/EndConversationActionParams" + }, + { "$ref": "#/components/schemas/DTMFActionParams" } + ] + } + ] + }, + "type": "array", + "title": "Actions", + "default": [] + }, + "voice": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoiceParams" }, + { "$ref": "#/components/schemas/RimeVoiceParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, + { "$ref": "#/components/schemas/PlayHtVoiceParams" } + ] + } + ], + "title": "Voice" + }, + "initial_message": { "type": "string", "title": "Initial Message" }, + "webhook": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/WebhookParams" } + ], + "title": "Webhook" + }, + "vector_database": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + ], + "title": "Vector Database" + }, + "interrupt_sensitivity": { + "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], + "default": "high" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, "type": "object", + "required": ["prompt"], + "title": "CreateCallAgentParams" + }, + "CreateCallRequest": { "properties": { - "from_number": { "title": "From Number", "type": "string" }, - "to_number": { "title": "To Number", "type": "string" }, + "from_number": { "type": "string", "title": "From Number" }, + "to_number": { "type": "string", "title": "To Number" }, "agent": { - "title": "Agent", "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/AgentParams" } - ] + { "$ref": "#/components/schemas/CreateCallAgentParams" } + ], + "title": "Agent" } - } + }, + "type": "object", + "required": ["from_number", "to_number", "agent"], + "title": "CreateCallRequest" }, "DTMFAction": { - "title": "DTMFAction", - "required": ["id", "user_id"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/ActionType" }], - "default": "action_dtmf" + "type": "string", + "enum": ["action_dtmf"], + "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" } - } + }, + "type": "object", + "required": ["id", "user_id", "type"], + "title": "DTMFAction" }, "DTMFActionParams": { - "title": "DTMFActionParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_dtmf"], + "title": "Type" + }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" } - } + }, + "type": "object", + "required": ["type"], + "title": "DTMFActionParams" }, "DTMFActionUpdateParams": { - "title": "DTMFActionUpdateParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_dtmf"], + "title": "Type" + }, "config": { - "title": "Config", "anyOf": [ { "$ref": "#/components/schemas/EmptyActionConfig" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Config" } - } + }, + "type": "object", + "required": ["type"], + "title": "DTMFActionUpdateParams" }, "ElevenLabsVoice": { - "title": "ElevenLabsVoice", - "required": ["id", "user_id", "voice_id", "api_key"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], - "default": "voice_eleven_labs" + "type": "string", + "enum": ["voice_eleven_labs"], + "title": "Type" }, - "voice_id": { "title": "Voice Id", "type": "string" }, - "stability": { "title": "Stability", "type": "number" }, - "similarity_boost": { "title": "Similarity Boost", "type": "number" }, - "api_key": { "title": "Api Key", "type": "string" } - } + "voice_id": { "type": "string", "title": "Voice Id" }, + "stability": { "type": "number", "title": "Stability" }, + "similarity_boost": { "type": "number", "title": "Similarity Boost" }, + "api_key": { "type": "string", "title": "Api Key" } + }, + "type": "object", + "required": ["id", "user_id", "type", "voice_id", "api_key"], + "title": "ElevenLabsVoice" }, "ElevenLabsVoiceParams": { - "title": "ElevenLabsVoiceParams", - "required": ["type", "voice_id", "api_key"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, - "voice_id": { "title": "Voice Id", "type": "string" }, - "stability": { "title": "Stability", "type": "number" }, - "similarity_boost": { "title": "Similarity Boost", "type": "number" }, - "api_key": { "title": "Api Key", "type": "string" } - } + "type": { + "type": "string", + "enum": ["voice_eleven_labs"], + "title": "Type" + }, + "voice_id": { "type": "string", "title": "Voice Id" }, + "stability": { "type": "number", "title": "Stability" }, + "similarity_boost": { "type": "number", "title": "Similarity Boost" }, + "api_key": { "type": "string", "title": "Api Key" } + }, + "type": "object", + "required": ["type", "voice_id", "api_key"], + "title": "ElevenLabsVoiceParams" }, "ElevenLabsVoiceUpdateParams": { - "title": "ElevenLabsVoiceUpdateParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, + "type": { + "type": "string", + "enum": ["voice_eleven_labs"], + "title": "Type" + }, "voice_id": { - "title": "Voice Id", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Voice Id" }, "stability": { - "title": "Stability", "anyOf": [ { "type": "number" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Stability" }, "similarity_boost": { - "title": "Similarity Boost", "anyOf": [ { "type": "number" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Similarity Boost" }, "api_key": { - "title": "Api Key", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Api Key" } - } + }, + "type": "object", + "required": ["type"], + "title": "ElevenLabsVoiceUpdateParams" }, "EmptyActionConfig": { - "title": "EmptyActionConfig", + "properties": {}, "type": "object", - "properties": {} + "title": "EmptyActionConfig" }, "EndConversationAction": { - "title": "EndConversationAction", - "required": ["id", "user_id"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/ActionType" }], - "default": "action_end_conversation" + "type": "string", + "enum": ["action_end_conversation"], + "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" } - } + }, + "type": "object", + "required": ["id", "user_id", "type"], + "title": "EndConversationAction" }, "EndConversationActionParams": { - "title": "EndConversationActionParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_end_conversation"], + "title": "Type" + }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" } - } + }, + "type": "object", + "required": ["type"], + "title": "EndConversationActionParams" }, "EndConversationActionUpdateParams": { - "title": "EndConversationActionUpdateParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_end_conversation"], + "title": "Type" + }, "config": { - "title": "Config", "anyOf": [ { "$ref": "#/components/schemas/EmptyActionConfig" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Config" } - } + }, + "type": "object", + "required": ["type"], + "title": "EndConversationActionUpdateParams" }, "EventType": { - "title": "EventType", + "type": "string", "enum": [ "event_message", "event_action", @@ -1356,310 +1695,622 @@ "event_transcript", "event_recording" ], - "type": "string", + "title": "EventType", "description": "An enumeration." }, "HTTPMethod": { - "title": "HTTPMethod", - "enum": ["GET", "POST"], "type": "string", + "enum": ["GET", "POST"], + "title": "HTTPMethod", "description": "An enumeration." }, "HTTPValidationError": { - "title": "HTTPValidationError", - "type": "object", "properties": { "detail": { - "title": "Detail", + "items": { "$ref": "#/components/schemas/ValidationError" }, "type": "array", - "items": { "$ref": "#/components/schemas/ValidationError" } + "title": "Detail" } - } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "InterruptSensitivity": { + "type": "string", + "enum": ["low", "high"], + "title": "InterruptSensitivity", + "description": "An enumeration." + }, + "Language": { + "type": "string", + "enum": ["en", "es", "de"], + "title": "Language", + "description": "An enumeration." }, "NormalizedAgent": { - "title": "NormalizedAgent", - "required": ["id", "user_id", "prompt", "actions", "voice"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, - "prompt": { "title": "Prompt", "type": "string" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "prompt": { "type": "string", "title": "Prompt" }, + "language": { + "allOf": [{ "$ref": "#/components/schemas/Language" }], + "default": "en" + }, "actions": { - "title": "Actions", + "items": { "type": "string", "format": "uuid" }, "type": "array", - "items": { "type": "string", "format": "uuid" } + "title": "Actions" }, - "voice": { "title": "Voice", "type": "string", "format": "uuid" }, - "initial_message": { "title": "Initial Message", "type": "string" }, - "webhook": { "title": "Webhook", "type": "string", "format": "uuid" } - } + "voice": { "type": "string", "format": "uuid", "title": "Voice" }, + "initial_message": { "type": "string", "title": "Initial Message" }, + "webhook": { "type": "string", "format": "uuid", "title": "Webhook" }, + "vector_database": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + ], + "title": "Vector Database" + }, + "interrupt_sensitivity": { + "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], + "default": "high" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, + "type": "object", + "required": ["id", "user_id", "prompt", "actions", "voice"], + "title": "NormalizedAgent" }, "NormalizedCall": { - "title": "NormalizedCall", - "required": ["id", "user_id", "to_number", "from_number", "agent"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "status": { "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], "default": "not_started" }, - "error_message": { "title": "Error Message", "type": "string" }, + "error_message": { "type": "string", "title": "Error Message" }, "recording_available": { - "title": "Recording Available", "type": "boolean", + "title": "Recording Available", "default": false }, - "transcript": { "title": "Transcript", "type": "string" }, - "to_number": { "title": "To Number", "type": "string" }, - "from_number": { "title": "From Number", "type": "string" }, - "agent": { "title": "Agent", "type": "string", "format": "uuid" } - } + "transcript": { "type": "string", "title": "Transcript" }, + "to_number": { "type": "string", "title": "To Number" }, + "from_number": { "type": "string", "title": "From Number" }, + "agent": { "type": "string", "format": "uuid", "title": "Agent" }, + "agent_phone_number": { + "type": "string", + "title": "Agent Phone Number" + }, + "start_time": { + "type": "string", + "format": "date-time", + "title": "Start Time" + }, + "end_time": { + "type": "string", + "format": "date-time", + "title": "End Time" + } + }, + "type": "object", + "required": [ + "id", + "user_id", + "to_number", + "from_number", + "agent", + "agent_phone_number" + ], + "title": "NormalizedCall" }, "NormalizedPhoneNumber": { - "title": "NormalizedPhoneNumber", - "required": ["id", "user_id", "inbound_agent", "number"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, - "active": { "title": "Active", "type": "boolean", "default": true }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "active": { "type": "boolean", "title": "Active", "default": true }, + "label": { "type": "string", "title": "Label", "default": "" }, "inbound_agent": { - "title": "Inbound Agent", "type": "string", - "format": "uuid" + "format": "uuid", + "title": "Inbound Agent" }, - "number": { "title": "Number", "type": "string" } - } + "number": { "type": "string", "title": "Number" } + }, + "type": "object", + "required": ["id", "user_id", "inbound_agent", "number"], + "title": "NormalizedPhoneNumber" }, "PhoneNumber": { - "title": "PhoneNumber", + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "active": { "type": "boolean", "title": "Active", "default": true }, + "label": { "type": "string", "title": "Label", "default": "" }, + "inbound_agent": { "$ref": "#/components/schemas/Agent" }, + "number": { "type": "string", "title": "Number" } + }, + "type": "object", "required": ["id", "user_id", "inbound_agent", "number"], + "title": "PhoneNumber" + }, + "PhoneNumberPage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/NormalizedPhoneNumber" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "PhoneNumberPage" + }, + "PineconeVectorDatabase": { "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, - "active": { "title": "Active", "type": "boolean", "default": true }, - "inbound_agent": { "$ref": "#/components/schemas/Agent" }, - "number": { "title": "Number", "type": "string" } - } + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["vector_database_pinecone"], + "title": "Type" + }, + "index": { "type": "string", "title": "Index" }, + "api_key": { "type": "string", "title": "Api Key" }, + "api_environment": { "type": "string", "title": "Api Environment" } + }, + "type": "object", + "required": [ + "id", + "user_id", + "type", + "index", + "api_key", + "api_environment" + ], + "title": "PineconeVectorDatabase" + }, + "PineconeVectorDatabaseParams": { + "properties": { + "type": { + "type": "string", + "enum": ["vector_database_pinecone"], + "title": "Type" + }, + "index": { "type": "string", "title": "Index" }, + "api_key": { "type": "string", "title": "Api Key" }, + "api_environment": { "type": "string", "title": "Api Environment" } + }, + "type": "object", + "required": ["type", "index", "api_key", "api_environment"], + "title": "PineconeVectorDatabaseParams" + }, + "PineconeVectorDatabaseUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["vector_database_pinecone"], + "title": "Type" + }, + "index": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Index" + }, + "api_key": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Api Key" + }, + "api_environment": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Api Environment" + } + }, + "type": "object", + "required": ["type"], + "title": "PineconeVectorDatabaseUpdateParams" }, "PlanType": { - "title": "PlanType", - "enum": ["free", "developer", "enterprise"], "type": "string", + "enum": ["plan_free", "plan_developer", "plan_enterprise"], + "title": "PlanType", "description": "An enumeration." }, - "RimeVoice": { - "title": "RimeVoice", - "required": ["id", "user_id", "speaker"], + "PlayHtVoice": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["voice_play_ht"], + "title": "Type" + }, + "voice_id": { "type": "string", "title": "Voice Id" }, + "api_user_id": { "type": "string", "title": "Api User Id" }, + "api_key": { "type": "string", "title": "Api Key" } + }, "type": "object", + "required": [ + "id", + "user_id", + "type", + "voice_id", + "api_user_id", + "api_key" + ], + "title": "PlayHtVoice" + }, + "PlayHtVoiceParams": { "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/VoiceType" }], - "default": "voice_rime" + "type": "string", + "enum": ["voice_play_ht"], + "title": "Type" }, - "speaker": { "title": "Speaker", "type": "string" } - } + "voice_id": { "type": "string", "title": "Voice Id" }, + "api_user_id": { "type": "string", "title": "Api User Id" }, + "api_key": { "type": "string", "title": "Api Key" } + }, + "type": "object", + "required": ["type", "voice_id", "api_user_id", "api_key"], + "title": "PlayHtVoiceParams" }, - "RimeVoiceParams": { - "title": "RimeVoiceParams", - "required": ["type", "speaker"], + "PlayHtVoiceUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["voice_play_ht"], + "title": "Type" + }, + "voice_id": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Voice Id" + }, + "api_user_id": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Api User Id" + }, + "api_key": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Api Key" + } + }, "type": "object", + "required": ["type"], + "title": "PlayHtVoiceUpdateParams" + }, + "RimeVoice": { "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, - "speaker": { "title": "Speaker", "type": "string" } - } + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, + "speaker": { "type": "string", "title": "Speaker" } + }, + "type": "object", + "required": ["id", "user_id", "type", "speaker"], + "title": "RimeVoice" }, - "RimeVoiceUpdateParams": { - "title": "RimeVoiceUpdateParams", - "required": ["type"], + "RimeVoiceParams": { + "properties": { + "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, + "speaker": { "type": "string", "title": "Speaker" } + }, "type": "object", + "required": ["type", "speaker"], + "title": "RimeVoiceParams" + }, + "RimeVoiceUpdateParams": { "properties": { - "type": { "$ref": "#/components/schemas/VoiceType" }, + "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, "speaker": { - "title": "Speaker", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Speaker" } - } + }, + "type": "object", + "required": ["type"], + "title": "RimeVoiceUpdateParams" }, "TransferCallAction": { - "title": "TransferCallAction", - "required": ["id", "user_id", "config"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { - "allOf": [{ "$ref": "#/components/schemas/ActionType" }], - "default": "action_transfer_call" + "type": "string", + "enum": ["action_transfer_call"], + "title": "Type" }, "config": { "$ref": "#/components/schemas/TransferCallConfig" } - } + }, + "type": "object", + "required": ["id", "user_id", "type", "config"], + "title": "TransferCallAction" }, "TransferCallActionParams": { - "title": "TransferCallActionParams", - "required": ["type", "config"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_transfer_call"], + "title": "Type" + }, "config": { "$ref": "#/components/schemas/TransferCallConfig" } - } + }, + "type": "object", + "required": ["type", "config"], + "title": "TransferCallActionParams" }, "TransferCallActionUpdateParams": { - "title": "TransferCallActionUpdateParams", - "required": ["type"], - "type": "object", "properties": { - "type": { "$ref": "#/components/schemas/ActionType" }, + "type": { + "type": "string", + "enum": ["action_transfer_call"], + "title": "Type" + }, "config": { - "title": "Config", "anyOf": [ { "$ref": "#/components/schemas/TransferCallConfig" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Config" } - } + }, + "type": "object", + "required": ["type"], + "title": "TransferCallActionUpdateParams" }, "TransferCallConfig": { - "title": "TransferCallConfig", - "required": ["phone_number"], - "type": "object", "properties": { - "phone_number": { "title": "Phone Number", "type": "string" } - } + "phone_number": { "type": "string", "title": "Phone Number" } + }, + "type": "object", + "required": ["phone_number"], + "title": "TransferCallConfig" }, - "Undefined": { "title": "Undefined", "type": "object", "properties": {} }, + "Undefined": { "properties": {}, "type": "object", "title": "Undefined" }, "UpdateNumberRequest": { - "title": "UpdateNumberRequest", - "required": ["inbound_agent"], - "type": "object", "properties": { + "label": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Label" + }, "inbound_agent": { - "title": "Inbound Agent", "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/AgentUpdateParams" } - ] + { "$ref": "#/components/schemas/AgentUpdateParams" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Inbound Agent" } - } + }, + "type": "object", + "title": "UpdateNumberRequest" }, "Usage": { - "title": "Usage", - "required": [ - "user_id", - "plan_type", - "monthly_usage_minutes", - "monthly_usage_limit_minutes" - ], - "type": "object", "properties": { - "user_id": { "title": "User Id", "type": "string" }, + "user_id": { "type": "string", "title": "User Id" }, "plan_type": { "$ref": "#/components/schemas/PlanType" }, "monthly_usage_minutes": { - "title": "Monthly Usage Minutes", - "type": "integer" + "type": "integer", + "title": "Monthly Usage Minutes" }, "monthly_usage_limit_minutes": { - "title": "Monthly Usage Limit Minutes", - "type": "integer" + "type": "integer", + "title": "Monthly Usage Limit Minutes" } - } + }, + "type": "object", + "required": [ + "user_id", + "plan_type", + "monthly_usage_minutes", + "monthly_usage_limit_minutes" + ], + "title": "Usage" }, "ValidationError": { - "title": "ValidationError", - "required": ["loc", "msg", "type"], - "type": "object", "properties": { "loc": { - "title": "Location", + "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] }, + "type": "array", + "title": "Location" + }, + "msg": { "type": "string", "title": "Message" }, + "type": { "type": "string", "title": "Error Type" } + }, + "type": "object", + "required": ["loc", "msg", "type"], + "title": "ValidationError" + }, + "VoicePage": { + "properties": { + "items": { + "items": { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" }, + { "$ref": "#/components/schemas/PlayHtVoice" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", + "voice_play_ht": "#/components/schemas/PlayHtVoice" + } + } + }, "type": "array", - "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] } + "title": "Items" }, - "msg": { "title": "Message", "type": "string" }, - "type": { "title": "Error Type", "type": "string" } + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "VoicePage" + }, + "VoiceParamsRequest": { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoiceParams" }, + { "$ref": "#/components/schemas/RimeVoiceParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, + { "$ref": "#/components/schemas/PlayHtVoiceParams" } + ], + "title": "VoiceParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoiceParams", + "voice_rime": "#/components/schemas/RimeVoiceParams", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceParams", + "voice_play_ht": "#/components/schemas/PlayHtVoiceParams" + } } }, - "VoiceType": { - "title": "VoiceType", - "enum": [ - "voice_base", - "voice_azure", - "voice_rime", - "voice_eleven_labs" + "VoiceResponseModel": { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoice" }, + { "$ref": "#/components/schemas/RimeVoice" }, + { "$ref": "#/components/schemas/ElevenLabsVoice" }, + { "$ref": "#/components/schemas/PlayHtVoice" } ], - "type": "string", - "description": "An enumeration." + "title": "VoiceResponseModel", + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", + "voice_play_ht": "#/components/schemas/PlayHtVoice" + } + } + }, + "VoiceUpdateParamsRequest": { + "oneOf": [ + { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, + { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, + { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" }, + { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" } + ], + "title": "VoiceUpdateParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoiceUpdateParams", + "voice_rime": "#/components/schemas/RimeVoiceUpdateParams", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceUpdateParams", + "voice_play_ht": "#/components/schemas/PlayHtVoiceUpdateParams" + } + } }, "Webhook": { - "title": "Webhook", - "required": ["id", "user_id", "subscriptions", "url"], - "type": "object", "properties": { - "id": { "title": "Id", "type": "string", "format": "uuid" }, - "user_id": { "title": "User Id", "type": "string", "format": "uuid" }, + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "subscriptions": { - "type": "array", - "items": { "$ref": "#/components/schemas/EventType" } + "items": { "$ref": "#/components/schemas/EventType" }, + "type": "array" }, - "url": { "title": "Url", "type": "string" }, + "url": { "type": "string", "title": "Url" }, "method": { "allOf": [{ "$ref": "#/components/schemas/HTTPMethod" }], "default": "POST" } - } + }, + "type": "object", + "required": ["id", "user_id", "subscriptions", "url"], + "title": "Webhook" }, - "WebhookParams": { - "title": "WebhookParams", - "required": ["subscriptions", "url"], + "WebhookPage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/Webhook" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "WebhookPage" + }, + "WebhookParams": { "properties": { "subscriptions": { - "type": "array", - "items": { "$ref": "#/components/schemas/EventType" } + "items": { "$ref": "#/components/schemas/EventType" }, + "type": "array" }, - "url": { "title": "Url", "type": "string" }, + "url": { "type": "string", "title": "Url" }, "method": { "allOf": [{ "$ref": "#/components/schemas/HTTPMethod" }], "default": "POST" } - } + }, + "type": "object", + "required": ["subscriptions", "url"], + "title": "WebhookParams" }, "WebhookUpdateParams": { - "title": "WebhookUpdateParams", - "type": "object", "properties": { "subscriptions": { - "title": "Subscriptions", "anyOf": [ { - "type": "array", - "items": { "$ref": "#/components/schemas/EventType" } + "items": { "$ref": "#/components/schemas/EventType" }, + "type": "array" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Subscriptions" }, "url": { - "title": "Url", "anyOf": [ { "type": "string" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Url" }, "method": { - "title": "Method", "anyOf": [ { "$ref": "#/components/schemas/HTTPMethod" }, { "$ref": "#/components/schemas/Undefined" } - ] + ], + "title": "Method" } - } + }, + "type": "object", + "title": "WebhookUpdateParams" } }, "securitySchemes": { "HTTPBearer": { "type": "http", "scheme": "bearer" } } diff --git a/docs/using-actions.mdx b/docs/using-actions.mdx index 606a0798c8..b4a74b34db 100644 --- a/docs/using-actions.mdx +++ b/docs/using-actions.mdx @@ -12,7 +12,7 @@ Agents on phone calls can take three actions: ```python Python vocode_client.actions.create_action( request=CreateActionRequest( - type=ActionType.ACTION_END_CONVERSATION + type="action_end_conversation", ) ) ``` @@ -42,7 +42,7 @@ curl --request POST \ ```python Python vocode_client.actions.create_action( request=CreateActionRequest( - type=ActionType.ACTION_DTMF + type="action_dtmf", ) ) ``` @@ -72,7 +72,7 @@ curl --request POST \ ```python Python vocode_client.actions.create_action( request=CreateActionRequest( - type=ActionType.ACTION_TRANSFER_CALL, + type="action_transfer_call", config=TransferCallActionUpdateParamsConfig( phone_number="11234567890" ) @@ -149,7 +149,7 @@ vocode_client.numbers.update_number( phone_number="11234567890", inbound_agent=UpdateNumberRequestInboundAgent( actions=[TransferCallActionUpdateParams( - type=ActionType.ACTION_TRANSFER_CALL, + type="action_transfer_call", config=TransferCallActionUpdateParamsConfig( phone_number="11234567890" ) From 0b212673746e0ef82a3a29674e8562a3e191302f Mon Sep 17 00:00:00 2001 From: Kian Hooshmand Date: Sat, 26 Aug 2023 00:15:32 -0700 Subject: [PATCH 010/148] update openapi docs and configure number (#378) * update openapi docs and configure number * bump with prompts and actually correct docs * mintlify generate * updates sidebar * vector DB docs --------- Co-authored-by: Ajay Raj --- docs/api-reference/actions/get-action.mdx | 2 +- docs/api-reference/agents/get-agent.mdx | 2 +- docs/api-reference/calls/get-call.mdx | 2 +- docs/api-reference/calls/get-recording.mdx | 3 + docs/api-reference/numbers/get-number.mdx | 2 +- docs/api-reference/prompts/create-prompt.mdx | 3 + docs/api-reference/prompts/get-prompt.mdx | 3 + docs/api-reference/prompts/list-prompts.mdx | 3 + docs/api-reference/prompts/update-prompt.mdx | 3 + docs/api-reference/usage/get-usage.mdx | 2 +- .../create-vector-database.mdx | 3 + .../vector_databases/get-vector-database.mdx | 3 + .../list-vector-databases.mdx | 3 + .../update-vector-database.mdx | 3 + docs/api-reference/voices/get-voice.mdx | 2 +- docs/api-reference/webhooks/get-webhook.mdx | 2 +- docs/configuring-number.mdx | 6 +- docs/mint.json | 21 +- docs/openapi.json | 444 +++++++++++++++++- 19 files changed, 496 insertions(+), 16 deletions(-) create mode 100644 docs/api-reference/calls/get-recording.mdx create mode 100644 docs/api-reference/prompts/create-prompt.mdx create mode 100644 docs/api-reference/prompts/get-prompt.mdx create mode 100644 docs/api-reference/prompts/list-prompts.mdx create mode 100644 docs/api-reference/prompts/update-prompt.mdx create mode 100644 docs/api-reference/vector_databases/create-vector-database.mdx create mode 100644 docs/api-reference/vector_databases/get-vector-database.mdx create mode 100644 docs/api-reference/vector_databases/list-vector-databases.mdx create mode 100644 docs/api-reference/vector_databases/update-vector-database.mdx diff --git a/docs/api-reference/actions/get-action.mdx b/docs/api-reference/actions/get-action.mdx index 76e95b3f56..3c178ab0a3 100644 --- a/docs/api-reference/actions/get-action.mdx +++ b/docs/api-reference/actions/get-action.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/actions ---- +--- \ No newline at end of file diff --git a/docs/api-reference/agents/get-agent.mdx b/docs/api-reference/agents/get-agent.mdx index 01787c1cce..430a296e1f 100644 --- a/docs/api-reference/agents/get-agent.mdx +++ b/docs/api-reference/agents/get-agent.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/agents ---- +--- \ No newline at end of file diff --git a/docs/api-reference/calls/get-call.mdx b/docs/api-reference/calls/get-call.mdx index 575834b26c..ed1f7574ec 100644 --- a/docs/api-reference/calls/get-call.mdx +++ b/docs/api-reference/calls/get-call.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/calls ---- +--- \ No newline at end of file diff --git a/docs/api-reference/calls/get-recording.mdx b/docs/api-reference/calls/get-recording.mdx new file mode 100644 index 0000000000..ec63124904 --- /dev/null +++ b/docs/api-reference/calls/get-recording.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/calls/recording +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/get-number.mdx b/docs/api-reference/numbers/get-number.mdx index d2d2d7e8ea..f42acde938 100644 --- a/docs/api-reference/numbers/get-number.mdx +++ b/docs/api-reference/numbers/get-number.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/numbers ---- +--- \ No newline at end of file diff --git a/docs/api-reference/prompts/create-prompt.mdx b/docs/api-reference/prompts/create-prompt.mdx new file mode 100644 index 0000000000..921410a464 --- /dev/null +++ b/docs/api-reference/prompts/create-prompt.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/prompts/create +--- \ No newline at end of file diff --git a/docs/api-reference/prompts/get-prompt.mdx b/docs/api-reference/prompts/get-prompt.mdx new file mode 100644 index 0000000000..1029de9255 --- /dev/null +++ b/docs/api-reference/prompts/get-prompt.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/prompts +--- \ No newline at end of file diff --git a/docs/api-reference/prompts/list-prompts.mdx b/docs/api-reference/prompts/list-prompts.mdx new file mode 100644 index 0000000000..14c35f5572 --- /dev/null +++ b/docs/api-reference/prompts/list-prompts.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/prompts/list +--- \ No newline at end of file diff --git a/docs/api-reference/prompts/update-prompt.mdx b/docs/api-reference/prompts/update-prompt.mdx new file mode 100644 index 0000000000..67cc952d2a --- /dev/null +++ b/docs/api-reference/prompts/update-prompt.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/prompts/update +--- \ No newline at end of file diff --git a/docs/api-reference/usage/get-usage.mdx b/docs/api-reference/usage/get-usage.mdx index 7a7d8d33c6..a07bc068d6 100644 --- a/docs/api-reference/usage/get-usage.mdx +++ b/docs/api-reference/usage/get-usage.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/usage ---- +--- \ No newline at end of file diff --git a/docs/api-reference/vector_databases/create-vector-database.mdx b/docs/api-reference/vector_databases/create-vector-database.mdx new file mode 100644 index 0000000000..0c718b4bb7 --- /dev/null +++ b/docs/api-reference/vector_databases/create-vector-database.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/vector_databases/create +--- \ No newline at end of file diff --git a/docs/api-reference/vector_databases/get-vector-database.mdx b/docs/api-reference/vector_databases/get-vector-database.mdx new file mode 100644 index 0000000000..366104a3e2 --- /dev/null +++ b/docs/api-reference/vector_databases/get-vector-database.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/vector_databases +--- \ No newline at end of file diff --git a/docs/api-reference/vector_databases/list-vector-databases.mdx b/docs/api-reference/vector_databases/list-vector-databases.mdx new file mode 100644 index 0000000000..27c7325a8a --- /dev/null +++ b/docs/api-reference/vector_databases/list-vector-databases.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/vector_databases/list +--- \ No newline at end of file diff --git a/docs/api-reference/vector_databases/update-vector-database.mdx b/docs/api-reference/vector_databases/update-vector-database.mdx new file mode 100644 index 0000000000..503cebafa4 --- /dev/null +++ b/docs/api-reference/vector_databases/update-vector-database.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/vector_databases/update +--- \ No newline at end of file diff --git a/docs/api-reference/voices/get-voice.mdx b/docs/api-reference/voices/get-voice.mdx index dd86432856..a336ca114e 100644 --- a/docs/api-reference/voices/get-voice.mdx +++ b/docs/api-reference/voices/get-voice.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/voices ---- +--- \ No newline at end of file diff --git a/docs/api-reference/webhooks/get-webhook.mdx b/docs/api-reference/webhooks/get-webhook.mdx index f25d185ab2..9df28e4b8a 100644 --- a/docs/api-reference/webhooks/get-webhook.mdx +++ b/docs/api-reference/webhooks/get-webhook.mdx @@ -1,3 +1,3 @@ --- openapi: get /v1/webhooks ---- +--- \ No newline at end of file diff --git a/docs/configuring-number.mdx b/docs/configuring-number.mdx index 96e9690a2c..d357d70008 100644 --- a/docs/configuring-number.mdx +++ b/docs/configuring-number.mdx @@ -31,9 +31,9 @@ prompt so the AI responds like Yoda. ```python Python -from vocode import AgentUpdateParams +from vocode import AgentUpdateParams, PromptUpdateParams -yoda_prompt = "I want you to act as Yoda. Respond as Yoda would." +yoda_prompt = PromptUpdateParams(content="I want you to act as Yoda. Respond as Yoda would.") number = vocode_client.numbers.update_number( phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(prompt=yoda_prompt) ) @@ -43,7 +43,7 @@ number = vocode_client.numbers.update_number( const yoda_prompt = "I want you to act as Yoda. Respond as Yoda would."; const number = await vocode.numbers.updateNumber({ phoneNumber: "YOUR_NUMBER", - inboundAgent: { prompt: yoda_prompt }, + inboundAgent: { prompt: { content: yoda_prompt } }, }); ``` diff --git a/docs/mint.json b/docs/mint.json index 84021ee9ae..a380f55bba 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -99,7 +99,8 @@ "api-reference/calls/list-calls", "api-reference/calls/get-call", "api-reference/calls/end-call", - "api-reference/calls/create-call" + "api-reference/calls/create-call", + "api-reference/calls/get-recording" ] }, { @@ -124,6 +125,24 @@ "api-reference/agents/update-agent" ] }, + { + "group": "Prompts", + "pages": [ + "api-reference/prompts/get-prompt", + "api-reference/prompts/list-prompts", + "api-reference/prompts/create-prompt", + "api-reference/prompts/update-prompt" + ] + }, + { + "group": "Vector Databases", + "pages": [ + "api-reference/vector_database/get-prompt", + "api-reference/vector_database/list-prompts", + "api-reference/vector_database/create-prompt", + "api-reference/vector_database/update-prompt" + ] + }, { "group": "Voices", "pages": [ diff --git a/docs/openapi.json b/docs/openapi.json index 608d25b0d2..25f3001b47 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -976,6 +976,316 @@ }, "security": [{ "HTTPBearer": [] }] } + }, + "/v1/prompts": { + "get": { + "tags": ["prompts"], + "summary": "Get Prompt", + "operationId": "get_prompt", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Prompt" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/prompts/list": { + "get": { + "tags": ["prompts"], + "summary": "List Prompts", + "operationId": "list_prompts", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PromptPage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/prompts/create": { + "post": { + "tags": ["prompts"], + "summary": "Create Prompt", + "operationId": "create_prompt", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PromptParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Prompt" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/prompts/update": { + "post": { + "tags": ["prompts"], + "summary": "Update Prompt", + "operationId": "update_prompt", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PromptUpdateParams" } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/Prompt" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/vector_databases": { + "get": { + "tags": ["vector_databases"], + "summary": "Get Vector Database", + "operationId": "get_vector_database", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PineconeVectorDatabase" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/vector_databases/list": { + "get": { + "tags": ["vector_databases"], + "summary": "List Vector Databases", + "operationId": "list_vector_databases", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/VectorDatabasePage" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/vector_databases/create": { + "post": { + "tags": ["vector_databases"], + "summary": "Create Vector Database", + "operationId": "create_vector_database", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PineconeVectorDatabaseParams" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PineconeVectorDatabase" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/vector_databases/update": { + "post": { + "tags": ["vector_databases"], + "summary": "Update Vector Database", + "operationId": "update_vector_database", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PineconeVectorDatabaseUpdateParams" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PineconeVectorDatabase" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } } }, "components": { @@ -1061,7 +1371,7 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "prompt": { "type": "string", "title": "Prompt" }, + "prompt": { "$ref": "#/components/schemas/Prompt" }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], "default": "en" @@ -1135,7 +1445,13 @@ }, "AgentParams": { "properties": { - "prompt": { "type": "string", "title": "Prompt" }, + "prompt": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptParams" } + ], + "title": "Prompt" + }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], "default": "en" @@ -1202,7 +1518,8 @@ "properties": { "prompt": { "anyOf": [ - { "type": "string" }, + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptUpdateParams" }, { "$ref": "#/components/schemas/Undefined" } ], "title": "Prompt" @@ -1431,9 +1748,30 @@ "title": "CallStatus", "description": "An enumeration." }, + "CollectField": { + "properties": { + "field_type": { + "type": "string", + "enum": ["field_type_email", "field_type_address"], + "title": "Field Type" + }, + "label": { "type": "string", "title": "Label" }, + "name": { "type": "string", "title": "Name" }, + "description": { "type": "string", "title": "Description" } + }, + "type": "object", + "required": ["field_type", "label", "name"], + "title": "CollectField" + }, "CreateCallAgentParams": { "properties": { - "prompt": { "type": "string", "title": "Prompt" }, + "prompt": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptParams" } + ], + "title": "Prompt" + }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], "default": "en" @@ -1731,7 +2069,13 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "prompt": { "type": "string", "title": "Prompt" }, + "prompt": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptParams" } + ], + "title": "Prompt" + }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], "default": "en" @@ -2000,6 +2344,81 @@ "required": ["type"], "title": "PlayHtVoiceUpdateParams" }, + "Prompt": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "content": { "type": "string", "title": "Content" }, + "collect_fields": { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array", + "title": "Collect Fields" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, + "type": "object", + "required": ["id", "user_id", "content"], + "title": "Prompt" + }, + "PromptPage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/Prompt" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "PromptPage" + }, + "PromptParams": { + "properties": { + "content": { "type": "string", "title": "Content" }, + "collect_fields": { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array", + "title": "Collect Fields" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" } + }, + "type": "object", + "required": ["content"], + "title": "PromptParams" + }, + "PromptUpdateParams": { + "properties": { + "content": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Content" + }, + "collect_fields": { + "anyOf": [ + { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array" + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Collect Fields" + }, + "context_endpoint": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Context Endpoint" + } + }, + "type": "object", + "title": "PromptUpdateParams" + }, "RimeVoice": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -2148,6 +2567,21 @@ "required": ["loc", "msg", "type"], "title": "ValidationError" }, + "VectorDatabasePage": { + "properties": { + "items": { + "items": { "$ref": "#/components/schemas/PineconeVectorDatabase" }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "VectorDatabasePage" + }, "VoicePage": { "properties": { "items": { From 2060680b4bfca961046983fe136842a5af77e151 Mon Sep 17 00:00:00 2001 From: Kian Hooshmand Date: Sat, 26 Aug 2023 00:50:05 -0700 Subject: [PATCH 011/148] fix naming (#379) --- docs/mint.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index a380f55bba..e865da2cfc 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -137,10 +137,10 @@ { "group": "Vector Databases", "pages": [ - "api-reference/vector_database/get-prompt", - "api-reference/vector_database/list-prompts", - "api-reference/vector_database/create-prompt", - "api-reference/vector_database/update-prompt" + "api-reference/vector_databases/get-vector-database", + "api-reference/vector_databases/list-vector-databases", + "api-reference/vector_databases/create-vector-database", + "api-reference/vector_databases/update-vector-database" ] }, { From 02ba7ab7ee73d6acb5bbd70fdc1421a1edda6253 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 28 Aug 2023 12:01:26 -0700 Subject: [PATCH 012/148] - move experimental_streaming to base_synthesizer (#380) - onboard play.ht --- vocode/streaming/models/synthesizer.py | 1 + .../streaming/synthesizer/base_synthesizer.py | 52 +++++++++++++++++++ .../synthesizer/eleven_labs_synthesizer.py | 49 +---------------- .../synthesizer/play_ht_synthesizer.py | 20 +++++-- 4 files changed, 70 insertions(+), 52 deletions(-) diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index c5b09de7e9..4d46b5a6c7 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -171,6 +171,7 @@ class PlayHtSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.PLAY_HT.va seed: Optional[int] = None temperature: Optional[int] = None voice_id: str = PLAYHT_DEFAULT_VOICE_ID + experimental_streaming: bool = False class CoquiTTSSynthesizerConfig( diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 763b770622..912315a1b0 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -1,3 +1,4 @@ +import asyncio import os from typing import ( Any, @@ -7,7 +8,9 @@ Generic, List, Optional, + Tuple, TypeVar, + Union, ) import math import io @@ -16,10 +19,12 @@ from nltk.tokenize import word_tokenize from nltk.tokenize.treebank import TreebankWordDetokenizer from opentelemetry import trace +from opentelemetry.trace import Span from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.agent import FillerAudioConfig from vocode.streaming.models.message import BaseMessage +from vocode.streaming.synthesizer.miniaudio_worker import MiniaudioWorker from vocode.streaming.utils import convert_wav, get_chunk_size_per_second from vocode.streaming.models.audio_encoding import AudioEncoding from vocode.streaming.models.synthesizer import SynthesizerConfig @@ -232,6 +237,53 @@ async def chunk_generator(output_bytes): ), ) + async def experimental_mp3_streaming_output_generator( + self, + response: aiohttp.ClientResponse, + chunk_size: int, + create_speech_span: Optional[Span], + ) -> AsyncGenerator[SynthesisResult.ChunkResult, None]: + miniaudio_worker_input_queue: asyncio.Queue[ + Union[bytes, None] + ] = asyncio.Queue() + miniaudio_worker_output_queue: asyncio.Queue[ + Tuple[bytes, bool] + ] = asyncio.Queue() + miniaudio_worker = MiniaudioWorker( + self.synthesizer_config, + chunk_size, + miniaudio_worker_input_queue, + miniaudio_worker_output_queue, + ) + miniaudio_worker.start() + stream_reader = response.content + + # Create a task to send the mp3 chunks to the MiniaudioWorker's input queue in a separate loop + async def send_chunks(): + async for chunk in stream_reader.iter_any(): + miniaudio_worker.consume_nonblocking(chunk) + miniaudio_worker.consume_nonblocking(None) # sentinel + + try: + asyncio.create_task(send_chunks()) + + # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop + while True: + # Get the wav chunk and the flag from the output queue of the MiniaudioWorker + wav_chunk, is_last = await miniaudio_worker.output_queue.get() + if self.synthesizer_config.should_encode_as_wav: + wav_chunk = encode_as_wav(wav_chunk, self.synthesizer_config) + + yield SynthesisResult.ChunkResult(wav_chunk, is_last) + # If this is the last chunk, break the loop + if is_last and create_speech_span is not None: + create_speech_span.end() + break + except asyncio.CancelledError: + pass + finally: + miniaudio_worker.terminate() + async def tear_down(self): if self.should_close_session_on_tear_down: await self.aiohttp_session.close() diff --git a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py index 4b693f5419..0b18adad8d 100644 --- a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py @@ -49,53 +49,6 @@ def __init__( self.words_per_minute = 150 self.experimental_streaming = synthesizer_config.experimental_streaming - async def experimental_streaming_output_generator( - self, - response: aiohttp.ClientResponse, - chunk_size: int, - create_speech_span: Optional[Span], - ) -> AsyncGenerator[SynthesisResult.ChunkResult, None]: - miniaudio_worker_input_queue: asyncio.Queue[ - Union[bytes, None] - ] = asyncio.Queue() - miniaudio_worker_output_queue: asyncio.Queue[ - Tuple[bytes, bool] - ] = asyncio.Queue() - miniaudio_worker = MiniaudioWorker( - self.synthesizer_config, - chunk_size, - miniaudio_worker_input_queue, - miniaudio_worker_output_queue, - ) - miniaudio_worker.start() - stream_reader = response.content - - # Create a task to send the mp3 chunks to the MiniaudioWorker's input queue in a separate loop - async def send_chunks(): - async for chunk in stream_reader.iter_any(): - miniaudio_worker.consume_nonblocking(chunk) - miniaudio_worker.consume_nonblocking(None) # sentinel - - try: - asyncio.create_task(send_chunks()) - - # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop - while True: - # Get the wav chunk and the flag from the output queue of the MiniaudioWorker - wav_chunk, is_last = await miniaudio_worker.output_queue.get() - if self.synthesizer_config.should_encode_as_wav: - wav_chunk = encode_as_wav(wav_chunk, self.synthesizer_config) - - yield SynthesisResult.ChunkResult(wav_chunk, is_last) - # If this is the last chunk, break the loop - if is_last and create_speech_span is not None: - create_speech_span.end() - break - except asyncio.CancelledError: - pass - finally: - miniaudio_worker.terminate() - async def create_speech( self, message: BaseMessage, @@ -139,7 +92,7 @@ async def create_speech( raise Exception(f"ElevenLabs API returned {response.status} status code") if self.experimental_streaming: return SynthesisResult( - self.experimental_streaming_output_generator( + self.experimental_mp3_streaming_output_generator( response, chunk_size, create_speech_span ), # should be wav lambda seconds: self.get_message_cutoff_from_voice_speed( diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer.py b/vocode/streaming/synthesizer/play_ht_synthesizer.py index e4b775720d..58185100d2 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer.py @@ -38,6 +38,8 @@ def __init__( raise ValueError( "You must set the PLAY_HT_API_KEY and PLAY_HT_USER_ID environment variables" ) + self.words_per_minute = 150 + self.experimental_streaming = synthesizer_config.experimental_streaming async def create_speech( self, @@ -67,11 +69,21 @@ async def create_speech( f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.create_total", ) - async with self.aiohttp_session.post( + response = await self.aiohttp_session.post( TTS_ENDPOINT, headers=headers, json=body, timeout=ClientTimeout(total=15) - ) as response: - if not response.ok: - raise Exception(f"Play.ht API error status code {response.status}") + ) + if not response.ok: + raise Exception(f"Play.ht API error status code {response.status}") + if self.experimental_streaming: + return SynthesisResult( + self.experimental_mp3_streaming_output_generator( + response, chunk_size, create_speech_span + ), # should be wav + lambda seconds: self.get_message_cutoff_from_voice_speed( + message, seconds, self.words_per_minute + ), + ) + else: read_response = await response.read() create_speech_span.end() convert_span = tracer.start_span( From 14ad5740fe6b7965e03075a231f06fb793ab3a20 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 30 Aug 2023 11:15:24 -0700 Subject: [PATCH 013/148] rolling average for deepgram confidences (#374) * rolling average * fix average --- .../transcriber/deepgram_transcriber.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index 2df718ccba..39e7346138 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -59,7 +59,7 @@ def __init__( self._ended = False self.is_ready = False self.logger = logger or logging.getLogger(__name__) - self.audio_cursor = 0. + self.audio_cursor = 0.0 async def _run_loop(self): restarts = 0 @@ -168,7 +168,7 @@ def calculate_time_silent(self, data: dict): return data["duration"] async def process(self): - self.audio_cursor = 0. + self.audio_cursor = 0.0 extra_headers = {"Authorization": f"Token {self.api_key}"} async with websockets.connect( @@ -193,6 +193,8 @@ async def sender(ws: WebSocketClientProtocol): # sends audio to websocket async def receiver(ws: WebSocketClientProtocol): buffer = "" + buffer_avg_confidence = 0 + num_buffer_utterances = 1 time_silent = 0 transcript_cursor = 0.0 while not self._ended: @@ -226,14 +228,26 @@ async def receiver(ws: WebSocketClientProtocol): if top_choice["transcript"] and confidence > 0.0 and is_final: buffer = f"{buffer} {top_choice['transcript']}" + if buffer_avg_confidence == 0: + buffer_avg_confidence = confidence + else: + buffer_avg_confidence = ( + buffer_avg_confidence + + confidence / (num_buffer_utterances) + ) * (num_buffer_utterances / (num_buffer_utterances + 1)) + num_buffer_utterances += 1 if speech_final: self.output_queue.put_nowait( Transcription( - message=buffer, confidence=confidence, is_final=True + message=buffer, + confidence=buffer_avg_confidence, + is_final=True, ) ) buffer = "" + buffer_avg_confidence = 0 + num_buffer_utterances = 1 time_silent = 0 elif top_choice["transcript"] and confidence > 0.0: self.output_queue.put_nowait( From d0b5d72d90775b0b011c0c03469d13d5c6426ee3 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 30 Aug 2023 13:39:25 -0700 Subject: [PATCH 014/148] remove time_cutoff requirement from endpointing config (#382) --- vocode/streaming/models/transcriber.py | 2 +- vocode/streaming/transcriber/deepgram_transcriber.py | 12 ++++++------ vocode/streaming/transcriber/rev_ai_transcriber.py | 7 ++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index 79d8f68071..fb47419a1a 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -34,7 +34,7 @@ class EndpointingType(str, Enum): class EndpointingConfig(TypedModel, type=EndpointingType.BASE): - time_cutoff_seconds: float + pass class TimeEndpointingConfig(EndpointingConfig, type=EndpointingType.TIME_BASED): diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index 39e7346138..ce91ec2900 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -17,6 +17,8 @@ DeepgramTranscriberConfig, EndpointingConfig, EndpointingType, + PunctuationEndpointingConfig, + TimeEndpointingConfig, ) from vocode.streaming.models.audio_encoding import AudioEncoding @@ -131,9 +133,8 @@ def is_speech_final( # if it is not time based, then return true if speech is final and there is a transcript if not self.transcriber_config.endpointing_config: return transcript and deepgram_response["speech_final"] - elif ( - self.transcriber_config.endpointing_config.type - == EndpointingType.TIME_BASED + elif isinstance( + self.transcriber_config.endpointing_config, TimeEndpointingConfig ): # if it is time based, then return true if there is no transcript # and there is some speech to send @@ -144,9 +145,8 @@ def is_speech_final( and (time_silent + deepgram_response["duration"]) > self.transcriber_config.endpointing_config.time_cutoff_seconds ) - elif ( - self.transcriber_config.endpointing_config.type - == EndpointingType.PUNCTUATION_BASED + elif isinstance( + self.transcriber_config.endpointing_config, PunctuationEndpointingConfig ): return ( transcript diff --git a/vocode/streaming/transcriber/rev_ai_transcriber.py b/vocode/streaming/transcriber/rev_ai_transcriber.py index 03974139d6..075ddf6334 100644 --- a/vocode/streaming/transcriber/rev_ai_transcriber.py +++ b/vocode/streaming/transcriber/rev_ai_transcriber.py @@ -14,6 +14,7 @@ from vocode.streaming.models.transcriber import ( RevAITranscriberConfig, EndpointingType, + TimeEndpointingConfig, ) @@ -103,9 +104,9 @@ async def receiver(ws: WebSocketClientProtocol): if ( (len(buffer) > 0) and (self.transcriber_config.endpointing_config) - and ( - self.transcriber_config.endpointing_config.type - == EndpointingType.TIME_BASED + and isinstance( + self.transcriber_config.endpointing_config, + TimeEndpointingConfig, ) and ( getSeconds() From a5e23a1eeab7c4a367275ac21b051ef30a5df0d6 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 30 Aug 2023 15:28:22 -0700 Subject: [PATCH 015/148] fix context endpoint docs --- docs/injecting-context.mdx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/injecting-context.mdx b/docs/injecting-context.mdx index 8ae811d8c4..4390c1116c 100644 --- a/docs/injecting-context.mdx +++ b/docs/injecting-context.mdx @@ -42,15 +42,18 @@ from fastapi import FastAPI app = FastAPI() @app.get("/my-context-endpoint") -def endpoint(request: Request): - if req.body.phone_number == "123": +def endpoint(phone_number: str): + if phone_number == "123": return {"name": "Kian"} - elif req.body.phone_number == "456": + elif phone_number == "456": return {"name": "Ajay"} else: return {} ``` +This sets up a route at `http://localhost:8000/my-context-endpoint` that accepts `phone_number` as a URL param, i.e. +`http://localhost:8000/my-context-endpoint?phone_number=15555555555`. + Now, when either Kian or Ajay call the bot – the prompt will reflect the name of the person the bot is talking to! From 682dfeba96054ffba688638cedca0ccc48726f11 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Sat, 2 Sep 2023 10:30:10 -0700 Subject: [PATCH 016/148] adds kwargs + overrideable event_url (#383) --- vocode/streaming/telephony/client/vonage_client.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vocode/streaming/telephony/client/vonage_client.py b/vocode/streaming/telephony/client/vonage_client.py index 66fec2a8ef..d7582a149d 100644 --- a/vocode/streaming/telephony/client/vonage_client.py +++ b/vocode/streaming/telephony/client/vonage_client.py @@ -29,7 +29,13 @@ def get_telephony_config(self): return self.vonage_config async def create_vonage_call( - self, to_phone: str, from_phone: str, ncco: str, digits: Optional[str] = None + self, + to_phone: str, + from_phone: str, + ncco: str, + digits: Optional[str] = None, + event_urls: List[str] = [], + **kwargs, ) -> str: # returns the Vonage UUID aiohttp_session = self.maybe_aiohttp_session or aiohttp.ClientSession() vonage_call_uuid: str @@ -39,6 +45,8 @@ async def create_vonage_call( "to": [{"type": "phone", "number": to_phone, "dtmfAnswer": digits}], "from": {"type": "phone", "number": from_phone}, "ncco": ncco, + "event_url": event_urls, + **kwargs, }, headers={ "Authorization": f"Bearer {self.client._generate_application_jwt().decode()}" From c31cddfa361ba4f0e65d36e761f0ef2c5deed8ef Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 5 Sep 2023 12:00:53 -0700 Subject: [PATCH 017/148] deprecate old hosted service (#384) * deprecate old hosted service - docs: remove hosted quickstarts + remove gen-Z phone number - remove hosted quickstarts / references in code * update readme --- README.md | 5 +- docs/open-source/python-quickstart.mdx | 8 +- docs/open-source/react-quickstart.mdx | 71 +------ docs/open-source/telephony.mdx | 181 +----------------- docs/welcome.mdx | 8 - quickstarts/hosted/inbound_call_server.py | 15 -- quickstarts/hosted/outbound_call.py | 27 --- quickstarts/hosted/streaming_conversation.py | 48 ----- quickstarts/hosted/zoom_dial_in.py | 35 ---- .../hosted_streaming_conversation.py | 105 ---------- .../streaming/telephony/hosted/exceptions.py | 4 - .../telephony/hosted/inbound_call_server.py | 108 ----------- .../hosted/inbound_call_user_agent_server.py | 45 ----- .../telephony/hosted/outbound_call.py | 86 --------- .../telephony/hosted/zoom_dial_in.py | 65 ------- 15 files changed, 17 insertions(+), 794 deletions(-) delete mode 100644 quickstarts/hosted/inbound_call_server.py delete mode 100644 quickstarts/hosted/outbound_call.py delete mode 100644 quickstarts/hosted/streaming_conversation.py delete mode 100644 quickstarts/hosted/zoom_dial_in.py delete mode 100644 vocode/streaming/hosted_streaming_conversation.py delete mode 100644 vocode/streaming/telephony/hosted/exceptions.py delete mode 100644 vocode/streaming/telephony/hosted/inbound_call_server.py delete mode 100644 vocode/streaming/telephony/hosted/inbound_call_user_agent_server.py delete mode 100644 vocode/streaming/telephony/hosted/outbound_call.py delete mode 100644 vocode/streaming/telephony/hosted/zoom_dial_in.py diff --git a/README.md b/README.md index 45c6ea3b5f..1cc6075a8f 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ And check out our [Roadmap](https://github.com/vocodedev/vocode-python/blob/main We'd love to talk to you on [Discord](https://discord.gg/NaU4mMgcnC) about new ideas and contributing! -# 🚀 Quickstart (Self-hosted) +# 🚀 Quickstart ```bash pip install 'vocode' @@ -105,6 +105,7 @@ async def main(): ) = create_streaming_microphone_input_and_speaker_output( use_default_devices=False, logger=logger, + use_blocking_speaker_output=True ) conversation = StreamingConversation( @@ -143,8 +144,6 @@ if __name__ == "__main__": # 📞 Phone call quickstarts - [Telephony Server - Self-hosted](https://docs.vocode.dev/telephony) -- [Inbound calls - Hosted](https://docs.vocode.dev/telephony#inbound-calls) -- [Outbound calls - Hosted](https://docs.vocode.dev/telephony#outbound-calls) # 🌱 Documentation diff --git a/docs/open-source/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx index f42deb8f50..0c2b028bfb 100644 --- a/docs/open-source/python-quickstart.mdx +++ b/docs/open-source/python-quickstart.mdx @@ -28,9 +28,7 @@ microphone_input, speaker_output = create_microphone_input_and_speaker_output( If the default I/O devices are not being set properly, set `use_default_devices` to `False` to select them before kicking off the conversation. -## Self-hosted - -### Environments +## Environments Vocode provides a unified interface across various speech transcription, speech synthesis, and AI/NLU providers. To use these providers with Vocode, you'll need to grab credentials from these providers and set them in the Vocode environment. @@ -47,9 +45,7 @@ vocode.setenv( For AZURE_SPEECH_REGION you should use the URL format. For example, if you're using the "East US" region, the value should be "eastus". See [Azure Region list](https://learn.microsoft.com/en-us/azure/cognitive-services/speech-service/rest-text-to-speech?tabs=streaming#prebuilt-neural-voices). -We also offer a hosted solution where you don't need to worry about getting these credentials — see [below](#hosted). - -### `StreamingConversation` example +## `StreamingConversation` example ```python import asyncio diff --git a/docs/open-source/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx index e1ba12ff53..3be1cf6414 100644 --- a/docs/open-source/react-quickstart.mdx +++ b/docs/open-source/react-quickstart.mdx @@ -13,76 +13,11 @@ Or, start from our [Replit template](https://replit.com/@vocode/Simple-Conversat ## Setting up the conversation -### Hosted - -You'll need to get an API key from our [dashboard](https://app.vocode.dev/) to get started. Similar to the Python Quickstart, we provide a TypeScript interface for the conversation configuration. - -```javascript -import { - AudioDeviceConfig, - ConversationConfig, - ChatGPTAgentConfig, - DeepgramTranscriberConfig, - AzureSynthesizerConfig, - VocodeConfig, -} from "vocode"; - -const transcriberConfig: Omit< - DeepgramTranscriberConfig, - "samplingRate" | "audioEncoding" -> = { - type: "transcriber_deepgram", - chunkSize: 2048, -}; -const agentConfig: ChatGPTAgentConfig = { - type: "agent_chat_gpt", - initialMessage: { - type: "message_base", - text: "Hello!", - }, - promptPreamble: "The AI is having a pleasant conversation about life", -}; -const synthesizerConfig: Omit< - AzureSynthesizerConfig, - "samplingRate" | "audioEncoding" -> = { - type: "synthesizer_azure", - shouldEncodeAsWav: true, -}; -const vocodeConfig: VocodeConfig = { - apiKey: process.env.REACT_APP_VOCODE_API_KEY || "", -}; -const audioDeviceConfig: AudioDeviceConfig = {}; -``` - -#### Running the conversation - -We provide a React hook to facilitate conversations created from the configuration above. - -```javascript -import { useConversation } from "vocode"; - -const { status, start, stop, analyserNode } = useConversation({ - transcriberConfig, - agentConfig, - synthesizerConfig, - vocodeConfig, - audioDeviceConfig, -}); -``` - -- `start` opens the microphone stream and starts sending audio from the conversation to the user -- `stop` closes the microphone and speaker streams -- `status` is an enum that contains the status of the conversation, one of `idle`, `connecting`, `connected`, and `error` -- `analyserNode` is an object (defined by the Web Audio API [here](https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode)) that allows for audio visualizations based on the audio output of the conversation - -### Self-hosted - Our self-hosted backend allows you to expose a websocket route in the same format that our hosted backend does. This allows you to deploy any agent you'd to into the conversation. To get started, clone the Vocode repo or copy the [client backend app](https://github.com/vocodedev/vocode-python/tree/main/apps/client_backend) directory. -#### Environment +### Environment Copy the `.env.template` and add your API keys. @@ -103,7 +38,7 @@ AZURE_SPEECH_KEY= AZURE_SPEECH_REGION= ``` -#### Running with Docker +### Running with Docker From the `client_backend` directory: @@ -112,7 +47,7 @@ docker build -t vocode-client-backend . docker run --env-file=.env -p 3000:3000 -t vocode-client-backend ``` -#### Running with Python +### Running with Python ``` pip3 install vocode diff --git a/docs/open-source/telephony.mdx b/docs/open-source/telephony.mdx index 67ab18b76b..8a0456e85c 100644 --- a/docs/open-source/telephony.mdx +++ b/docs/open-source/telephony.mdx @@ -10,12 +10,7 @@ can [create their own agents](/create-your-own-agent) and use them to fulfill a variety of use cases like information collection, appointment scheduling, sales, customer support, and more. -In this guide, we'll go over how to do inbound and outbound phone calls both self-hosted -and hosted. - -# Self-hosted - -## Requirements +# Requirements 1. [Ngrok](https://ngrok.com/) (used to host the `TelephonyServer` locally) 2. [ffmpeg](https://ffmpeg.org/) @@ -24,7 +19,7 @@ and hosted. a. If you have Homebrew installed, run `brew install redis` 4. (optional) [Docker](https://www.docker.com/) -## Environments +# Environments 1. Copy the `.env.template` file and fill in the values of your API keys. You'll need to get API keys for: @@ -49,7 +44,7 @@ Copy the URL that is tunneling localhost:3000 to your `.env` without `https://`, BASE_URL=asdf1234.ngrok.app ``` -## Telephony Server +# Telephony Server The `TelephonyServer` is–as implied by the name–a server that is responsible for receiving and making phone calls. @@ -57,11 +52,11 @@ The server is built using FastAPI and utilizes Twilio for telephony services. Clone the Vocode repo or copy the [Telephony app](https://github.com/vocodedev/vocode-python/tree/main/apps/telephony_app) directory. -### Running the server +## Running the server Pick one of these two ways to run the server: 1. Run everything with Docker, 2. Run Python directly -#### Option 1: Run everything With Docker +### Option 1: Run everything With Docker 1. Build the telephony app Docker image. From the `telephony_app` directory, run: @@ -75,7 +70,7 @@ docker build -t vocode-telephony-app . docker-compose up ``` -#### Option 2: Run Python directly +### Option 2: Run Python directly Run the following steps from the `telephony_app` directory. @@ -105,7 +100,7 @@ docker run -dp 6379:6379 -it redis/redis-stack:latest poetry run uvicorn main:app --port 3000 ``` -### Setting up an inbound number +## Setting up an inbound number 1. Create a [Twilio](https://www.twilio.com/) account 2. Once inside your dashboard, go to Phone Numbers -> Manage -> Buy a number to get a phone number. @@ -116,7 +111,7 @@ poetry run uvicorn main:app --port 3000 5. Hit **Save** and call the number! -### Executing outbound calls +## Executing outbound calls Make sure the server we just set up is already running. Then, in `outbound_call.py` @@ -126,7 +121,7 @@ Replace the `to_phone` with the number you want to call and the `from_phone` wit Run the script with `poetry run python outbound_call.py`. -### Configuration +## Configuration Both the `OutboundCall` (in `outbound_call.py`) and `InboundCallConfig` (in `telephony_app.py`) classes can accept a `TranscriberConfig`, `AgentConfig` or `SynthesizerConfig` - the default transcriber is Deepgram and the default synthesizer is Azure. @@ -160,7 +155,7 @@ An `AgentFactory` instance is passed into the `TelephonyServer` in `telephony_ap We provide a small set of agents with already created `AgentConfig`s, including, importantly, one that sets up ChatGPT with a configured prompt: see our `Python Quickstart` for more info. -#### Accessing call information in your agent +### Accessing call information in your agent We store the `to` and `from` numbers in the [`ConfigManager`](https://github.com/vocodedev/vocode-python-sdk/blob/b37bf7a1172a917b641d0e70ba14756415e09b0b/apps/telephony_app/main.py#L20) - so if you'd like to access them in your agent, you can instantiate the manager to hook into the same Redis instance: @@ -183,159 +178,3 @@ class SpellerAgent(BaseAgent): to_phone = call_config.twilio_to return "".join(c + " " for c in human_input), False ``` - -# Hosted - -## Authentication - -Head to our [dashboard](https://app.vocode.dev) to get an API key. - -To use your API key, set the API key on the module as follows: - -```python -import vocode -vocode.api_key = '{YOUR_API_KEY}' -``` - -## Outbound Calls - -The `OutboundCall` class provides a simple abstraction for creating outbound calls. - -### OutboundCall Class - - - The recipient entity for the phone call. - - - - The caller entity for the phone call. - - - - The configuration for the AI agent. - - -### Example: Making an outbound call - -Prior to running this script to initiate an outbound call, you still need the `TelephonyServer` from above to be running. - -```python -import os -from vocode.streaming.telephony.hosted.outbound_call import OutboundCall -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.models.telephony import CallEntity, TwilioConfig -from vocode.streaming.models.message import BaseMessage - -import vocode -vocode.api_key = '{YOUR_API_KEY}' - - -if __name__ == '__main__': - call = OutboundCall( - recipient=CallEntity( - phone_number="+12345678900", - ), - caller=CallEntity( - phone_number="+12345678900", - ), - agent_config=ChatGPTAgentConfig( - initial_message=BaseMessage(text="Hello!"), - prompt_preamble="Have a pleasant conversation about life", - ), - twilio_config=TwilioConfig( - account_sid=os.getenv("TWILIO_ACCOUNT_SID"), - auth_token=os.getenv("TWILIO_AUTH_TOKEN"), - ) - ) - call.start() - input("Press enter to end the call...") - call.end() -``` - -### How outbound calls work - -Here's what happens under the hood for an outbound call. - -The `OutboundCall` calls Twilio to initiate the call, giving it a URL to call after the call is initiated: - -``` - twilio_call = self.twilio_client.calls.create( - url=f"https://{self.base_url}/twiml/initiate_call/{self.conversation_id}", -``` - -In your main.py you create and start a `TelephonyServer`. The TelephonyServer itself includes a couple of routers: - -- `TwiMLRouter` -- `CallsRouter` - -`TwiMLRouter` includes the matching route: - -``` - self.router.add_api_route( - "/twiml/initiate_call/{id}", self.call_twiml, methods=["POST"] - ) -``` - -This route returns the template `connect_call.xml` which uses TwiML to tell Twilio to establish a websocket with a given URL: - -``` - - - - - - -``` - -CallsRouter includes that second route: - -``` - self.router.websocket("/connect_call/{id}")(self.connect_call) -``` - -This is where we get the websocket connection. We then create the `Call` object and start it: - -``` -await call.attach_ws_and_start(websocket) -``` - -The `Call` is a kind of `StreamingConversation` that manages the various pieces: transcriber, synthesizer, agent, etc. - -## Inbound Calls - -The `InboundCallServer` class provides a simple abstraction to create an endpoint that can host your agent -to respond to inbound calls. In order to implement an inbound call agent, start by defining an `InboundCallServer` -like so: - -```python -from vocode.streaming.telephony.hosted.inbound_call_server import InboundCallServer -from vocode.streaming.models.agent import EchoAgentConfig -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.telephony import TwilioConfig - -if __name__ == '__main__': - server = InboundCallServer( - agent_config=EchoAgentConfig(initial_message=BaseMessage(text="hello!")), - twilio_config=TwilioConfig( - account_sid=os.getenv("TWILIO_ACCOUNT_SID"), - auth_token=os.getenv("TWILIO_AUTH_TOKEN"), - ) - ) - server.run(port=3000) -``` - -This spins up a FastAPI web server with a `/vocode` route that returns a TwiML object that we will need in the next -step. If you're using our [Replit template](https://replit.com/@vocode/Inbound-Call-Server), this is already set up for you! - -Next, we'll set up a programmable phone number on Twilio that can accept the TwiML object from -above. To do this, - -1. Create a [Twilio](https://www.twilio.com/) account -2. Find your Twilio credentials: this is found on under _Account Info_ in the dashboard. - > Tip: if you already have existing Twilio integrations, set up the number in a [subaccount](https://support.twilio.com/hc/en-us/articles/360011132374-Getting-Started-with-Twilio-Accounts-and-Subaccounts) -3. Set up `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` in your environment. If you're using Replit, use [Replit secrets](https://docs.replit.com/programming-ide/workspace-features/storing-sensitive-information-environment-variables). Otherwise, packages like [python-dotenv](https://pypi.org/project/python-dotenv/) are useful for this. -4. Once inside your dashboard, go to Phone Numbers -> Manage -> Buy a number to get a phone number. -5. Then, go to Phone Numbers -> Manage -> Active Numbers and select the number you want to set up. -6. Update the config to point the Webhook URL to the `/vocode` route we just set up. [ngrok](https://ngrok.com/) one option to quickly to host the server. - > If you're using the Replit template, use the provided hosted URL that looks something like `https://..repl.co/vocode` -7. Hit **Save** and call the number! diff --git a/docs/welcome.mdx b/docs/welcome.mdx index 94c2ffb666..33d2bd0117 100644 --- a/docs/welcome.mdx +++ b/docs/welcome.mdx @@ -46,14 +46,6 @@ at our open source repos. Get started with [Open Source](/open-source-quickstart ## Demos - - Hang out with Zephyr, the Gen-Z queen. Collab with rime.ai. - "), - caller=CallEntity( - phone_number="", - ), - agent_config=ChatGPTAgentConfig( - initial_message=BaseMessage(text="the quick fox jumped over the lazy dog "), - prompt_preamble="respond two sentences at a time", - ), - twilio_config=TwilioConfig( - account_sid=os.environ["TWILIO_ACCOUNT_SID"], - auth_token=os.environ["TWILIO_AUTH_TOKEN"], - ), - ) - call.start() - input("Press enter to end the call...") - call.end() diff --git a/quickstarts/hosted/streaming_conversation.py b/quickstarts/hosted/streaming_conversation.py deleted file mode 100644 index 32b084f4b7..0000000000 --- a/quickstarts/hosted/streaming_conversation.py +++ /dev/null @@ -1,48 +0,0 @@ -import asyncio -import logging -import signal -from vocode.streaming.hosted_streaming_conversation import HostedStreamingConversation -from vocode.streaming.streaming_conversation import StreamingConversation -from vocode.helpers import create_streaming_microphone_input_and_speaker_output -from vocode.streaming.models.transcriber import ( - DeepgramTranscriberConfig, - PunctuationEndpointingConfig, -) -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.synthesizer import AzureSynthesizerConfig -import vocode - -vocode.api_key = "" - -logging.basicConfig() -logging.root.setLevel(logging.INFO) - - -async def main(): - ( - microphone_input, - speaker_output, - ) = create_streaming_microphone_input_and_speaker_output( - use_default_devices=False, - ) - - conversation = HostedStreamingConversation( - input_device=microphone_input, - output_device=speaker_output, - transcriber_config=DeepgramTranscriberConfig.from_input_device( - microphone_input, - endpointing_config=PunctuationEndpointingConfig(), - ), - agent_config=ChatGPTAgentConfig( - initial_message=BaseMessage(text="Hello!"), - prompt_preamble="The AI is having a pleasant conversation about life", - ), - synthesizer_config=AzureSynthesizerConfig.from_output_device(speaker_output), - ) - signal.signal(signal.SIGINT, lambda _0, _1: conversation.deactivate()) - await conversation.start() - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/quickstarts/hosted/zoom_dial_in.py b/quickstarts/hosted/zoom_dial_in.py deleted file mode 100644 index 566ac2e20f..0000000000 --- a/quickstarts/hosted/zoom_dial_in.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -from vocode.streaming.models.synthesizer import AzureSynthesizerConfig -from vocode.streaming.telephony.hosted.outbound_call import OutboundCall -from vocode.streaming.models.telephony import CallEntity, TwilioConfig -from vocode.streaming.models.agent import EchoAgentConfig, ChatGPTAgentConfig -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.telephony.hosted.zoom_dial_in import ZoomDialIn - -if __name__ == "__main__": - call = ZoomDialIn( - recipient=CallEntity(phone_number=""), - caller=CallEntity( - phone_number="", - ), - zoom_meeting_id="", - zoom_meeting_password="", - agent_config=ChatGPTAgentConfig( - initial_message=BaseMessage(text="the quick fox jumped over the lazy dog "), - prompt_preamble="respond two sentences at a time", - generate_responses=True, - end_conversation_on_goodbye=True, - send_filler_audio=True, - allowed_idle_time_seconds=30, - ), - synthesizer_config=AzureSynthesizerConfig.from_telephone_output_device( - voice_name="en-US-JennyNeural" - ), - twilio_config=TwilioConfig( - account_sid=os.environ["TWILIO_ACCOUNT_SID"], - auth_token=os.environ["TWILIO_AUTH_TOKEN"], - ), - ) - call.start() - input("Press enter to end the call...") - call.end() diff --git a/vocode/streaming/hosted_streaming_conversation.py b/vocode/streaming/hosted_streaming_conversation.py deleted file mode 100644 index c674f7176c..0000000000 --- a/vocode/streaming/hosted_streaming_conversation.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import annotations - -from typing import Optional -import websockets -from websockets.exceptions import ConnectionClosedOK -from websockets.client import WebSocketClientProtocol -import asyncio -import logging -import threading -import queue -import vocode -from vocode.streaming.input_device.base_input_device import ( - BaseInputDevice, -) -from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.synthesizer import SynthesizerConfig -from vocode.streaming.models.websocket import ( - ReadyMessage, - AudioMessage, - StartMessage, - StopMessage, -) - - -class HostedStreamingConversation: - def __init__( - self, - input_device: BaseInputDevice, - output_device: BaseOutputDevice, - transcriber_config: TranscriberConfig, - agent_config: AgentConfig, - synthesizer_config: SynthesizerConfig, - id: Optional[str] = None, - ): - self.id = id - self.input_device = input_device - self.output_device = output_device - self.transcriber_config = transcriber_config - self.agent_config = agent_config - self.synthesizer_config = synthesizer_config - self.logger = logging.getLogger(__name__) - self.receiver_ready = False - self.active = True - self.output_loop = asyncio.new_event_loop() - self.output_audio_queue: queue.Queue[bytes] = queue.Queue() - self.vocode_websocket_url = f"wss://{vocode.base_url}/conversation" - - async def wait_for_ready(self): - while not self.receiver_ready: - await asyncio.sleep(0.1) - return True - - def deactivate(self): - self.active = False - - def play_audio(self): - async def run(): - while self.active: - try: - audio = self.output_audio_queue.get(timeout=5) - self.output_device.consume_nonblocking(audio) - except queue.Empty: - continue - - loop = asyncio.new_event_loop() - loop.run_until_complete(run()) - - async def start(self): - async with websockets.connect( - f"{self.vocode_websocket_url}?key={vocode.api_key}" - ) as ws: - - async def sender(ws: WebSocketClientProtocol): - start_message = StartMessage( - transcriber_config=self.transcriber_config, - agent_config=self.agent_config, - synthesizer_config=self.synthesizer_config, - conversation_id=self.id, - ) - await ws.send(start_message.json()) - await self.wait_for_ready() - self.logger.info("Listening...press Ctrl+C to stop") - while self.active: - data = await self.input_device.get_audio() - if data: - try: - await ws.send(AudioMessage.from_bytes(data).json()) - except ConnectionClosedOK: - self.deactivate() - return - await asyncio.sleep(0) - await ws.send(StopMessage().json()) - - async def receiver(ws: WebSocketClientProtocol): - ReadyMessage.parse_raw(await ws.recv()) - self.receiver_ready = True - async for msg in ws: - audio_message = AudioMessage.parse_raw(msg) - self.output_audio_queue.put_nowait(audio_message.get_bytes()) - - output_thread = threading.Thread(target=self.play_audio) - output_thread.start() - return await asyncio.gather(sender(ws), receiver(ws)) diff --git a/vocode/streaming/telephony/hosted/exceptions.py b/vocode/streaming/telephony/hosted/exceptions.py deleted file mode 100644 index 6cdf0916c1..0000000000 --- a/vocode/streaming/telephony/hosted/exceptions.py +++ /dev/null @@ -1,4 +0,0 @@ -class RateLimitExceeded(Exception): - """Exception raised when the rate limit is exceeded.""" - - pass diff --git a/vocode/streaming/telephony/hosted/inbound_call_server.py b/vocode/streaming/telephony/hosted/inbound_call_server.py deleted file mode 100644 index f4f7b91bf8..0000000000 --- a/vocode/streaming/telephony/hosted/inbound_call_server.py +++ /dev/null @@ -1,108 +0,0 @@ -from fastapi import FastAPI, Form, Response -from typing import Optional -import requests -import uvicorn - -import vocode -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.models.synthesizer import SynthesizerConfig -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.telephony import ( - CallEntity, - CreateInboundCall, - TwilioConfig, - TwilioConfig, - VonageConfig, -) -from vocode.streaming.telephony.server.base import VonageAnswerRequest - - -class InboundCallServer: - def __init__( - self, - agent_config: AgentConfig, - transcriber_config: Optional[TranscriberConfig] = None, - synthesizer_config: Optional[SynthesizerConfig] = None, - response_on_rate_limit: Optional[str] = None, - vonage_config: Optional[VonageConfig] = None, - twilio_config: Optional[TwilioConfig] = None, - ): - self.agent_config = agent_config - self.transcriber_config = transcriber_config - self.synthesizer_config = synthesizer_config - self.app = FastAPI() - - self.vonage_config = vonage_config - self.twilio_config = twilio_config - self.create_inbound_route() - self.response_on_rate_limit = ( - response_on_rate_limit - or "The line is really busy right now, check back later!" - ) - self.vocode_inbound_call_url = f"https://{vocode.base_url}/create_inbound_call" - - def create_inbound_route(self): - async def handle_vonage_call(vonage_answer_request: VonageAnswerRequest): - response = requests.post( - self.vocode_inbound_call_url, - headers={"Authorization": f"Bearer {vocode.api_key}"}, - json=CreateInboundCall( - recipient=CallEntity( - phone_number=vonage_answer_request.to, - ), - caller=CallEntity( - phone_number=vonage_answer_request.from_, - ), - agent_config=self.agent_config, - vonage_uuid=vonage_answer_request.uuid, - transcriber_config=self.transcriber_config, - synthesizer_config=self.synthesizer_config, - vonage_config=self.vonage_config, - ).dict(), - ) - assert response.ok, response.text - return Response( - response.text, - media_type="application/json", - ) - - async def handle_twilio_call( - twilio_sid: str = Form(alias="CallSid"), - twilio_from: str = Form(alias="From"), - twilio_to: str = Form(alias="To"), - ) -> Response: - response = requests.post( - self.vocode_inbound_call_url, - headers={"Authorization": f"Bearer {vocode.api_key}"}, - json=CreateInboundCall( - recipient=CallEntity( - phone_number=twilio_to, - ), - caller=CallEntity(phone_number=twilio_from), - agent_config=self.agent_config, - twilio_sid=twilio_sid, - transcriber_config=self.transcriber_config, - synthesizer_config=self.synthesizer_config, - twilio_config=self.twilio_config, - ).dict(), - ) - if response.status_code == 429: - return Response( - f"{self.response_on_rate_limit}", - media_type="application/xml", - ) - assert response.ok, response.text - return Response( - response.text, - media_type="application/xml", - ) - - if self.vonage_config: - self.app.post("/vocode")(handle_vonage_call) - elif self.twilio_config: - self.app.post("/vocode")(handle_twilio_call) - else: - raise ValueError("Must provide vonage_config or twilio_config") - - def run(self, host="localhost", port=3000): - uvicorn.run(self.app, host=host, port=port) diff --git a/vocode/streaming/telephony/hosted/inbound_call_user_agent_server.py b/vocode/streaming/telephony/hosted/inbound_call_user_agent_server.py deleted file mode 100644 index a73efc621c..0000000000 --- a/vocode/streaming/telephony/hosted/inbound_call_user_agent_server.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import Optional, Union -from vocode.streaming.models.telephony import VonageConfig -from vocode.streaming.telephony.hosted.inbound_call_server import InboundCallServer -from vocode.streaming.models.agent import ( - RESTfulAgentEnd, - RESTfulAgentInput, - RESTfulAgentText, - RESTfulUserImplementedAgentConfig, -) -from vocode.streaming.models.transcriber import ( - TranscriberConfig, -) -from vocode.streaming.models.synthesizer import SynthesizerConfig - - -class InboundCallUserAgentServer(InboundCallServer): - def __init__( - self, - agent_config: RESTfulUserImplementedAgentConfig, - transcriber_config: Optional[TranscriberConfig] = None, - synthesizer_config: Optional[SynthesizerConfig] = None, - response_on_rate_limit: Optional[str] = None, - vonage_config: Optional[VonageConfig] = None, - ): - super().__init__( - agent_config=agent_config, - transcriber_config=transcriber_config, - synthesizer_config=synthesizer_config, - response_on_rate_limit=response_on_rate_limit, - vonage_config=vonage_config, - ) - assert isinstance( - agent_config, RESTfulUserImplementedAgentConfig - ), "agent_config must be a RESTfulUserImplementedAgentConfig" - self.app.post("/respond")(self.respond_rest) - - async def respond( - self, human_input, conversation_id - ) -> Union[RESTfulAgentText, RESTfulAgentEnd]: - raise NotImplementedError - - async def respond_rest( - self, request: RESTfulAgentInput - ) -> Union[RESTfulAgentText, RESTfulAgentEnd]: - return await self.respond(request.human_input, request.conversation_id) diff --git a/vocode/streaming/telephony/hosted/outbound_call.py b/vocode/streaming/telephony/hosted/outbound_call.py deleted file mode 100644 index ac264b464e..0000000000 --- a/vocode/streaming/telephony/hosted/outbound_call.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Optional -import requests - -import vocode -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.synthesizer import SynthesizerConfig -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.models.telephony import ( - CallEntity, - CreateOutboundCall, - EndOutboundCall, - TwilioConfig, - VonageConfig, -) -from vocode.streaming.telephony.hosted.exceptions import RateLimitExceeded - - -class OutboundCall: - def __init__( - self, - recipient: CallEntity, - caller: CallEntity, - agent_config: AgentConfig, - transcriber_config: Optional[TranscriberConfig] = None, - synthesizer_config: Optional[SynthesizerConfig] = None, - conversation_id: Optional[str] = None, - twilio_config: Optional[TwilioConfig] = None, - vonage_config: Optional[VonageConfig] = None, - ): - self.recipient = recipient - self.caller = caller - self.agent_config = agent_config - self.transcriber_config = transcriber_config - self.synthesizer_config = synthesizer_config - self.conversation_id = conversation_id - self.twilio_config = twilio_config - self.vonage_config = vonage_config - self.vocode_create_outbound_call_url = ( - f"https://{vocode.base_url}/create_outbound_call" - ) - self.vocode_end_outbound_call_url = ( - f"https://{vocode.base_url}/end_outbound_call" - ) - - def start(self): - try: - response = requests.post( - self.vocode_create_outbound_call_url, - headers={"Authorization": f"Bearer {vocode.api_key}"}, - json=CreateOutboundCall( - recipient=self.recipient, - caller=self.caller, - agent_config=self.agent_config, - transcriber_config=self.transcriber_config, - synthesizer_config=self.synthesizer_config, - conversation_id=self.conversation_id, - twilio_config=self.twilio_config, - vonage_config=self.vonage_config, - ).dict(), - timeout=5, - ) - if not response.ok: - if response.status_code == 429: - raise RateLimitExceeded("Too many requests") - else: - raise Exception(response.text) - data = response.json() - self.conversation_id = data["id"] - except requests.exceptions.Timeout: - raise RateLimitExceeded("Timed out") - - def end(self): - try: - response = requests.post( - self.vocode_end_outbound_call_url, - headers={"Authorization": f"Bearer {vocode.api_key}"}, - json=EndOutboundCall( - call_id=self.conversation_id, - twilio_config=self.twilio_config, - vonage_config=self.vonage_config, - ).dict(), - timeout=2, - ) - assert response.ok or response.status_code == 404, response.text - except requests.exceptions.Timeout: - raise RateLimitExceeded("Timed out") diff --git a/vocode/streaming/telephony/hosted/zoom_dial_in.py b/vocode/streaming/telephony/hosted/zoom_dial_in.py deleted file mode 100644 index d5097270cc..0000000000 --- a/vocode/streaming/telephony/hosted/zoom_dial_in.py +++ /dev/null @@ -1,65 +0,0 @@ -from typing import Optional -import requests - -import vocode -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.synthesizer import SynthesizerConfig -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.telephony.hosted.exceptions import RateLimitExceeded -from vocode.streaming.telephony.hosted.outbound_call import OutboundCall -from vocode.streaming.models.telephony import ( - CallEntity, - DialIntoZoomCall, - TwilioConfig, -) - - -class ZoomDialIn(OutboundCall): - def __init__( - self, - recipient: CallEntity, - caller: CallEntity, - zoom_meeting_id: str, - zoom_meeting_password: str, - agent_config: AgentConfig, - transcriber_config: Optional[TranscriberConfig] = None, - synthesizer_config: Optional[SynthesizerConfig] = None, - conversation_id: Optional[str] = None, - twilio_config: Optional[TwilioConfig] = None, - ): - super().__init__( - recipient=recipient, - caller=caller, - agent_config=agent_config, - transcriber_config=transcriber_config, - synthesizer_config=synthesizer_config, - conversation_id=conversation_id, - twilio_config=twilio_config, - ) - self.zoom_meeting_id = zoom_meeting_id - self.zoom_meeting_password = zoom_meeting_password - self.vocode_zoom_dial_in_url = f"https://{vocode.base_url}/dial_into_zoom_call" - - def start(self): - response = requests.post( - self.vocode_zoom_dial_in_url, - headers={"Authorization": f"Bearer {vocode.api_key}"}, - json=DialIntoZoomCall( - recipient=self.recipient, - caller=self.caller, - zoom_meeting_id=self.zoom_meeting_id, - zoom_meeting_password=self.zoom_meeting_password, - agent_config=self.agent_config, - transcriber_config=self.transcriber_config, - synthesizer_config=self.synthesizer_config, - conversation_id=self.conversation_id, - twilio_config=self.twilio_config, - ).dict(), - ) - if not response.ok: - if response.status_code == 429: - raise RateLimitExceeded("Too many requests") - else: - raise Exception(response.text) - data = response.json() - self.conversation_id = data["id"] From ad3d8524a21c71b861afa685b82f2e3517fbf3da Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 5 Sep 2023 17:30:13 -0700 Subject: [PATCH 018/148] adds is_interruptible granularity to individual messages (#386) --- vocode/streaming/agent/anthropic_agent.py | 4 ++-- vocode/streaming/agent/base_agent.py | 14 +++++++++++--- vocode/streaming/agent/chat_gpt_agent.py | 12 +++++++----- vocode/streaming/agent/echo_agent.py | 4 ++-- vocode/streaming/agent/llamacpp_agent.py | 4 ++-- vocode/streaming/agent/llm_agent.py | 6 +++--- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/vocode/streaming/agent/anthropic_agent.py b/vocode/streaming/agent/anthropic_agent.py index e1821c3edf..6177512387 100644 --- a/vocode/streaming/agent/anthropic_agent.py +++ b/vocode/streaming/agent/anthropic_agent.py @@ -91,7 +91,7 @@ async def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[str, None]: + ) -> AsyncGenerator[Tuple[str, bool], None]: self.memory.chat_memory.messages.append(HumanMessage(content=human_input)) bot_memory_message = AIMessage(content="") @@ -115,7 +115,7 @@ async def generate_response( if sentence: bot_memory_message.content = bot_memory_message.content + sentence buffer = remainder - yield sentence + yield sentence, True continue def update_last_bot_message_on_cut_off(self, message: str): diff --git a/vocode/streaming/agent/base_agent.py b/vocode/streaming/agent/base_agent.py index bcede5d77d..8c2b5c2f3a 100644 --- a/vocode/streaming/agent/base_agent.py +++ b/vocode/streaming/agent/base_agent.py @@ -66,6 +66,10 @@ class AgentInput(TypedModel, type=AgentInputType.BASE.value): conversation_id: str vonage_uuid: Optional[str] twilio_sid: Optional[str] + agent_response_tracker: Optional[asyncio.Event] = None + + class Config: + arbitrary_types_allowed = True class TranscriptionAgentInput(AgentInput, type=AgentInputType.TRANSCRIPTION.value): @@ -213,7 +217,7 @@ async def handle_generate_response( ) is_first_response = True function_call = None - async for response in responses: + async for response, is_interruptible in responses: if isinstance(response, FunctionCall): function_call = response continue @@ -222,7 +226,9 @@ async def handle_generate_response( is_first_response = False self.produce_interruptible_agent_response_event_nonblocking( AgentResponseMessage(message=BaseMessage(text=response)), - is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + is_interruptible=self.agent_config.allow_agent_to_be_cut_off + and is_interruptible, + agent_response_tracker=agent_input.agent_response_tracker, ) # TODO: implement should_stop for generate_responses agent_span.end() @@ -429,5 +435,7 @@ def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[Union[str, FunctionCall], None]: + ) -> AsyncGenerator[ + Tuple[Union[str, FunctionCall], bool], None + ]: # tuple of the content and whether it is interruptible raise NotImplementedError diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 7a4ee72408..1d1620d4f2 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -69,7 +69,9 @@ def get_functions(self): for action_config in self.agent_config.actions ] - def get_chat_parameters(self, messages: Optional[List] = None): + def get_chat_parameters( + self, messages: Optional[List] = None, use_functions: bool = True + ): assert self.transcript is not None messages = messages or format_openai_chat_messages_from_transcript( self.transcript, self.agent_config.prompt_preamble @@ -86,7 +88,7 @@ def get_chat_parameters(self, messages: Optional[List] = None): else: parameters["model"] = self.agent_config.model_name - if self.functions: + if use_functions and self.functions: parameters["functions"] = self.functions return parameters @@ -134,10 +136,10 @@ async def generate_response( human_input: str, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[Union[str, FunctionCall], None]: + ) -> AsyncGenerator[Tuple[Union[str, FunctionCall], bool], None]: if is_interrupt and self.agent_config.cut_off_response: cut_off_response = self.get_cut_off_response() - yield cut_off_response + yield cut_off_response, False return assert self.transcript is not None @@ -174,4 +176,4 @@ async def generate_response( async for message in collate_response_async( openai_get_tokens(stream), get_functions=True ): - yield message + yield message, True diff --git a/vocode/streaming/agent/echo_agent.py b/vocode/streaming/agent/echo_agent.py index 103356652b..cd4930dffd 100644 --- a/vocode/streaming/agent/echo_agent.py +++ b/vocode/streaming/agent/echo_agent.py @@ -17,8 +17,8 @@ async def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[str, None]: - yield human_input + ) -> AsyncGenerator[Tuple[str, bool], None]: + yield human_input, True def update_last_bot_message_on_cut_off(self, message: str): pass diff --git a/vocode/streaming/agent/llamacpp_agent.py b/vocode/streaming/agent/llamacpp_agent.py index 10c88566fc..ae938172e4 100644 --- a/vocode/streaming/agent/llamacpp_agent.py +++ b/vocode/streaming/agent/llamacpp_agent.py @@ -135,7 +135,7 @@ async def generate_response( human_input: str, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[str, None]: + ) -> AsyncGenerator[Tuple[str, bool], None]: asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, lambda input: self.conversation.predict(input=input), @@ -145,4 +145,4 @@ async def generate_response( async for message in collate_response_async( self.llamacpp_get_tokens(), ): - yield str(message) + yield str(message), True diff --git a/vocode/streaming/agent/llm_agent.py b/vocode/streaming/agent/llm_agent.py index 5f2ccf9c69..a3d510da25 100644 --- a/vocode/streaming/agent/llm_agent.py +++ b/vocode/streaming/agent/llm_agent.py @@ -123,12 +123,12 @@ async def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[str, None]: + ) -> AsyncGenerator[Tuple[str, bool], None]: self.logger.debug("LLM generating response to human input") if is_interrupt and self.agent_config.cut_off_response: cut_off_response = self.get_cut_off_response() self.memory.append(self.get_memory_entry(human_input, cut_off_response)) - yield cut_off_response + yield cut_off_response, False return self.memory.append(self.get_memory_entry(human_input, "")) if self.is_first_response and self.first_response: @@ -146,7 +146,7 @@ async def generate_response( sentence = re.sub(r"^\s+(.*)", r" \1", sentence) response_buffer += sentence self.memory[-1] = self.get_memory_entry(human_input, response_buffer) - yield sentence + yield sentence, True def update_last_bot_message_on_cut_off(self, message: str): last_message = self.memory[-1] From f9814bf1248dceb1a86b0a5cc1bd2eae2e12d6eb Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 5 Sep 2023 18:15:39 -0700 Subject: [PATCH 019/148] machine detection docs --- docs/machine-detection.mdx | 69 ++++++++++++++++++++++++++++ docs/mint.json | 3 +- docs/openapi.json | 91 +++++++++++++++++++++++++++++++++---- docs/setting-up-webhook.mdx | 1 + 4 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 docs/machine-detection.mdx diff --git a/docs/machine-detection.mdx b/docs/machine-detection.mdx new file mode 100644 index 0000000000..af38f81977 --- /dev/null +++ b/docs/machine-detection.mdx @@ -0,0 +1,69 @@ +--- +title: "[Beta] Answering machine detection" +description: "Define the behavior of the bot when no one answers the phone" +--- + +The Vocode API allows you to configure your outbound call agent's behavior when the other end of a +phone call is an answerphone as well as subscribe to events relating to machine detection. + +# Example 1: Hang up the call if it goes to voicemail + +The `on_machine_answer` parameter defines what should happen if a machine answers the phone. + +```python +from vocode import CreateCallAgentParams + +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + prompt=Prompt( + content="Ask Ajay if his refrigerator is running" + ), + ), + on_machine_answer="hangup" +) +``` + +# Example 2: Hook into when a call goes to voicemail + +If you'd like the bot to stay on the call and leave a voicemail, set `on_machine_answer` to `"continue"`. You can +also configure a webhook to be fired when the answering machine detection status + +```python +from vocode import CreateCallAgentParams, PromptParams + +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + prompt=PromptParams( + content="Ask Ajay if his refrigerator is running" + ), + webhook=WebhookParams( + url="", + subscriptions=["event_machine_detection"] + ) + ), + on_machine_answer="continue" +) +``` + +Once the call is picked up, the webhook URL configured above will get the following POST request: + +``` +{ + "type": "event_machine_detection", + "call_id": "", + "payload": { + "result": "machine" # or "human" + } +} +``` + +# On the horizon + +Stay tuned for more features here, for example: + +- Instructing your agent to leave a particular voicemail +- Routing the call to a human when a human picks up, otherwise leave a voicemail diff --git a/docs/mint.json b/docs/mint.json index e865da2cfc..0e3f494a86 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -171,7 +171,8 @@ "using-actions", "vectordb", "multilingual", - "injecting-context" + "injecting-context", + "machine-detection" ] } ], diff --git a/docs/openapi.json b/docs/openapi.json index 25f3001b47..49eca283a8 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1422,7 +1422,18 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "high" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "noise_suppression": { + "type": "boolean", + "title": "Noise Suppression", + "default": false + }, + "endpointing_sensitivity": { + "type": "string", + "enum": ["auto", "relaxed"], + "title": "Endpointing Sensitivity", + "default": "auto" + } }, "type": "object", "required": ["id", "user_id", "prompt", "actions", "voice"], @@ -1508,7 +1519,18 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "high" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "noise_suppression": { + "type": "boolean", + "title": "Noise Suppression", + "default": false + }, + "endpointing_sensitivity": { + "type": "string", + "enum": ["auto", "relaxed"], + "title": "Endpointing Sensitivity", + "default": "auto" + } }, "type": "object", "required": ["prompt", "voice"], @@ -1613,6 +1635,20 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Context Endpoint" + }, + "noise_suppression": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Noise Suppression" + }, + "endpointing_sensitivity": { + "anyOf": [ + { "type": "string", "enum": ["auto", "relaxed"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Endpointing Sensitivity" } }, "type": "object", @@ -1698,6 +1734,11 @@ "default": false }, "transcript": { "type": "string", "title": "Transcript" }, + "machine_detection_result": { + "type": "string", + "enum": ["human", "machine"], + "title": "Machine Detection Result" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, @@ -1752,7 +1793,7 @@ "properties": { "field_type": { "type": "string", - "enum": ["field_type_email", "field_type_address"], + "enum": ["field_type_email"], "title": "Field Type" }, "label": { "type": "string", "title": "Label" }, @@ -1828,7 +1869,18 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "high" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "noise_suppression": { + "type": "boolean", + "title": "Noise Suppression", + "default": false + }, + "endpointing_sensitivity": { + "type": "string", + "enum": ["auto", "relaxed"], + "title": "Endpointing Sensitivity", + "default": "auto" + } }, "type": "object", "required": ["prompt"], @@ -1844,6 +1896,12 @@ { "$ref": "#/components/schemas/CreateCallAgentParams" } ], "title": "Agent" + }, + "on_machine_answer": { + "type": "string", + "enum": ["continue", "hangup"], + "title": "On Machine Answer", + "default": "continue" } }, "type": "object", @@ -1912,7 +1970,7 @@ "api_key": { "type": "string", "title": "Api Key" } }, "type": "object", - "required": ["id", "user_id", "type", "voice_id", "api_key"], + "required": ["id", "user_id", "type", "voice_id"], "title": "ElevenLabsVoice" }, "ElevenLabsVoiceParams": { @@ -1928,7 +1986,7 @@ "api_key": { "type": "string", "title": "Api Key" } }, "type": "object", - "required": ["type", "voice_id", "api_key"], + "required": ["type", "voice_id"], "title": "ElevenLabsVoiceParams" }, "ElevenLabsVoiceUpdateParams": { @@ -2031,7 +2089,8 @@ "event_phone_call_connected", "event_phone_call_ended", "event_transcript", - "event_recording" + "event_recording", + "event_machine_detection" ], "title": "EventType", "description": "An enumeration." @@ -2099,7 +2158,18 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "high" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "noise_suppression": { + "type": "boolean", + "title": "Noise Suppression", + "default": false + }, + "endpointing_sensitivity": { + "type": "string", + "enum": ["auto", "relaxed"], + "title": "Endpointing Sensitivity", + "default": "auto" + } }, "type": "object", "required": ["id", "user_id", "prompt", "actions", "voice"], @@ -2120,6 +2190,11 @@ "default": false }, "transcript": { "type": "string", "title": "Transcript" }, + "machine_detection_result": { + "type": "string", + "enum": ["human", "machine"], + "title": "Machine Detection Result" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, diff --git a/docs/setting-up-webhook.mdx b/docs/setting-up-webhook.mdx index ed57ba291c..bdff2ba2ca 100644 --- a/docs/setting-up-webhook.mdx +++ b/docs/setting-up-webhook.mdx @@ -57,3 +57,4 @@ The full list of `EventType` is listed here: - `EVENT_PHONE_CALL_ENDED`: Indicating the phone call has ended. - `EVENT_TRANSCRIPT`: The transcription of the entire conversation. - `EVENT_RECORDING`: The recording of the conversation has become available. +- `EVENT_MACHINE_DETECTION`: Indicating whether a human or a machine has picked up the phone. From 727006fbb15c0dc897aaccbb2d3117bab52214eb Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 6 Sep 2023 00:15:11 -0700 Subject: [PATCH 020/148] fix create your own agent docs --- docs/open-source/create-your-own-agent.mdx | 66 +--------------------- 1 file changed, 3 insertions(+), 63 deletions(-) diff --git a/docs/open-source/create-your-own-agent.mdx b/docs/open-source/create-your-own-agent.mdx index 515b6fe751..e9d583ee01 100644 --- a/docs/open-source/create-your-own-agent.mdx +++ b/docs/open-source/create-your-own-agent.mdx @@ -3,8 +3,6 @@ title: "Create your own AI Agent" description: "How to create a custom Agent for your use case." --- -# Self-hosted - You can subclass a [`RespondAgent`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/agent/base_agent.py#L140) to create a simple agent that can be passed into [`StreamingConversation`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/streaming_conversation.py) has the following interface: Here's one that responds with the same message no matter what is said to it: @@ -22,69 +20,11 @@ class BrokenRecordAgent(RespondAgent[BrokenRecordAgentConfig]): ) -> tuple[Optional[str], bool]: return self.agent_config.message - def generate_response( + async def generate_response( self, human_input, is_interrupt: bool = False - ) -> Generator[str, None, None]: + ) -> AsyncGenerator[Tuple[str, bool], None]: # message and whether or not the message is interruptible """Returns a generator that yields the agent's response one sentence at a time.""" - yield self.agent_config.message + yield self.agent_config.message, False ``` See [our other agent implementations](https://github.com/vocodedev/vocode-python/tree/main/vocode/streaming/agent) for more guidance! - -# Hosted (deprecated) - -NOTE: The hosted `RESTfulAgent` is being deprecated. - -Our library lets you easily host your agent so that the Vocode backend can use it to generate responses. -Users will be responsible for implementing a `RESTfulAgent`. - -## RESTful Implementation (deprecated) - -Here is an example implementation of a `RESTfulAgent` that just echoes back whatever -input it receives. Note that the `respond` method is expecting a `RESTfulAgentOutput` return value. -The `conversation_id` parameter lets you store state about a single conversation across multiple calls. - -```python -from vocode.streaming.user_implemented_agent.restful_agent import RESTfulAgent -from vocode.streaming.models.agent import RESTfulAgentOutput, RESTfulAgentText, RESTfulAgentEnd - -class YourAgent(RESTfulAgent): - - # input: the transcript from the Conversation that the agent must respond to - async def respond(self, input: str, conversation_id: str) -> RESTfulAgentOutput: - if "bye" in input: - return RESTfulAgentEnd() ## ends the conversation - else: - return RESTfulAgentText(response=input) ## responds with the input received -``` - -## Run your agent - -``` -if __name__ == "__main__": - agent = YourAgent() - agent.run(port=3000) -``` - -This sets up a [FastAPI](https://fastapi.tiangolo.com/) with either a POST endpoint or a websocket route at `/respond`. -We'll use this in the next step. - -## Setting up your `AgentConfig` - -Now that your agent is running, you'll need to host it somewhere so that the Vocode backend can hit it. -There are a variety of options to do this, here we'll describe using [ngrok](https://ngrok.com/) since it's the quickest. [Replit](https://replit.com/) is also a great option for this. - -```bash -# make sure the agent from the last step is running -ngrok http 3000 -``` - -```python -... -agent_config=RESTfulUserImplementedAgentConfig( - respond=RESTfulUserImplementedAgentConfig.EndpointConfig( - url="/respond", - ) -) -... -``` From e361471f3125d7bb020a2390ff332e4a22c4db17 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 6 Sep 2023 10:22:58 -0700 Subject: [PATCH 021/148] adds speedAlpha param (#387) --- vocode/streaming/models/synthesizer.py | 1 + vocode/streaming/synthesizer/rime_synthesizer.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index 4d46b5a6c7..a98b80d0d4 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -143,6 +143,7 @@ class RimeSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.RIME.value): speaker: str = RIME_DEFAULT_SPEAKER sampling_rate: int = RIME_DEFAULT_SAMPLE_RATE base_url: str = RIME_DEFAULT_BASE_URL + speed_alpha: Optional[float] = None COQUI_DEFAULT_SPEAKER_ID = "ebe2db86-62a6-49a1-907a-9a1360d4416e" diff --git a/vocode/streaming/synthesizer/rime_synthesizer.py b/vocode/streaming/synthesizer/rime_synthesizer.py index 4409c70acf..435fbe5c08 100644 --- a/vocode/streaming/synthesizer/rime_synthesizer.py +++ b/vocode/streaming/synthesizer/rime_synthesizer.py @@ -55,6 +55,9 @@ async def create_speech( "speaker": self.speaker, "samplingRate": self.sampling_rate, } + if self.synthesizer_config.speed_alpha is not None: + body["speedAlpha"] = self.synthesizer_config.speed_alpha + create_speech_span = tracer.start_span( f"synthesizer.{SynthesizerType.RIME.value.split('_', 1)[-1]}.create_total", ) From 399bff8c995737cb5aebe51587cd9c06b54a2777 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 7 Sep 2023 11:36:27 -0700 Subject: [PATCH 022/148] adds ivr navigation docs (#388) --- docs/ivr-navigation.mdx | 66 +++++++++++++++++++++++++++++++++++++++++ docs/mint.json | 3 +- docs/openapi.json | 44 +++++++++++++++++++++++++-- 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 docs/ivr-navigation.mdx diff --git a/docs/ivr-navigation.mdx b/docs/ivr-navigation.mdx new file mode 100644 index 0000000000..c67f0cffec --- /dev/null +++ b/docs/ivr-navigation.mdx @@ -0,0 +1,66 @@ +--- +title: "[Beta] IVR Navigation" +description: "Navigate phone trees" +--- + +Note: this feature is only useful on outbound calls, which are disabled by default. Please contact us through Discord or at support@vocode.dev +to discuss enabling this for your account! + +The Vocode API has many tools for agents to interact with IVRs (interactive voice responses) - navigating phone trees +is one of the primary use-cases of the API. + +# IVR navigation mode + +When starting an outbound call, set `ivr_navigation_mode` to `default` - this allows the bot to stay silent while on hold. Vocode +bots also automatically end the call after the conversation has been idle (i.e. no words on both sides) for 30 seconds: setting `ivr_navigation_mode` to `default` +increases this threshold to 10 minutes. + +```python +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + ..., + ivr_navigation_mode="default" + ), +) +``` + +# DTMF action + +The DTMF action allows the bot to hit dial tones (e.g. to navigate phone tree nodes where an IVR says "Press 1 for ..."). + +```python +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + actions=[DtmfActionParams(type="action_dtmf")], + ... + ), +) +``` + +# Transfer call action + +The Transfer call action allows the bot to transfer to a human agent. + +```python +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + actions=[TransferCallActionParams(type="action_transfer_call", config=TransferCallConfig( + phone_number="11234567890" + ))], + ... + ), +) +``` + +# On the horizon + +We plan to introduce more dials here, for example: + +- More configurability around allowed idle time of the conversation +- Human detection - i.e. behavior when a human picks up the phone after the bot navigates the phone tree diff --git a/docs/mint.json b/docs/mint.json index 0e3f494a86..b3a1e3eada 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -172,7 +172,8 @@ "vectordb", "multilingual", "injecting-context", - "machine-detection" + "machine-detection", + "ivr-navigation" ] } ], diff --git a/docs/openapi.json b/docs/openapi.json index 49eca283a8..a305106373 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1433,6 +1433,12 @@ "enum": ["auto", "relaxed"], "title": "Endpointing Sensitivity", "default": "auto" + }, + "ivr_navigation_mode": { + "type": "string", + "enum": ["default", "off"], + "title": "Ivr Navigation Mode", + "default": "off" } }, "type": "object", @@ -1530,6 +1536,12 @@ "enum": ["auto", "relaxed"], "title": "Endpointing Sensitivity", "default": "auto" + }, + "ivr_navigation_mode": { + "type": "string", + "enum": ["default", "off"], + "title": "Ivr Navigation Mode", + "default": "off" } }, "type": "object", @@ -1649,6 +1661,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Endpointing Sensitivity" + }, + "ivr_navigation_mode": { + "anyOf": [ + { "type": "string", "enum": ["default", "off"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Ivr Navigation Mode" } }, "type": "object", @@ -1880,6 +1899,12 @@ "enum": ["auto", "relaxed"], "title": "Endpointing Sensitivity", "default": "auto" + }, + "ivr_navigation_mode": { + "type": "string", + "enum": ["default", "off"], + "title": "Ivr Navigation Mode", + "default": "off" } }, "type": "object", @@ -2169,6 +2194,12 @@ "enum": ["auto", "relaxed"], "title": "Endpointing Sensitivity", "default": "auto" + }, + "ivr_navigation_mode": { + "type": "string", + "enum": ["default", "off"], + "title": "Ivr Navigation Mode", + "default": "off" } }, "type": "object", @@ -2499,7 +2530,8 @@ "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, - "speaker": { "type": "string", "title": "Speaker" } + "speaker": { "type": "string", "title": "Speaker" }, + "speed_alpha": { "type": "number", "title": "Speed Alpha" } }, "type": "object", "required": ["id", "user_id", "type", "speaker"], @@ -2508,7 +2540,8 @@ "RimeVoiceParams": { "properties": { "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, - "speaker": { "type": "string", "title": "Speaker" } + "speaker": { "type": "string", "title": "Speaker" }, + "speed_alpha": { "type": "number", "title": "Speed Alpha" } }, "type": "object", "required": ["type", "speaker"], @@ -2523,6 +2556,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Speaker" + }, + "speed_alpha": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Speed Alpha" } }, "type": "object", From 9379895258552fbaae5b1c99814900294d33806e Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 7 Sep 2023 22:46:06 -0700 Subject: [PATCH 023/148] openapi bump --- docs/openapi.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/openapi.json b/docs/openapi.json index a305106373..59034f1e21 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1774,6 +1774,11 @@ "type": "string", "format": "date-time", "title": "End Time" + }, + "hipaa_compliant": { + "type": "boolean", + "title": "Hipaa Compliant", + "default": false } }, "type": "object", @@ -1927,6 +1932,11 @@ "enum": ["continue", "hangup"], "title": "On Machine Answer", "default": "continue" + }, + "hipaa_compliant": { + "type": "boolean", + "title": "Hipaa Compliant", + "default": false } }, "type": "object", @@ -2242,6 +2252,11 @@ "type": "string", "format": "date-time", "title": "End Time" + }, + "hipaa_compliant": { + "type": "boolean", + "title": "Hipaa Compliant", + "default": false } }, "type": "object", From 4575006e01750c60da30f7560fd7e2d3e2403487 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 8 Sep 2023 11:20:11 -0700 Subject: [PATCH 024/148] hipaa compliance docs (#390) * adds hipaa compliance docs * update hipaa doc --- docs/hipaa-compliance.mdx | 23 +++++++++++++++++++++++ docs/mint.json | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 docs/hipaa-compliance.mdx diff --git a/docs/hipaa-compliance.mdx b/docs/hipaa-compliance.mdx new file mode 100644 index 0000000000..c48b4065cd --- /dev/null +++ b/docs/hipaa-compliance.mdx @@ -0,0 +1,23 @@ +--- +title: "HIPAA Compliance" +--- + +The `hipaa_compliant` flag in the Vocode outbound calls API configures the system to not +persist any potentially sensitive information. Turning on the flag makes the API supportable for use-cases requiring HIPAA compliance. + +In particular, turning on the flag: + +- Redacts the content of the prompt on the `calls` resource +- Prevents the transcript from being written to the `calls` resource +- Configures the call not to be recorded + +# Turning on the flag + +```python +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=..., + hipaa_compliant=True +) +``` diff --git a/docs/mint.json b/docs/mint.json index b3a1e3eada..c51c218c12 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -173,7 +173,8 @@ "multilingual", "injecting-context", "machine-detection", - "ivr-navigation" + "ivr-navigation", + "hipaa-compliance" ] } ], From 165048261cc935eda73ae50bb5d270e0ad86360c Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 11 Sep 2023 18:50:34 -0700 Subject: [PATCH 025/148] makes synthesizer methods static (#394) --- .../synthesizer/azure_synthesizer.py | 2 +- .../streaming/synthesizer/bark_synthesizer.py | 1 + .../streaming/synthesizer/base_synthesizer.py | 35 +++++++++++-------- .../synthesizer/coqui_synthesizer.py | 1 + .../synthesizer/coqui_tts_synthesizer.py | 5 ++- .../synthesizer/eleven_labs_synthesizer.py | 1 + .../synthesizer/google_synthesizer.py | 1 + .../streaming/synthesizer/gtts_synthesizer.py | 1 + .../synthesizer/play_ht_synthesizer.py | 1 + .../synthesizer/polly_synthesizer.py | 2 +- .../streaming/synthesizer/rime_synthesizer.py | 5 ++- .../stream_elements_synthesizer.py | 1 + 12 files changed, 37 insertions(+), 19 deletions(-) diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index 11144a6db0..ceb7dd6d50 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -219,7 +219,7 @@ def get_message_up_to( self, message: str, ssml: str, - seconds: int, + seconds: float, word_boundary_event_pool: WordBoundaryEventPool, ) -> str: events = word_boundary_event_pool.get_events_sorted() diff --git a/vocode/streaming/synthesizer/bark_synthesizer.py b/vocode/streaming/synthesizer/bark_synthesizer.py index a8aa85fcf8..d8a79d5c67 100644 --- a/vocode/streaming/synthesizer/bark_synthesizer.py +++ b/vocode/streaming/synthesizer/bark_synthesizer.py @@ -60,6 +60,7 @@ async def create_speech( write_wav(output_bytes_io, self.SAMPLE_RATE, int_audio_arr) result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 912315a1b0..99733fbdc8 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -67,7 +67,7 @@ def __init__(self, chunk: bytes, is_last_chunk: bool): def __init__( self, chunk_generator: AsyncGenerator[ChunkResult, None], - get_message_up_to: Callable[[int], str], + get_message_up_to: Callable[[float], str], ): self.chunk_generator = chunk_generator self.get_message_up_to = get_message_up_to @@ -172,20 +172,23 @@ def ready_synthesizer(self): pass # given the number of seconds the message was allowed to go until, where did we get in the message? + @staticmethod def get_message_cutoff_from_total_response_length( - self, message: BaseMessage, seconds: int, size_of_output: int + synthesizer_config: SynthesizerConfig, + message: BaseMessage, + seconds: float, + size_of_output: int, ) -> str: - estimated_output_seconds = ( - size_of_output / self.synthesizer_config.sampling_rate - ) + estimated_output_seconds = size_of_output / synthesizer_config.sampling_rate if not message.text: return message.text estimated_output_seconds_per_char = estimated_output_seconds / len(message.text) return message.text[: int(seconds / estimated_output_seconds_per_char)] + @staticmethod def get_message_cutoff_from_voice_speed( - self, message: BaseMessage, seconds: int, words_per_minute: int + message: BaseMessage, seconds: float, words_per_minute: int ) -> str: words_per_second = words_per_minute / 60 estimated_words_spoken = math.floor(words_per_second * seconds) @@ -203,19 +206,21 @@ async def create_speech( raise NotImplementedError # @param file - a file-like object in wav format + @staticmethod def create_synthesis_result_from_wav( - self, file: Any, message: BaseMessage, chunk_size: int + synthesizer_config: SynthesizerConfig, + file: Any, + message: BaseMessage, + chunk_size: int, ) -> SynthesisResult: output_bytes = convert_wav( file, - output_sample_rate=self.synthesizer_config.sampling_rate, - output_encoding=self.synthesizer_config.audio_encoding, + output_sample_rate=synthesizer_config.sampling_rate, + output_encoding=synthesizer_config.audio_encoding, ) - if self.synthesizer_config.should_encode_as_wav: - chunk_transform = lambda chunk: encode_as_wav( - chunk, self.synthesizer_config - ) + if synthesizer_config.should_encode_as_wav: + chunk_transform = lambda chunk: encode_as_wav(chunk, synthesizer_config) else: chunk_transform = lambda chunk: chunk @@ -232,8 +237,8 @@ async def chunk_generator(output_bytes): return SynthesisResult( chunk_generator(output_bytes), - lambda seconds: self.get_message_cutoff_from_total_response_length( - message, seconds, len(output_bytes) + lambda seconds: BaseSynthesizer.get_message_cutoff_from_total_response_length( + synthesizer_config, message, seconds, len(output_bytes) ), ) diff --git a/vocode/streaming/synthesizer/coqui_synthesizer.py b/vocode/streaming/synthesizer/coqui_synthesizer.py index d261ae2eb0..8bd8093aa0 100644 --- a/vocode/streaming/synthesizer/coqui_synthesizer.py +++ b/vocode/streaming/synthesizer/coqui_synthesizer.py @@ -86,6 +86,7 @@ async def create_speech( ) result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=io.BytesIO(read_response), message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/coqui_tts_synthesizer.py b/vocode/streaming/synthesizer/coqui_tts_synthesizer.py index d01c2df903..45bacb8956 100644 --- a/vocode/streaming/synthesizer/coqui_tts_synthesizer.py +++ b/vocode/streaming/synthesizer/coqui_tts_synthesizer.py @@ -77,7 +77,10 @@ async def create_speech( audio_segment.export(output_bytes_io, format="wav") # type: ignore result = self.create_synthesis_result_from_wav( - file=output_bytes_io, message=message, chunk_size=chunk_size + synthesizer_config=self.synthesizer_config, + file=output_bytes_io, + message=message, + chunk_size=chunk_size, ) convert_span.end() diff --git a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py index 0b18adad8d..051d0900bd 100644 --- a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py @@ -108,6 +108,7 @@ async def create_speech( output_bytes_io = decode_mp3(audio_data) result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/google_synthesizer.py b/vocode/streaming/synthesizer/google_synthesizer.py index d0e4384959..9014bf7d82 100644 --- a/vocode/streaming/synthesizer/google_synthesizer.py +++ b/vocode/streaming/synthesizer/google_synthesizer.py @@ -106,6 +106,7 @@ async def create_speech( output_bytes_io.seek(0) result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/gtts_synthesizer.py b/vocode/streaming/synthesizer/gtts_synthesizer.py index a58c79cbe2..5c49fb905e 100644 --- a/vocode/streaming/synthesizer/gtts_synthesizer.py +++ b/vocode/streaming/synthesizer/gtts_synthesizer.py @@ -60,6 +60,7 @@ def thread(): audio_segment.export(output_bytes_io, format="wav") # type: ignore result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer.py b/vocode/streaming/synthesizer/play_ht_synthesizer.py index 58185100d2..b80c021dfc 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer.py @@ -92,6 +92,7 @@ async def create_speech( output_bytes_io = decode_mp3(read_response) result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, diff --git a/vocode/streaming/synthesizer/polly_synthesizer.py b/vocode/streaming/synthesizer/polly_synthesizer.py index 94ab09c43c..da7bfc614a 100644 --- a/vocode/streaming/synthesizer/polly_synthesizer.py +++ b/vocode/streaming/synthesizer/polly_synthesizer.py @@ -70,7 +70,7 @@ def get_speech_marks(self, message: str) -> Any: def get_message_up_to( self, message: str, - seconds: int, + seconds: float, word_events, ) -> str: for event in word_events: diff --git a/vocode/streaming/synthesizer/rime_synthesizer.py b/vocode/streaming/synthesizer/rime_synthesizer.py index 435fbe5c08..0d103d041a 100644 --- a/vocode/streaming/synthesizer/rime_synthesizer.py +++ b/vocode/streaming/synthesizer/rime_synthesizer.py @@ -80,7 +80,10 @@ async def create_speech( audio_file = io.BytesIO(base64.b64decode(data.get("audioContent"))) result = self.create_synthesis_result_from_wav( - file=audio_file, message=message, chunk_size=chunk_size + synthesizer_config=self.synthesizer_config, + file=audio_file, + message=message, + chunk_size=chunk_size, ) convert_span.end() return result diff --git a/vocode/streaming/synthesizer/stream_elements_synthesizer.py b/vocode/streaming/synthesizer/stream_elements_synthesizer.py index b95a27ee28..b3a627b457 100644 --- a/vocode/streaming/synthesizer/stream_elements_synthesizer.py +++ b/vocode/streaming/synthesizer/stream_elements_synthesizer.py @@ -64,6 +64,7 @@ async def create_speech( audio_segment.export(output_bytes_io, format="wav") # type: ignore result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, file=output_bytes_io, message=message, chunk_size=chunk_size, From 41d8027ae5670d43352bb4a086d0f86054f06799 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 12 Sep 2023 13:36:44 -0700 Subject: [PATCH 026/148] Update ivr-navigation.mdx (#395) --- docs/ivr-navigation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ivr-navigation.mdx b/docs/ivr-navigation.mdx index c67f0cffec..11635ee8fb 100644 --- a/docs/ivr-navigation.mdx +++ b/docs/ivr-navigation.mdx @@ -4,7 +4,7 @@ description: "Navigate phone trees" --- Note: this feature is only useful on outbound calls, which are disabled by default. Please contact us through Discord or at support@vocode.dev -to discuss enabling this for your account! +to discuss enabling outbound calls for your account! The Vocode API has many tools for agents to interact with IVRs (interactive voice responses) - navigating phone trees is one of the primary use-cases of the API. From 381bf46a41524f07efb93226b3f812a60281e465 Mon Sep 17 00:00:00 2001 From: Eliot Hsu Date: Tue, 19 Sep 2023 16:52:51 -0700 Subject: [PATCH 027/148] Update autogenerated API reference (#400) --- docs/openapi.json | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/openapi.json b/docs/openapi.json index 59034f1e21..a38f50c4dd 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -94,6 +94,13 @@ "tags": ["numbers"], "summary": "Buy Number", "operationId": "buy_number", + "requestBody": { + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/BuyPhoneNumberRequest" } + } + } + }, "responses": { "200": { "description": "Successful Response", @@ -102,6 +109,14 @@ "schema": { "$ref": "#/components/schemas/PhoneNumber" } } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } } }, "security": [{ "HTTPBearer": [] }] @@ -1439,6 +1454,11 @@ "enum": ["default", "off"], "title": "Ivr Navigation Mode", "default": "off" + }, + "conversation_speed": { + "type": "number", + "title": "Conversation Speed", + "default": 1.0 } }, "type": "object", @@ -1542,6 +1562,11 @@ "enum": ["default", "off"], "title": "Ivr Navigation Mode", "default": "off" + }, + "conversation_speed": { + "type": "number", + "title": "Conversation Speed", + "default": 1.0 } }, "type": "object", @@ -1668,6 +1693,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Ivr Navigation Mode" + }, + "conversation_speed": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Conversation Speed" } }, "type": "object", @@ -1738,6 +1770,13 @@ "required": ["type"], "title": "AzureVoiceUpdateParams" }, + "BuyPhoneNumberRequest": { + "properties": { + "area_code": { "type": "string", "title": "Area Code" } + }, + "type": "object", + "title": "BuyPhoneNumberRequest" + }, "Call": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -1910,6 +1949,11 @@ "enum": ["default", "off"], "title": "Ivr Navigation Mode", "default": "off" + }, + "conversation_speed": { + "type": "number", + "title": "Conversation Speed", + "default": 1.0 } }, "type": "object", @@ -2210,6 +2254,11 @@ "enum": ["default", "off"], "title": "Ivr Navigation Mode", "default": "off" + }, + "conversation_speed": { + "type": "number", + "title": "Conversation Speed", + "default": 1.0 } }, "type": "object", From 4234d8954ab01c6ee3c0b9b80acf10ca1753d39e Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 25 Sep 2023 20:34:09 -0700 Subject: [PATCH 028/148] bumps openapi spec (#406) --- docs/openapi.json | 84 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index a38f50c4dd..fe2177ed49 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1981,6 +1981,11 @@ "type": "boolean", "title": "Hipaa Compliant", "default": false + }, + "context": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Context" } }, "type": "object", @@ -2336,6 +2341,27 @@ "required": ["id", "user_id", "inbound_agent", "number"], "title": "NormalizedPhoneNumber" }, + "NormalizedPrompt": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "content": { "type": "string", "title": "Content", "default": "" }, + "collect_fields": { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array", + "title": "Collect Fields" + }, + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "prompt_template": { + "type": "string", + "format": "uuid", + "title": "Prompt Template" + } + }, + "type": "object", + "required": ["id", "user_id"], + "title": "NormalizedPrompt" + }, "PhoneNumber": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -2438,7 +2464,12 @@ }, "PlanType": { "type": "string", - "enum": ["plan_free", "plan_developer", "plan_enterprise"], + "enum": [ + "plan_free", + "plan_developer", + "plan_enterprise", + "plan_unlimited" + ], "title": "PlanType", "description": "An enumeration." }, @@ -2518,22 +2549,23 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "content": { "type": "string", "title": "Content" }, + "content": { "type": "string", "title": "Content", "default": "" }, "collect_fields": { "items": { "$ref": "#/components/schemas/CollectField" }, "type": "array", "title": "Collect Fields" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "prompt_template": { "$ref": "#/components/schemas/PromptTemplate" } }, "type": "object", - "required": ["id", "user_id", "content"], + "required": ["id", "user_id"], "title": "Prompt" }, "PromptPage": { "properties": { "items": { - "items": { "$ref": "#/components/schemas/Prompt" }, + "items": { "$ref": "#/components/schemas/NormalizedPrompt" }, "type": "array", "title": "Items" }, @@ -2547,18 +2579,39 @@ }, "PromptParams": { "properties": { - "content": { "type": "string", "title": "Content" }, + "content": { "type": "string", "title": "Content", "default": "" }, "collect_fields": { "items": { "$ref": "#/components/schemas/CollectField" }, "type": "array", "title": "Collect Fields" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" } + "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "prompt_template": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptTemplate" } + ], + "title": "Prompt Template" + } }, "type": "object", - "required": ["content"], "title": "PromptParams" }, + "PromptTemplate": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "label": { "type": "string", "title": "Label", "default": "" }, + "required_context_keys": { + "items": { "type": "string" }, + "type": "array", + "title": "Required Context Keys" + } + }, + "type": "object", + "required": ["id", "user_id", "required_context_keys"], + "title": "PromptTemplate" + }, "PromptUpdateParams": { "properties": { "content": { @@ -2584,6 +2637,14 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Context Endpoint" + }, + "prompt_template": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/PromptTemplate" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Prompt Template" } }, "type": "object", @@ -2724,12 +2785,7 @@ } }, "type": "object", - "required": [ - "user_id", - "plan_type", - "monthly_usage_minutes", - "monthly_usage_limit_minutes" - ], + "required": ["user_id", "plan_type", "monthly_usage_minutes"], "title": "Usage" }, "ValidationError": { From ef0edf7bcaeb9cd2d3d85db065c96859b78dc077 Mon Sep 17 00:00:00 2001 From: shobhitsrivastava <2shobhitsriv6@gmail.com> Date: Tue, 3 Oct 2023 15:00:11 -0400 Subject: [PATCH 029/148] Fix transcript event manager handling (#408) Co-authored-by: Shobhit --- vocode/streaming/client_backend/conversation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vocode/streaming/client_backend/conversation.py b/vocode/streaming/client_backend/conversation.py index a9977c01b9..1d7b008739 100644 --- a/vocode/streaming/client_backend/conversation.py +++ b/vocode/streaming/client_backend/conversation.py @@ -122,7 +122,7 @@ def __init__( self.output_device = output_device self.logger = logger or logging.getLogger(__name__) - def handle_event(self, event: Event): + async def handle_event(self, event: Event): if event.type == EventType.TRANSCRIPT: transcript_event = typing.cast(TranscriptEvent, event) self.output_device.consume_transcript(transcript_event) From 116de1d147b5df81ad6253316eaba63cd763caef Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 4 Oct 2023 19:35:02 -0700 Subject: [PATCH 030/148] bump for update openapi spec (#409) --- docs/openapi.json | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index fe2177ed49..2ee79c40cd 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -356,7 +356,7 @@ "responses": { "200": { "description": "Successful Response", - "content": { "application/json": { "schema": {} } } + "content": { "audio/mpeg": {} } }, "422": { "description": "Validation Error", @@ -1792,10 +1792,10 @@ "default": false }, "transcript": { "type": "string", "title": "Transcript" }, - "machine_detection_result": { + "human_detection_result": { "type": "string", - "enum": ["human", "machine"], - "title": "Machine Detection Result" + "enum": ["human", "no_human"], + "title": "Human Detection Result" }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, @@ -1818,6 +1818,11 @@ "type": "boolean", "title": "Hipaa Compliant", "default": false + }, + "on_no_human_answer": { + "type": "string", + "enum": ["continue", "hangup"], + "title": "On No Human Answer" } }, "type": "object", @@ -1971,10 +1976,10 @@ ], "title": "Agent" }, - "on_machine_answer": { + "on_no_human_answer": { "type": "string", "enum": ["continue", "hangup"], - "title": "On Machine Answer", + "title": "On No Human Answer", "default": "continue" }, "hipaa_compliant": { @@ -2174,7 +2179,7 @@ "event_phone_call_ended", "event_transcript", "event_recording", - "event_machine_detection" + "event_human_detection" ], "title": "EventType", "description": "An enumeration." @@ -2285,10 +2290,10 @@ "default": false }, "transcript": { "type": "string", "title": "Transcript" }, - "machine_detection_result": { + "human_detection_result": { "type": "string", - "enum": ["human", "machine"], - "title": "Machine Detection Result" + "enum": ["human", "no_human"], + "title": "Human Detection Result" }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, @@ -2311,6 +2316,11 @@ "type": "boolean", "title": "Hipaa Compliant", "default": false + }, + "on_no_human_answer": { + "type": "string", + "enum": ["continue", "hangup"], + "title": "On No Human Answer" } }, "type": "object", @@ -2335,6 +2345,11 @@ "format": "uuid", "title": "Inbound Agent" }, + "outbound_only": { + "type": "boolean", + "title": "Outbound Only", + "default": false + }, "number": { "type": "string", "title": "Number" } }, "type": "object", @@ -2369,6 +2384,11 @@ "active": { "type": "boolean", "title": "Active", "default": true }, "label": { "type": "string", "title": "Label", "default": "" }, "inbound_agent": { "$ref": "#/components/schemas/Agent" }, + "outbound_only": { + "type": "boolean", + "title": "Outbound Only", + "default": false + }, "number": { "type": "string", "title": "Number" } }, "type": "object", From c16fe3a7bf9212d5ad29a9c4b8a9ccfa5dfd5ce4 Mon Sep 17 00:00:00 2001 From: Eliot Hsu Date: Fri, 13 Oct 2023 12:09:52 -0700 Subject: [PATCH 031/148] bump openapi spec (#414) --- docs/openapi.json | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 2ee79c40cd..7eb7bc615f 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2350,6 +2350,11 @@ "title": "Outbound Only", "default": false }, + "example_context": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Example Context" + }, "number": { "type": "string", "title": "Number" } }, "type": "object", @@ -2389,6 +2394,11 @@ "title": "Outbound Only", "default": false }, + "example_context": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Example Context" + }, "number": { "type": "string", "title": "Number" } }, "type": "object", @@ -2504,17 +2514,16 @@ }, "voice_id": { "type": "string", "title": "Voice Id" }, "api_user_id": { "type": "string", "title": "Api User Id" }, - "api_key": { "type": "string", "title": "Api Key" } + "api_key": { "type": "string", "title": "Api Key" }, + "version": { + "type": "string", + "enum": ["1", "2"], + "title": "Version", + "default": "2" + } }, "type": "object", - "required": [ - "id", - "user_id", - "type", - "voice_id", - "api_user_id", - "api_key" - ], + "required": ["id", "user_id", "type", "voice_id"], "title": "PlayHtVoice" }, "PlayHtVoiceParams": { @@ -2526,10 +2535,16 @@ }, "voice_id": { "type": "string", "title": "Voice Id" }, "api_user_id": { "type": "string", "title": "Api User Id" }, - "api_key": { "type": "string", "title": "Api Key" } + "api_key": { "type": "string", "title": "Api Key" }, + "version": { + "type": "string", + "enum": ["1", "2"], + "title": "Version", + "default": "2" + } }, "type": "object", - "required": ["type", "voice_id", "api_user_id", "api_key"], + "required": ["type", "voice_id"], "title": "PlayHtVoiceParams" }, "PlayHtVoiceUpdateParams": { @@ -2559,6 +2574,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Api Key" + }, + "version": { + "anyOf": [ + { "type": "string", "enum": ["1", "2"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Version" } }, "type": "object", From 9b413bb425d17484ea2551f6d4964bc95fd6cac6 Mon Sep 17 00:00:00 2001 From: Eliot Hsu Date: Wed, 25 Oct 2023 10:54:40 -0700 Subject: [PATCH 032/148] bump openapi spec (#424) --- docs/openapi.json | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 7eb7bc615f..95febba673 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1797,6 +1797,10 @@ "enum": ["human", "no_human"], "title": "Human Detection Result" }, + "do_not_call_result": { + "type": "boolean", + "title": "Do Not Call Result" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, @@ -1823,6 +1827,15 @@ "type": "string", "enum": ["continue", "hangup"], "title": "On No Human Answer" + }, + "context": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Context" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection" } }, "type": "object", @@ -1982,6 +1995,11 @@ "title": "On No Human Answer", "default": "continue" }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection", + "default": false + }, "hipaa_compliant": { "type": "boolean", "title": "Hipaa Compliant", @@ -2295,6 +2313,10 @@ "enum": ["human", "no_human"], "title": "Human Detection Result" }, + "do_not_call_result": { + "type": "boolean", + "title": "Do Not Call Result" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, @@ -2321,6 +2343,15 @@ "type": "string", "enum": ["continue", "hangup"], "title": "On No Human Answer" + }, + "context": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Context" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection" } }, "type": "object", @@ -2520,7 +2551,8 @@ "enum": ["1", "2"], "title": "Version", "default": "2" - } + }, + "speed": { "type": "number", "title": "Speed" } }, "type": "object", "required": ["id", "user_id", "type", "voice_id"], @@ -2541,7 +2573,8 @@ "enum": ["1", "2"], "title": "Version", "default": "2" - } + }, + "speed": { "type": "number", "title": "Speed" } }, "type": "object", "required": ["type", "voice_id"], @@ -2581,6 +2614,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Version" + }, + "speed": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Speed" } }, "type": "object", From 8d3239f639dfd76cee0d695615e58992aa01f400 Mon Sep 17 00:00:00 2001 From: Eliot Hsu Date: Tue, 31 Oct 2023 18:31:53 -0700 Subject: [PATCH 033/148] docs update (#429) * docs update * fix --- docs/do-not-call-detection.mdx | 52 ++++++++++++++++++++++++++++++++++ docs/mint.json | 3 +- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 docs/do-not-call-detection.mdx diff --git a/docs/do-not-call-detection.mdx b/docs/do-not-call-detection.mdx new file mode 100644 index 0000000000..c93338180b --- /dev/null +++ b/docs/do-not-call-detection.mdx @@ -0,0 +1,52 @@ +--- +title: "[Beta] Do Not Call detection" +description: "Configure whether or not to run automatic estimated Do Not Call analysis" +--- + +The Vocode API allows you to configure whether or not to run automatic rudimentary detection +on outbound calls as to whether or not the receiving party has indicated they would like to +be placed on a Do Not Call list. Additionally, if Do Not Call analysis was run on a call, +the result will be populated into a field on the Call object returned from the Get Call endpoint. + +By default, if the `run_do_not_call_detection` argument is not supplied, Vocode will not run +Do Not Call detection. + +# Example 1: Run Do Not Call detection on an outbound call, and retrieve the result + +The `run_do_not_call_detection` parameter on outbound call creation defines whether +or not to run rudimentary Do Not Call analysis. + +```python +from vocode import CreateCallAgentParams + +vocode_client.calls.create_call( + from_number="", + to_number="15555555555", + agent=CreateCallAgentParams( + prompt=Prompt( + content="Ask Eliot if the sun is on today" + ), + ), + run_do_not_call_detection=True +) +``` + +After the call has completed, we can query for calls as usual, and find the returned Call object +has the Do Not Call detection result set: + +```python Python +vocode_client.calls.get_call(id="CALL_ID") +``` + +returning: + +```json +{ + "id": "call_id", + "to_number": "123456789", + "from_number": "123456789", + ... + "do_not_call_result": true, + ... +} +``` diff --git a/docs/mint.json b/docs/mint.json index c51c218c12..37518f38f7 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -174,7 +174,8 @@ "injecting-context", "machine-detection", "ivr-navigation", - "hipaa-compliance" + "hipaa-compliance", + "do-not-call-detection" ] } ], From b0806e7169f9520a1edb3f68911d4df6c2c32814 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 7 Nov 2023 16:22:32 -0800 Subject: [PATCH 034/148] update docs for machine detection (#434) --- docs/machine-detection.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/machine-detection.mdx b/docs/machine-detection.mdx index af38f81977..223ed7a9eb 100644 --- a/docs/machine-detection.mdx +++ b/docs/machine-detection.mdx @@ -1,5 +1,5 @@ --- -title: "[Beta] Answering machine detection" +title: "Answering machine detection" description: "Define the behavior of the bot when no one answers the phone" --- @@ -8,7 +8,7 @@ phone call is an answerphone as well as subscribe to events relating to machine # Example 1: Hang up the call if it goes to voicemail -The `on_machine_answer` parameter defines what should happen if a machine answers the phone. +The `on_no_human_answer` parameter defines what should happen if a machine answers the phone. ```python from vocode import CreateCallAgentParams @@ -21,14 +21,14 @@ vocode_client.calls.create_call( content="Ask Ajay if his refrigerator is running" ), ), - on_machine_answer="hangup" + on_no_human_answer="hangup" ) ``` # Example 2: Hook into when a call goes to voicemail -If you'd like the bot to stay on the call and leave a voicemail, set `on_machine_answer` to `"continue"`. You can -also configure a webhook to be fired when the answering machine detection status +If you'd like the bot to stay on the call and leave a voicemail, set `on_no_human_answer` to `"continue"`. You can +also configure a webhook to be fired when the answering machine detection status is populated. ```python from vocode import CreateCallAgentParams, PromptParams @@ -42,10 +42,10 @@ vocode_client.calls.create_call( ), webhook=WebhookParams( url="", - subscriptions=["event_machine_detection"] + subscriptions=["event_human_detection"] ) ), - on_machine_answer="continue" + on_no_human_answer="continue" ) ``` @@ -53,10 +53,10 @@ Once the call is picked up, the webhook URL configured above will get the follow ``` { - "type": "event_machine_detection", + "type": "event_human_detection", "call_id": "", "payload": { - "result": "machine" # or "human" + "result": "no_human" # or "human" } } ``` From a962141860e4e591817bc8c011fc7f9a821c09e0 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 24 Nov 2023 19:32:04 -0800 Subject: [PATCH 035/148] update openapi spec 11/24 (#444) --- docs/openapi.json | 209 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 201 insertions(+), 8 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 95febba673..70f61b5edb 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -97,7 +97,13 @@ "requestBody": { "content": { "application/json": { - "schema": { "$ref": "#/components/schemas/BuyPhoneNumberRequest" } + "schema": { + "allOf": [ + { "$ref": "#/components/schemas/BuyPhoneNumberRequest" } + ], + "title": "Request", + "default": { "telephony_provider": "vonage" } + } } } }, @@ -198,6 +204,42 @@ "security": [{ "HTTPBearer": [] }] } }, + "/v1/numbers/link": { + "post": { + "tags": ["numbers"], + "summary": "Link Number", + "operationId": "link_number", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkPhoneNumberRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/PhoneNumber" } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, "/v1/calls/list": { "get": { "tags": ["calls"], @@ -348,7 +390,7 @@ "parameters": [ { "required": true, - "schema": { "type": "string", "title": "Id" }, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", "in": "query" } @@ -1459,6 +1501,11 @@ "type": "number", "title": "Conversation Speed", "default": 1.0 + }, + "initial_message_delay": { + "type": "number", + "title": "Initial Message Delay", + "default": 0.0 } }, "type": "object", @@ -1567,6 +1614,11 @@ "type": "number", "title": "Conversation Speed", "default": 1.0 + }, + "initial_message_delay": { + "type": "number", + "title": "Initial Message Delay", + "default": 0.0 } }, "type": "object", @@ -1700,6 +1752,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Conversation Speed" + }, + "initial_message_delay": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Initial Message Delay" } }, "type": "object", @@ -1772,7 +1831,18 @@ }, "BuyPhoneNumberRequest": { "properties": { - "area_code": { "type": "string", "title": "Area Code" } + "area_code": { "type": "string", "title": "Area Code" }, + "telephony_provider": { + "type": "string", + "enum": ["vonage", "twilio"], + "title": "Telephony Provider", + "default": "vonage" + }, + "telephony_account_connection": { + "type": "string", + "format": "uuid", + "title": "Telephony Account Connection" + } }, "type": "object", "title": "BuyPhoneNumberRequest" @@ -1801,9 +1871,15 @@ "type": "boolean", "title": "Do Not Call Result" }, + "telephony_id": { "type": "string", "title": "Telephony Id" }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, + "telephony_provider": { + "type": "string", + "enum": ["vonage", "twilio"], + "title": "Telephony Provider" + }, "agent_phone_number": { "type": "string", "title": "Agent Phone Number" @@ -1845,6 +1921,7 @@ "to_number", "from_number", "agent", + "telephony_provider", "agent_phone_number" ], "title": "Call" @@ -1972,6 +2049,11 @@ "type": "number", "title": "Conversation Speed", "default": 1.0 + }, + "initial_message_delay": { + "type": "number", + "title": "Initial Message Delay", + "default": 0.0 } }, "type": "object", @@ -2074,7 +2156,12 @@ "voice_id": { "type": "string", "title": "Voice Id" }, "stability": { "type": "number", "title": "Stability" }, "similarity_boost": { "type": "number", "title": "Similarity Boost" }, - "api_key": { "type": "string", "title": "Api Key" } + "api_key": { "type": "string", "title": "Api Key" }, + "optimize_streaming_latency": { + "type": "integer", + "title": "Optimize Streaming Latency" + }, + "model_id": { "type": "string", "title": "Model Id" } }, "type": "object", "required": ["id", "user_id", "type", "voice_id"], @@ -2090,7 +2177,12 @@ "voice_id": { "type": "string", "title": "Voice Id" }, "stability": { "type": "number", "title": "Stability" }, "similarity_boost": { "type": "number", "title": "Similarity Boost" }, - "api_key": { "type": "string", "title": "Api Key" } + "api_key": { "type": "string", "title": "Api Key" }, + "optimize_streaming_latency": { + "type": "integer", + "title": "Optimize Streaming Latency" + }, + "model_id": { "type": "string", "title": "Model Id" } }, "type": "object", "required": ["type", "voice_id"], @@ -2130,6 +2222,20 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Api Key" + }, + "optimize_streaming_latency": { + "anyOf": [ + { "type": "integer" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Optimize Streaming Latency" + }, + "model_id": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Model Id" } }, "type": "object", @@ -2231,6 +2337,24 @@ "title": "Language", "description": "An enumeration." }, + "LinkPhoneNumberRequest": { + "properties": { + "phone_number": { "type": "string", "title": "Phone Number" }, + "telephony_account_connection": { + "type": "string", + "format": "uuid", + "title": "Telephony Account Connection" + }, + "outbound_only": { + "type": "boolean", + "title": "Outbound Only", + "default": false + } + }, + "type": "object", + "required": ["phone_number", "telephony_account_connection"], + "title": "LinkPhoneNumberRequest" + }, "NormalizedAgent": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -2287,6 +2411,11 @@ "type": "number", "title": "Conversation Speed", "default": 1.0 + }, + "initial_message_delay": { + "type": "number", + "title": "Initial Message Delay", + "default": 0.0 } }, "type": "object", @@ -2317,9 +2446,15 @@ "type": "boolean", "title": "Do Not Call Result" }, + "telephony_id": { "type": "string", "title": "Telephony Id" }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, + "telephony_provider": { + "type": "string", + "enum": ["vonage", "twilio"], + "title": "Telephony Provider" + }, "agent_phone_number": { "type": "string", "title": "Agent Phone Number" @@ -2361,6 +2496,7 @@ "to_number", "from_number", "agent", + "telephony_provider", "agent_phone_number" ], "title": "NormalizedCall" @@ -2386,7 +2522,20 @@ "type": "object", "title": "Example Context" }, - "number": { "type": "string", "title": "Number" } + "number": { "type": "string", "title": "Number" }, + "telephony_provider": { + "type": "string", + "enum": ["vonage", "twilio"], + "title": "Telephony Provider", + "default": "vonage" + }, + "telephony_account_connection": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/TwilioAccountConnection" } + ], + "title": "Telephony Account Connection" + } }, "type": "object", "required": ["id", "user_id", "inbound_agent", "number"], @@ -2430,7 +2579,16 @@ "type": "object", "title": "Example Context" }, - "number": { "type": "string", "title": "Number" } + "number": { "type": "string", "title": "Number" }, + "telephony_provider": { + "type": "string", + "enum": ["vonage", "twilio"], + "title": "Telephony Provider", + "default": "vonage" + }, + "telephony_account_connection": { + "$ref": "#/components/schemas/TwilioAccountConnection" + } }, "type": "object", "required": ["id", "user_id", "inbound_agent", "number"], @@ -2831,7 +2989,42 @@ "required": ["phone_number"], "title": "TransferCallConfig" }, - "Undefined": { "properties": {}, "type": "object", "title": "Undefined" }, + "TwilioAccountConnection": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["account_connection_twilio"], + "title": "Type" + }, + "credentials": { "$ref": "#/components/schemas/TwilioCredentials" } + }, + "type": "object", + "required": ["id", "user_id", "type", "credentials"], + "title": "TwilioAccountConnection" + }, + "TwilioCredentials": { + "properties": { + "twilio_account_sid": { + "type": "string", + "title": "Twilio Account Sid" + }, + "twilio_auth_token": { + "type": "string", + "title": "Twilio Auth Token" + } + }, + "type": "object", + "required": ["twilio_account_sid", "twilio_auth_token"], + "title": "TwilioCredentials" + }, + "Undefined": { + "properties": {}, + "additionalProperties": false, + "type": "object", + "title": "Undefined" + }, "UpdateNumberRequest": { "properties": { "label": { From 6b6ff5a70d53c80178afc12fb8f98d964127acab Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Mon, 27 Nov 2023 10:28:26 -0800 Subject: [PATCH 036/148] updated hosted-api docs (#445) --- docs/do-not-call-detection.mdx | 4 ++-- docs/injecting-context.mdx | 8 ++++--- docs/machine-detection.mdx | 6 +++--- docs/retrieve-call-data.mdx | 4 ++-- docs/setting-up-webhook.mdx | 2 +- docs/using-actions.mdx | 38 +++++++++++++++++++--------------- docs/vectordb.mdx | 14 +++++++------ 7 files changed, 42 insertions(+), 34 deletions(-) diff --git a/docs/do-not-call-detection.mdx b/docs/do-not-call-detection.mdx index c93338180b..5045712472 100644 --- a/docs/do-not-call-detection.mdx +++ b/docs/do-not-call-detection.mdx @@ -17,13 +17,13 @@ The `run_do_not_call_detection` parameter on outbound call creation defines whet or not to run rudimentary Do Not Call analysis. ```python -from vocode import CreateCallAgentParams +from vocode import CreateCallAgentParams, PromptParams vocode_client.calls.create_call( from_number="", to_number="15555555555", agent=CreateCallAgentParams( - prompt=Prompt( + prompt=PromptParams( content="Ask Eliot if the sun is on today" ), ), diff --git a/docs/injecting-context.mdx b/docs/injecting-context.mdx index 4390c1116c..75341f349d 100644 --- a/docs/injecting-context.mdx +++ b/docs/injecting-context.mdx @@ -24,13 +24,15 @@ In order to have your bot use injected variables, the prompt must include templa our prompt to accept a user's first name and link it to our context endpoint. ```python -from vocode import AgentUpdateParams +from vocode import AgentUpdateParams, PromptUpdateParams name_prompt = "You are talking to ${name}" number = vocode_client.numbers.update_number( phone_number="YOUR_NUMBER", - inbound_agent=AgentUpdateParams(prompt=name_prompt), - context_endpoint="YOUR_CONTEXT_URL" + inbound_agent=AgentUpdateParams( + prompt=PromptUpdateParams(content=name_prompt), + context_endpoint="YOUR_CONTEXT_URL", + ), ) ``` diff --git a/docs/machine-detection.mdx b/docs/machine-detection.mdx index 223ed7a9eb..d3c81aaa59 100644 --- a/docs/machine-detection.mdx +++ b/docs/machine-detection.mdx @@ -11,17 +11,17 @@ phone call is an answerphone as well as subscribe to events relating to machine The `on_no_human_answer` parameter defines what should happen if a machine answers the phone. ```python -from vocode import CreateCallAgentParams +from vocode import CreateCallAgentParams, PromptParams vocode_client.calls.create_call( from_number="", to_number="15555555555", agent=CreateCallAgentParams( - prompt=Prompt( + prompt=PromptParams( content="Ask Ajay if his refrigerator is running" ), ), - on_no_human_answer="hangup" + on_no_human_answer="hangup", ) ``` diff --git a/docs/retrieve-call-data.mdx b/docs/retrieve-call-data.mdx index b3b808def3..521f8c4e79 100644 --- a/docs/retrieve-call-data.mdx +++ b/docs/retrieve-call-data.mdx @@ -91,12 +91,12 @@ If you enabled call recording, you can download the call recording file. ```python Python -vocode_client.calls.recording(id="CALL_ID") +vocode_client.calls.get_recording(id="CALL_ID") ``` ```javascript TypeScript const calls = await vocode.calls.listCalls(); -const recording = await vocode.calls.recording({ id: calls[0].id }); +const recording = await vocode.calls.get_recording({ id: calls[0].id }); ``` ```curl cURL diff --git a/docs/setting-up-webhook.mdx b/docs/setting-up-webhook.mdx index bdff2ba2ca..4f56f40f92 100644 --- a/docs/setting-up-webhook.mdx +++ b/docs/setting-up-webhook.mdx @@ -57,4 +57,4 @@ The full list of `EventType` is listed here: - `EVENT_PHONE_CALL_ENDED`: Indicating the phone call has ended. - `EVENT_TRANSCRIPT`: The transcription of the entire conversation. - `EVENT_RECORDING`: The recording of the conversation has become available. -- `EVENT_MACHINE_DETECTION`: Indicating whether a human or a machine has picked up the phone. +- `EVENT_HUMAN_DETECTION`: Indicating whether a human or a machine has picked up the phone. diff --git a/docs/using-actions.mdx b/docs/using-actions.mdx index b4a74b34db..050620bddd 100644 --- a/docs/using-actions.mdx +++ b/docs/using-actions.mdx @@ -11,9 +11,9 @@ Agents on phone calls can take three actions: ```python Python vocode_client.actions.create_action( - request=CreateActionRequest( - type="action_end_conversation", - ) + request={ + "type": "action_end_conversation", + } ) ``` @@ -41,9 +41,9 @@ curl --request POST \ ```python Python vocode_client.actions.create_action( - request=CreateActionRequest( - type="action_dtmf", - ) + request={ + "type":"action_dtmf", + } ) ``` @@ -71,12 +71,12 @@ curl --request POST \ ```python Python vocode_client.actions.create_action( - request=CreateActionRequest( - type="action_transfer_call", - config=TransferCallActionUpdateParamsConfig( - phone_number="11234567890" - ) - ) + request={ + "type":"action_transfer_call", + "config":{ + "phone_number":"11234567890" + } + } ) ``` @@ -109,9 +109,11 @@ You can attach these as IDs to your phone number agent as follows: ```python Python +from vocode import AgentUpdateParams + vocode_client.numbers.update_number( phone_number="11234567890", - inbound_agent=UpdateNumberRequestInboundAgent( + inbound_agent=AgentUpdateParams( actions=[""] ) ) @@ -145,14 +147,16 @@ You can also add these as actions as raw payloads as follows: ```python Python +from vocode import AgentUpdateParams, TransferCallActionUpdateParams + vocode_client.numbers.update_number( phone_number="11234567890", - inbound_agent=UpdateNumberRequestInboundAgent( + inbound_agent=AgentUpdateParams( actions=[TransferCallActionUpdateParams( type="action_transfer_call", - config=TransferCallActionUpdateParamsConfig( - phone_number="11234567890" - ) + config={ + "phone_number":"11234567890" + } )] ) ) diff --git a/docs/vectordb.mdx b/docs/vectordb.mdx index b8dc24b258..efcc3eb7b3 100644 --- a/docs/vectordb.mdx +++ b/docs/vectordb.mdx @@ -27,15 +27,17 @@ To add your vector database to your agent, you need to add a vector database con ```python update_agent.py -from vocode import PineconeVectorDatabaseUpdateParams +from vocode import AgentUpdateParams, PineconeVectorDatabaseUpdateParams agent = vocode_client.agents.update_agent( id="AGENT_ID", - request=PineconeVectorDatabaseUpdateParams( - type="vector_database_pinecone", - index="PINECONE_INDEX", - api_key="PINECONE_API_KEY", - api_environment="PINECONE_API_ENVIRONMENT", + request=AgentUpdateParams( + vector_database=PineconeVectorDatabaseUpdateParams( + type="vector_database_pinecone", + index="PINECONE_INDEX", + api_key="PINECONE_API_KEY", + api_environment="PINECONE_API_ENVIRONMENT", + ) ), ) ``` From 5b42c89f6bccf1ebabf82e7dc9e47565c4330e97 Mon Sep 17 00:00:00 2001 From: Jean-Louis Queguiner Date: Wed, 29 Nov 2023 16:11:55 -0800 Subject: [PATCH 037/148] Update README.md (#405) --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1cc6075a8f..a01434cdf4 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,15 @@ We're actively looking for community maintainers, so please reach out if interes - 🤖 [Use an outbound call to a real phone number in a Langchain agent](https://docs.vocode.dev/langchain-agent) - Out of the box integrations with: - Transcription services, including: - - [Deepgram](https://deepgram.com/) - [AssemblyAI](https://www.assemblyai.com/) + - [Deepgram](https://deepgram.com/) + - [Gladia](https://gladia.io) - [Google Cloud](https://cloud.google.com/speech-to-text) - - [Whisper.cpp](https://github.com/ggerganov/whisper.cpp) - [Microsoft Azure](https://azure.microsoft.com/en-us/products/cognitive-services/speech-to-text) - - [Whisper](https://openai.com/blog/introducing-chatgpt-and-whisper-apis) - [RevAI](https://www.rev.ai/) + - [Whisper](https://openai.com/blog/introducing-chatgpt-and-whisper-apis) + - [Whisper.cpp](https://github.com/ggerganov/whisper.cpp) + - LLMs, including: - [ChatGPT](https://openai.com/blog/chatgpt) - [GPT-4](https://platform.openai.com/docs/models/gpt-4) From 09aed42612af1e92ffafb44744696300dd91a42b Mon Sep 17 00:00:00 2001 From: Stan Kirdey Date: Wed, 29 Nov 2023 19:19:29 -0800 Subject: [PATCH 038/148] exponential backoff to handle Play.ht 429s (#438) * exponential backoff to handle Play.ht 429s * fixing unit test --- tests/synthesizer/conftest.py | 24 ++--- .../synthesizer/play_ht_synthesizer.py | 87 +++++++++++-------- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/tests/synthesizer/conftest.py b/tests/synthesizer/conftest.py index 040ebeb189..c537e7ce1f 100644 --- a/tests/synthesizer/conftest.py +++ b/tests/synthesizer/conftest.py @@ -1,7 +1,10 @@ import pytest from aioresponses import aioresponses, CallbackResult from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig, PlayHtSynthesizerConfig +from vocode.streaming.models.synthesizer import ( + ElevenLabsSynthesizerConfig, + PlayHtSynthesizerConfig, +) import re from vocode.streaming.synthesizer.eleven_labs_synthesizer import ( ElevenLabsSynthesizer, @@ -9,7 +12,7 @@ ) from vocode.streaming.synthesizer.play_ht_synthesizer import ( PlayHtSynthesizer, - TTS_ENDPOINT + TTS_ENDPOINT, ) import re @@ -17,8 +20,7 @@ import asyncio import pytest -DEFAULT_PARAMS = {"sampling_rate": 16000, - "audio_encoding": AudioEncoding.LINEAR16} +DEFAULT_PARAMS = {"sampling_rate": 16000, "audio_encoding": AudioEncoding.LINEAR16} MOCK_API_KEY = "my_api_key" MOCK_USER_ID = "my_user_id" @@ -26,7 +28,9 @@ def create_eleven_labs_request_handler(optimize_streaming_latency=False): def request_handler(url, headers, **kwargs): - if optimize_streaming_latency and not re.search(r"optimize_streaming_latency=\d", url): + if optimize_streaming_latency and not re.search( + r"optimize_streaming_latency=\d", url + ): raise Exception("optimize_streaming_latency not found in url") if headers["xi-api-key"] != MOCK_API_KEY: return CallbackResult(status=401) @@ -39,8 +43,7 @@ def request_handler(url, headers, **kwargs): @pytest.fixture def mock_eleven_labs_api(): with aioresponses() as m: - pattern = re.compile( - rf"{re.escape(ELEVEN_LABS_BASE_URL)}text-to-speech/\w+") + pattern = re.compile(rf"{re.escape(ELEVEN_LABS_BASE_URL)}text-to-speech/\w+") m.post(pattern, callback=create_eleven_labs_request_handler()) yield m @@ -70,11 +73,12 @@ async def fixture_eleven_labs_synthesizer_env_api_key(): # PlayHT Setup + def create_play_ht_request_handler(): def request_handler(url, headers, **kwargs): - if headers["Authorization"] != f"Bearer {MOCK_API_KEY}": + if headers["AUTHORIZATION"] != f"Bearer {MOCK_API_KEY}": return CallbackResult(status=401) - if headers["X-User-ID"] != MOCK_USER_ID: + if headers["X-USER-ID"] != MOCK_USER_ID: return CallbackResult(status=401) with open(get_audio_path("fake_audio.mp3"), "rb") as audio_file: return CallbackResult(content_type="audio/mpeg", body=audio_file.read()) @@ -104,6 +108,7 @@ async def fixture_play_ht_synthesizer_wrong_api_key(): params["user_id"] = MOCK_USER_ID return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) + @pytest.fixture(scope="module") async def fixture_play_ht_synthesizer_wrong_user_id(): params = DEFAULT_PARAMS.copy() @@ -120,4 +125,3 @@ async def fixture_play_ht_synthesizer_env_api_key(): os.environ["PLAY_HT_API_KEY"] = MOCK_API_KEY os.environ["PLAY_HT_USER_ID"] = MOCK_USER_ID return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) - diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer.py b/vocode/streaming/synthesizer/play_ht_synthesizer.py index b80c021dfc..d6deb49afd 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer.py @@ -1,13 +1,8 @@ import asyncio -import io import logging from typing import Optional from aiohttp import ClientSession, ClientTimeout -from pydub import AudioSegment -import requests -from opentelemetry.context.context import Context - from vocode import getenv from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.message import BaseMessage @@ -19,7 +14,6 @@ ) from vocode.streaming.utils.mp3_helper import decode_mp3 - TTS_ENDPOINT = "https://play.ht/api/v2/tts/stream" @@ -29,6 +23,8 @@ def __init__( synthesizer_config: PlayHtSynthesizerConfig, logger: Optional[logging.Logger] = None, aiohttp_session: Optional[ClientSession] = None, + max_backoff_retries=3, + backoff_retry_delay=2, ): super().__init__(synthesizer_config, aiohttp_session) self.synthesizer_config = synthesizer_config @@ -40,6 +36,8 @@ def __init__( ) self.words_per_minute = 150 self.experimental_streaming = synthesizer_config.experimental_streaming + self.max_backoff_retries = max_backoff_retries + self.backoff_retry_delay = backoff_retry_delay async def create_speech( self, @@ -48,12 +46,13 @@ async def create_speech( bot_sentiment: Optional[BotSentiment] = None, ) -> SynthesisResult: headers = { - "Authorization": f"Bearer {self.api_key}", - "X-User-ID": self.user_id, + "AUTHORIZATION": f"Bearer {self.api_key}", + "X-USER-ID": self.user_id, "Accept": "audio/mpeg", "Content-Type": "application/json", } body = { + "quality": "draft", "voice": self.synthesizer_config.voice_id, "text": message.text, "sample_rate": self.synthesizer_config.sampling_rate, @@ -69,33 +68,49 @@ async def create_speech( f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.create_total", ) - response = await self.aiohttp_session.post( - TTS_ENDPOINT, headers=headers, json=body, timeout=ClientTimeout(total=15) - ) - if not response.ok: - raise Exception(f"Play.ht API error status code {response.status}") - if self.experimental_streaming: - return SynthesisResult( - self.experimental_mp3_streaming_output_generator( - response, chunk_size, create_speech_span - ), # should be wav - lambda seconds: self.get_message_cutoff_from_voice_speed( - message, seconds, self.words_per_minute - ), - ) - else: - read_response = await response.read() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.convert", - ) - output_bytes_io = decode_mp3(read_response) + backoff_retry_delay = self.backoff_retry_delay + max_backoff_retries = self.max_backoff_retries - result = self.create_synthesis_result_from_wav( - synthesizer_config=self.synthesizer_config, - file=output_bytes_io, - message=message, - chunk_size=chunk_size, + for attempt in range(max_backoff_retries): + response = await self.aiohttp_session.post( + TTS_ENDPOINT, + headers=headers, + json=body, + timeout=ClientTimeout(total=15), ) - convert_span.end() - return result + + if response.status == 429 and attempt < max_backoff_retries - 1: + await asyncio.sleep(backoff_retry_delay) + backoff_retry_delay *= 2 # Exponentially increase delay + continue + + if not response.ok: + raise Exception(f"Play.ht API error status code {response.status}") + + if self.experimental_streaming: + return SynthesisResult( + self.experimental_mp3_streaming_output_generator( + response, chunk_size, create_speech_span + ), + lambda seconds: self.get_message_cutoff_from_voice_speed( + message, seconds, self.words_per_minute + ), + ) + else: + read_response = await response.read() + create_speech_span.end() + convert_span = tracer.start_span( + f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.convert", + ) + output_bytes_io = decode_mp3(read_response) + + result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, + file=output_bytes_io, + message=message, + chunk_size=chunk_size, + ) + convert_span.end() + return result + + raise Exception("Max retries reached for Play.ht API") From e6d6d7331a4f038818bbc7e92dfabb667e7c6943 Mon Sep 17 00:00:00 2001 From: Stan Kirdey Date: Thu, 30 Nov 2023 11:18:12 -0800 Subject: [PATCH 039/148] Anthropic v0.7 (#437) * upgrading anthropic client to 0.7 * fixing mypy for anthropic client update --- .gitignore | 1 + poetry.lock | 56 ++++++++++++++--------- pyproject.toml | 2 +- vocode/streaming/agent/anthropic_agent.py | 36 +++++++-------- 4 files changed, 54 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 0743cc95c7..e0ff3f5c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ credentials.json benchmark_results/ private.key dump.rdb +.idea diff --git a/poetry.lock b/poetry.lock index 08b5eb058d..85c8605aec 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -152,23 +152,22 @@ frozenlist = ">=1.1.0" [[package]] name = "anthropic" -version = "0.2.10" -description = "Library for accessing the anthropic API" +version = "0.7.1" +description = "The official Python library for the anthropic API" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, - {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, + {file = "anthropic-0.7.1-py3-none-any.whl", hash = "sha256:116d009f1a01fa46f3213e1f0b57b79a5ce3f3c0b2bf14441f96c8de6399a4b4"}, + {file = "anthropic-0.7.1.tar.gz", hash = "sha256:c5559be61dc74499e713669ee9efc0da6f190870f32c9606d7ad989dea5bde82"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -requests = "*" -tokenizers = "*" - -[package.extras] -dev = ["black (>=22.3.0)", "pytest"] +anyio = ">=3.5.0,<4" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.5,<5" [[package]] name = "anyio" @@ -675,6 +674,17 @@ files = [ {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, ] +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + [[package]] name = "elevenlabs" version = "0.2.24" @@ -839,12 +849,12 @@ files = [ google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -932,8 +942,8 @@ google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = google-cloud-core = ">=1.6.0,<3.0.0dev" google-resumable-media = ">=0.6.0,<3.0dev" grpcio = [ - {version = ">=1.47.0,<2.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.49.1,<2.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.47.0,<2.0dev", markers = "python_version < \"3.11\""}, ] packaging = ">=20.0.0" proto-plus = ">=1.15.0,<2.0.0dev" @@ -984,8 +994,8 @@ files = [ google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" @@ -1003,8 +1013,8 @@ files = [ [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" @@ -1043,8 +1053,8 @@ files = [ [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, + {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" @@ -1176,6 +1186,7 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -1184,6 +1195,7 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -1213,6 +1225,7 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -1221,6 +1234,7 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -2993,7 +3007,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} typing-extensions = ">=4.2.0" [package.extras] @@ -3677,4 +3691,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "60ee4d2395b06922d238968909c009a25d709310e7eee66ddc4f5fb16463e74e" +content-hash = "280732b3a6ac72e26b018edf6f19dd19d01644b5725c2ecb0d7c713d84251c79" diff --git a/pyproject.toml b/pyproject.toml index 8236c0e5eb..4b0d71378e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ six = "^1.16.0" opentelemetry-sdk = "^1.17.0" janus = "^1.0.0" scipy = "^1.10.1" -anthropic = "^0.2.9" +anthropic = "^0.7.1" elevenlabs = {version = "^0.2.6", optional = true} google-cloud-texttospeech = {version = "^2.14.1", optional = true} diff --git a/vocode/streaming/agent/anthropic_agent.py b/vocode/streaming/agent/anthropic_agent.py index 6177512387..62c9459d08 100644 --- a/vocode/streaming/agent/anthropic_agent.py +++ b/vocode/streaming/agent/anthropic_agent.py @@ -58,7 +58,7 @@ def __init__( # streaming not well supported by langchain, so we will connect directly self.anthropic_client = ( - anthropic.Client(api_key=anthropic_api_key) + anthropic.AsyncAnthropic(api_key=anthropic_api_key) if agent_config.generate_responses else None ) @@ -98,25 +98,23 @@ async def generate_response( self.memory.chat_memory.messages.append(bot_memory_message) prompt = self.llm._convert_messages_to_prompt(self.memory.chat_memory.messages) - streamed_response = await self.anthropic_client.acompletion_stream( - prompt=prompt, - max_tokens_to_sample=self.agent_config.max_tokens_to_sample, - model=self.agent_config.model_name, - ) - - buffer = "" - async for message in streamed_response: - completion = message["completion"] - delta = completion[len(bot_memory_message.content + buffer) :] - buffer += delta - - sentence, remainder = get_sentence_from_buffer(buffer) + if self.anthropic_client: + streamed_response = await self.anthropic_client.completions.create( + prompt=prompt, + max_tokens_to_sample=self.agent_config.max_tokens_to_sample, + model=self.agent_config.model_name, + stream=True, + ) - if sentence: - bot_memory_message.content = bot_memory_message.content + sentence - buffer = remainder - yield sentence, True - continue + buffer = "" + async for completion in streamed_response: + buffer += completion.completion + sentence, remainder = get_sentence_from_buffer(buffer) + if sentence: + bot_memory_message.content = bot_memory_message.content + sentence + buffer = remainder + yield sentence, True + continue def update_last_bot_message_on_cut_off(self, message: str): for memory_message in self.memory.chat_memory.messages[::-1]: From 352661a5ee73432c961a0d47b0defab0160ce609 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 30 Nov 2023 11:21:53 -0800 Subject: [PATCH 040/148] bump openapi spec (#448) --- docs/openapi.json | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/docs/openapi.json b/docs/openapi.json index 70f61b5edb..0504aad6f1 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1506,6 +1506,13 @@ "type": "number", "title": "Initial Message Delay", "default": 0.0 + }, + "openai_model_name_override": { + "type": "string", + "title": "Openai Model Name Override" + }, + "openai_account_connection": { + "$ref": "#/components/schemas/OpenAIAccountConnection" } }, "type": "object", @@ -1619,6 +1626,17 @@ "type": "number", "title": "Initial Message Delay", "default": 0.0 + }, + "openai_model_name_override": { + "type": "string", + "title": "Openai Model Name Override" + }, + "openai_account_connection": { + "anyOf": [ + { "$ref": "#/components/schemas/OpenAIAccountConnection" }, + { "type": "string", "format": "uuid" } + ], + "title": "Openai Account Connection" } }, "type": "object", @@ -1759,6 +1777,21 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Initial Message Delay" + }, + "openai_model_name_override": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Openai Model Name Override" + }, + "openai_account_connection": { + "anyOf": [ + { "$ref": "#/components/schemas/OpenAIAccountConnection" }, + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Openai Account Connection" } }, "type": "object", @@ -1912,6 +1945,9 @@ "run_do_not_call_detection": { "type": "boolean", "title": "Run Do Not Call Detection" + }, + "telephony_account_connection": { + "$ref": "#/components/schemas/TwilioAccountConnection" } }, "type": "object", @@ -2054,6 +2090,17 @@ "type": "number", "title": "Initial Message Delay", "default": 0.0 + }, + "openai_model_name_override": { + "type": "string", + "title": "Openai Model Name Override" + }, + "openai_account_connection": { + "anyOf": [ + { "$ref": "#/components/schemas/OpenAIAccountConnection" }, + { "type": "string", "format": "uuid" } + ], + "title": "Openai Account Connection" } }, "type": "object", @@ -2416,6 +2463,17 @@ "type": "number", "title": "Initial Message Delay", "default": 0.0 + }, + "openai_model_name_override": { + "type": "string", + "title": "Openai Model Name Override" + }, + "openai_account_connection": { + "anyOf": [ + { "$ref": "#/components/schemas/OpenAIAccountConnection" }, + { "type": "string", "format": "uuid" } + ], + "title": "Openai Account Connection" } }, "type": "object", @@ -2487,6 +2545,13 @@ "run_do_not_call_detection": { "type": "boolean", "title": "Run Do Not Call Detection" + }, + "telephony_account_connection": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/TwilioAccountConnection" } + ], + "title": "Telephony Account Connection" } }, "type": "object", @@ -2562,6 +2627,29 @@ "required": ["id", "user_id"], "title": "NormalizedPrompt" }, + "OpenAIAccountConnection": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["account_connection_openai"], + "title": "Type" + }, + "credentials": { "$ref": "#/components/schemas/OpenAICredentials" } + }, + "type": "object", + "required": ["id", "user_id", "type", "credentials"], + "title": "OpenAIAccountConnection" + }, + "OpenAICredentials": { + "properties": { + "openai_api_key": { "type": "string", "title": "Openai Api Key" } + }, + "type": "object", + "required": ["openai_api_key"], + "title": "OpenAICredentials" + }, "PhoneNumber": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -3027,6 +3115,13 @@ }, "UpdateNumberRequest": { "properties": { + "outbound_only": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Outbound Only" + }, "label": { "anyOf": [ { "type": "string" }, From 0bbae013e942911b0bd1bb776ae3a7c665988416 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 30 Nov 2023 18:05:23 -0800 Subject: [PATCH 041/148] update openapi spec (#449) --- .../create-account-connection.mdx | 3 + .../get-account-connection.mdx | 3 + .../list-account-connections.mdx | 3 + .../update-account-connection.mdx | 3 + docs/api-reference/numbers/link-number.mdx | 3 + docs/openapi.json | 317 +++++++++++++++++- 6 files changed, 322 insertions(+), 10 deletions(-) create mode 100644 docs/api-reference/account_connections/create-account-connection.mdx create mode 100644 docs/api-reference/account_connections/get-account-connection.mdx create mode 100644 docs/api-reference/account_connections/list-account-connections.mdx create mode 100644 docs/api-reference/account_connections/update-account-connection.mdx create mode 100644 docs/api-reference/numbers/link-number.mdx diff --git a/docs/api-reference/account_connections/create-account-connection.mdx b/docs/api-reference/account_connections/create-account-connection.mdx new file mode 100644 index 0000000000..b80be41ef1 --- /dev/null +++ b/docs/api-reference/account_connections/create-account-connection.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/account_connections/create +--- \ No newline at end of file diff --git a/docs/api-reference/account_connections/get-account-connection.mdx b/docs/api-reference/account_connections/get-account-connection.mdx new file mode 100644 index 0000000000..58ada25026 --- /dev/null +++ b/docs/api-reference/account_connections/get-account-connection.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/account_connections +--- \ No newline at end of file diff --git a/docs/api-reference/account_connections/list-account-connections.mdx b/docs/api-reference/account_connections/list-account-connections.mdx new file mode 100644 index 0000000000..22b3bfd2ea --- /dev/null +++ b/docs/api-reference/account_connections/list-account-connections.mdx @@ -0,0 +1,3 @@ +--- +openapi: get /v1/account_connections/list +--- \ No newline at end of file diff --git a/docs/api-reference/account_connections/update-account-connection.mdx b/docs/api-reference/account_connections/update-account-connection.mdx new file mode 100644 index 0000000000..1cf3289b69 --- /dev/null +++ b/docs/api-reference/account_connections/update-account-connection.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/account_connections/update +--- \ No newline at end of file diff --git a/docs/api-reference/numbers/link-number.mdx b/docs/api-reference/numbers/link-number.mdx new file mode 100644 index 0000000000..416dce7b23 --- /dev/null +++ b/docs/api-reference/numbers/link-number.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /v1/numbers/link +--- \ No newline at end of file diff --git a/docs/openapi.json b/docs/openapi.json index 0504aad6f1..8b414b4d36 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1343,10 +1343,243 @@ }, "security": [{ "HTTPBearer": [] }] } + }, + "/v1/account_connections": { + "get": { + "tags": ["account_connections"], + "summary": "Get Account Connection", + "operationId": "get_account_connection", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/account_connections/list": { + "get": { + "tags": ["account_connections"], + "summary": "List Account Connections", + "operationId": "list_account_connections", + "parameters": [ + { + "required": false, + "schema": { "type": "integer", "title": "Page", "default": 1 }, + "name": "page", + "in": "query" + }, + { + "required": false, + "schema": { "type": "integer", "title": "Size", "default": 10 }, + "name": "size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionPage" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/account_connections/create": { + "post": { + "tags": ["account_connections"], + "summary": "Create Account Connection", + "operationId": "create_account_connection", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionParamsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/account_connections/update": { + "post": { + "tags": ["account_connections"], + "summary": "Update Account Connection", + "operationId": "update_account_connection", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionUpdateParamsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AccountConnectionResponseModel" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } } }, "components": { "schemas": { + "AccountConnectionPage": { + "properties": { + "items": { + "items": { + "oneOf": [ + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "$ref": "#/components/schemas/OpenAIAccountConnection" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "account_connection_twilio": "#/components/schemas/TwilioAccountConnection", + "account_connection_openai": "#/components/schemas/OpenAIAccountConnection" + } + } + }, + "type": "array", + "title": "Items" + }, + "page": { "type": "integer", "title": "Page" }, + "size": { "type": "integer", "title": "Size" }, + "has_more": { "type": "boolean", "title": "Has More" } + }, + "type": "object", + "required": ["items", "page", "size", "has_more"], + "title": "AccountConnectionPage" + }, + "AccountConnectionParamsRequest": { + "oneOf": [ + { "$ref": "#/components/schemas/TwilioAccountConnectionParams" }, + { "$ref": "#/components/schemas/OpenAIAccountConnectionParams" } + ], + "title": "AccountConnectionParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionParams", + "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionParams" + } + } + }, + "AccountConnectionResponseModel": { + "oneOf": [ + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "$ref": "#/components/schemas/OpenAIAccountConnection" } + ], + "title": "AccountConnectionResponseModel", + "discriminator": { + "propertyName": "type", + "mapping": { + "account_connection_twilio": "#/components/schemas/TwilioAccountConnection", + "account_connection_openai": "#/components/schemas/OpenAIAccountConnection" + } + } + }, + "AccountConnectionUpdateParamsRequest": { + "oneOf": [ + { + "$ref": "#/components/schemas/TwilioAccountConnectionUpdateParams" + }, + { "$ref": "#/components/schemas/OpenAIAccountConnectionUpdateParams" } + ], + "title": "AccountConnectionUpdateParamsRequest", + "discriminator": { + "propertyName": "type", + "mapping": { + "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionUpdateParams", + "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionUpdateParams" + } + } + }, "ActionPage": { "properties": { "items": { @@ -1477,7 +1710,7 @@ }, "interrupt_sensitivity": { "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], - "default": "high" + "default": "low" }, "context_endpoint": { "type": "string", "title": "Context Endpoint" }, "noise_suppression": { @@ -1597,7 +1830,7 @@ }, "interrupt_sensitivity": { "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], - "default": "high" + "default": "low" }, "context_endpoint": { "type": "string", "title": "Context Endpoint" }, "noise_suppression": { @@ -2061,7 +2294,7 @@ }, "interrupt_sensitivity": { "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], - "default": "high" + "default": "low" }, "context_endpoint": { "type": "string", "title": "Context Endpoint" }, "noise_suppression": { @@ -2434,7 +2667,7 @@ }, "interrupt_sensitivity": { "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], - "default": "high" + "default": "low" }, "context_endpoint": { "type": "string", "title": "Context Endpoint" }, "noise_suppression": { @@ -2631,17 +2864,49 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "credentials": { "$ref": "#/components/schemas/OpenAICredentials" }, "type": { "type": "string", "enum": ["account_connection_openai"], "title": "Type" - }, - "credentials": { "$ref": "#/components/schemas/OpenAICredentials" } + } }, "type": "object", - "required": ["id", "user_id", "type", "credentials"], + "required": ["id", "user_id", "credentials", "type"], "title": "OpenAIAccountConnection" }, + "OpenAIAccountConnectionParams": { + "properties": { + "credentials": { "$ref": "#/components/schemas/OpenAICredentials" }, + "type": { + "type": "string", + "enum": ["account_connection_openai"], + "title": "Type" + } + }, + "type": "object", + "required": ["credentials", "type"], + "title": "OpenAIAccountConnectionParams" + }, + "OpenAIAccountConnectionUpdateParams": { + "properties": { + "credentials": { + "anyOf": [ + { "$ref": "#/components/schemas/OpenAICredentials" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Credentials" + }, + "type": { + "type": "string", + "enum": ["account_connection_openai"], + "title": "Type" + } + }, + "type": "object", + "required": ["type"], + "title": "OpenAIAccountConnectionUpdateParams" + }, "OpenAICredentials": { "properties": { "openai_api_key": { "type": "string", "title": "Openai Api Key" } @@ -3081,17 +3346,49 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "credentials": { "$ref": "#/components/schemas/TwilioCredentials" }, "type": { "type": "string", "enum": ["account_connection_twilio"], "title": "Type" - }, - "credentials": { "$ref": "#/components/schemas/TwilioCredentials" } + } }, "type": "object", - "required": ["id", "user_id", "type", "credentials"], + "required": ["id", "user_id", "credentials", "type"], "title": "TwilioAccountConnection" }, + "TwilioAccountConnectionParams": { + "properties": { + "credentials": { "$ref": "#/components/schemas/TwilioCredentials" }, + "type": { + "type": "string", + "enum": ["account_connection_twilio"], + "title": "Type" + } + }, + "type": "object", + "required": ["credentials", "type"], + "title": "TwilioAccountConnectionParams" + }, + "TwilioAccountConnectionUpdateParams": { + "properties": { + "credentials": { + "anyOf": [ + { "$ref": "#/components/schemas/TwilioCredentials" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Credentials" + }, + "type": { + "type": "string", + "enum": ["account_connection_twilio"], + "title": "Type" + } + }, + "type": "object", + "required": ["type"], + "title": "TwilioAccountConnectionUpdateParams" + }, "TwilioCredentials": { "properties": { "twilio_account_sid": { From 8827d86735f60f454b49ec46cb8ba85b55811313 Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Thu, 30 Nov 2023 20:06:28 -0800 Subject: [PATCH 042/148] create a guide for byotk (#450) * updated hosted-api docs * updated docs with byot and byoai --- docs/bring-your-own-openai.mdx | 90 +++++++++++++++++++++++++++++++ docs/bring-your-own-telephony.mdx | 70 ++++++++++++++++++++++++ docs/mint.json | 22 ++++++-- 3 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 docs/bring-your-own-openai.mdx create mode 100644 docs/bring-your-own-telephony.mdx diff --git a/docs/bring-your-own-openai.mdx b/docs/bring-your-own-openai.mdx new file mode 100644 index 0000000000..7c6b0e74c4 --- /dev/null +++ b/docs/bring-your-own-openai.mdx @@ -0,0 +1,90 @@ +--- +title: "[Enterprise] Bring Your Own OpenAI API Keys" +description: "Use your own OpenAI keys and models with Vocode" +--- + +You can connect your own OpenAI account with Vocode. With your own OpenAI account, you can use your own OpenAI models including custom, fine-tuned models! + +***NOTE:** This feature is only enabled for users on an Enterprise plan.* + +## Step 1: Add an OpenAI account connection + +Vocode uses account connections to manage your account parameters and associate them with phone numbers and calls. You can add multiple account connections if you have multiple OpenAI accounts you would like to integrate. You can quickly add an account connection [via our API](https://api.vocode.dev/docs#/account_connections/create_account_connection) by providing an OpenAI API key. + + +```python +from vocode.client import Vocode + +vocode_client.account_connections.create_account_connection( + request={ + "type": "account_connection_openai", + "credentials": { + "openai_api_key": "YOUR_OPENAI_API_KEY", + }, + } +) +``` + +`create_account_connection` will return the parameters for your new account connection, including an `id`, which is necessary for the following steps. + +## Step 2: Use the OpenAI account connection with your agent + +To use the new account connection with your calls, you need to configure your agents with the account connection. You can do so when you create a new agent or update an existing agent via the `openai_account_connection` parameter. + + +```python Create Agent +vocode_client.agents.create_agent( + voice="...", + prompt={ + "content": "...", + }, + openai_account_connection="YOUR_ACCOUNT_CONNECTION_ID", +) +``` + +```python Update Agent +from vocode import AgentUpdateParams + +vocode_client.agents.update_agent( + id="YOUR_AGENT_ID", + request=AgentUpdateParams( + openai_account_connection="YOUR_ACCOUNT_CONNECTION_ID", + ), +) +``` + + +Any calls with this agent will now use your OpenAI account. + +### Use your own OpenAI models + +You can add your own OpenAI models to your agents using the `openai_model_name_override` parameter when creating or updating your agents. These models can be the base OpenAI models (e.g. gpt-3.5-turbo-1106, gpt-4) or your own fine-tuned models. + +***NOTE:** A model name override can only be used if you add your own OpenAI account connection to the agent. Model overrides do not work when using Vocode's OpenAI system.* + + +```python Create Agent +vocode_client.agents.create_agent( + voice="...", + prompt={ + "content": "...", + }, + openai_account_connection="YOUR_ACCOUNT_CONNECTION_ID", + openai_model_name_override="ft:your_ft_model_name" +) +``` + +```python Update Agent +from vocode import AgentUpdateParams + +vocode_client.agents.update_agent( + id="YOUR_AGENT_ID", + request=AgentUpdateParams( + openai_account_connection="YOUR_ACCOUNT_CONNECTION_ID", # if not already updated + openai_model_name_override="gpt-4-1106-preview" + ), +) +``` + + +Now, your Vocode calls with this agent will use your own OpenAI account and your own OpenAI models! diff --git a/docs/bring-your-own-telephony.mdx b/docs/bring-your-own-telephony.mdx new file mode 100644 index 0000000000..8cb3e0c88f --- /dev/null +++ b/docs/bring-your-own-telephony.mdx @@ -0,0 +1,70 @@ +--- +title: "[Enterprise] Bring Your Own Telephony" +description: "Use your own Twilio account and phone numbers with Vocode" +--- + +You can connect your own external Twilio accounts with Vocode, enabling you to send and receive calls on your own phone numbers and store recordings in your Twilio account. + +***NOTE:** This feature is only enabled for users on an Enterprise plan.* + +## Step 1: Add a Twilio account connection + +Vocode uses account connections to manage your account parameters and associate them with phone numbers and calls. You can add multiple account connections if you have multiple Twilio accounts you would like to integrate. You can quickly add an account connection [via our API](https://api.vocode.dev/docs#/account_connections/create_account_connection) by providing your account SID and an auth token. + + +```python +from vocode.client import Vocode + +vocode_client.account_connections.create_account_connection( + request={ + "type": "account_connection_twilio", + "credentials": { + "twilio_account_sid": "YOUR_ACCOUNT_SID", + "twilio_auth_token": "YOUR_AUTH_TOKEN", + }, + } +) +``` + +`create_account_connection` will return the parameters for your new account connection, including an `id`, which is necessary for the following steps. + +## Step 2: Link existing Twilio numbers to Vocode + +Vocode now can make calls with your Twilio account, but our system needs to know which numbers to configure and use. We provide the `/v1/numbers/link` [endpoint](https://api.vocode.dev/docs#/numbers/link_number) to add these numbers to our system. You simply need to provide the phone number, your account connection id, and whether or not the phone number should be outbound only. + +```python Python +vocode_client.numbers.link_number( + phone_number="1234567890", + telephony_account_connection="YOUR_ACCOUNT_CONNECTION_ID", + outbound_only=True +) +``` + +You can now use this phone number for outbound calls (and inbound if you have it configured). + + +## Step 3: View your call objects + +After making a call with your newly added number, you can see two new fields in your call object: +- **Telephony Account Connection:** The account connection object associated with the call +- **Telephony ID:** The Twilio call SID corresponding to the Vocode call + +```json +{ + id: 'call_id', + userId: 'user_id', + toNumber: '123456789', + fromNumber: '123456789', + ... + telephonyId: 'telephony_id', + telephonyAccountConnection: { + 'id': 'account_connection_id', + 'user_id': 'user_id', + 'credentials': { + 'twilio_account_sid': 'YOUR_TWILIO_ACCOUNT_SID', + 'twilio_auth_token': 'YOUR_TWILIO_AUTH_TOKEN' + }, + 'type': 'account_connection_twilio' + } +} +``` diff --git a/docs/mint.json b/docs/mint.json index 37518f38f7..2e0d0bc207 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -49,11 +49,19 @@ "navigation": [ { "group": "Getting Started", - "pages": ["welcome", "hosted-quickstart", "open-source-quickstart"] + "pages": [ + "welcome", + "hosted-quickstart", + "open-source-quickstart" + ] }, { "group": "Vocode 101", - "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] + "pages": [ + "what-is-vocode", + "how-it-works", + "how-to-use-it" + ] }, { "group": "Guides", @@ -105,7 +113,9 @@ }, { "group": "Usage", - "pages": ["api-reference/usage/get-usage"] + "pages": [ + "api-reference/usage/get-usage" + ] }, { "group": "Actions", @@ -175,7 +185,9 @@ "machine-detection", "ivr-navigation", "hipaa-compliance", - "do-not-call-detection" + "do-not-call-detection", + "bring-your-own-telephony", + "bring-your-own-openai" ] } ], @@ -188,4 +200,4 @@ "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" } -} +} \ No newline at end of file From 22f1b6169a5404b8b3a2d65713520a553c80adb3 Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Fri, 1 Dec 2023 18:12:36 -0800 Subject: [PATCH 043/148] added convo dials doc (#452) * added convo dials doc * Apply suggestions from code review --------- Co-authored-by: Ajay Raj --- docs/conversational-dials.mdx | 54 +++++++++++++++++++++++++++++++++++ docs/mint.json | 1 + 2 files changed, 55 insertions(+) create mode 100644 docs/conversational-dials.mdx diff --git a/docs/conversational-dials.mdx b/docs/conversational-dials.mdx new file mode 100644 index 0000000000..27cf9f90fb --- /dev/null +++ b/docs/conversational-dials.mdx @@ -0,0 +1,54 @@ +--- +title: "Conversational Dials" +description: "Customize your bot's conversational behavior" +--- + +The Vocode hosted API provides dials to tune the responsiveness and conversational mechanics of your agent. These parameters are as follows: +- `interrupt_sensitivity`: How responsive the bot is to speech from the human +- `endpointing_sensitivity`: Controls the sensitivity of detecting the end of the human's speech +- `conversation_speed`: Determines how quickly the bot responds for its turns in the conversation. + +These parameters can be customized via the `create` and `update` agent APIs. + +## Interrupt Sensitivity + +Vocode phone agents are designed to handle interruptions from the humans, and the `interrupt_sensitivity` parameter controls how sensitive the bot is to these interruptions. + +Interrupt sensitivity has two options: **low** (default) and **high**. Low sensitivity makes the bot ignore backchannels (e.g. "sure", "uh-huh") while the bot is speaking. +High sensitivity makes the agent treat any word from the human as an interruption. + +In summary: +- **Possible values:** low, high +- **Default value:** low +- low = ignore non-interrupting words +- high = stop at any word + +## Endpointing Sensitivity + +`endpointing_sensitivity` controls how the bot determines when the human is done speaking so it can kick off its response. It can be one of **sensitive**, **relaxed**, or **auto** (default and currently equivalent to relaxed). + +A bot with `endpointing_sensitivity == 'sensitive'` treats the end of a sentence or a short pause as the end of the human's turn. This works well for quick conversations in which you expect short, single-sentence responses from the human. +A bot with this sensitivity runs the risk of interrupting the human if they continue speaking after a single sentence. + +A bot with `endpointing_sensitivity == 'relaxed'` waits a short time after the end of a human's sentence before considering their turn over. Alternatively, when a sentence is not finished, relaxed sensitivity waits for a longer pause before marking the end of the human's speech. +This sensitivity has less risk of interrupting the human but can potentially have a slower response time. Note that `auto` sensitivity is equivalent to relaxed. + +***Note:** the amount of time the agent waits during a pause adapts to the human's utterance speed. If the human speaks fast, the bot will wait less, and if the human speaks slow the bot will wait longer.* + +In summary: +- **Possible values:** sensitive, relaxed, auto +- **Default value:** auto +- sensitive = end of first sentence or shorter pause +- relaxed/auto = pause after end of first sentence or longer pause + +## Conversation Speed + +`conversation_speed` controls the length of endpointing pauses, i.e. how long the bot will wait before responding to the human. This includes normal utterances from the human as well as interruptions. + +The amount of time the bot waits inversely scales with the `conversation_speed` value. So a bot with `conversation_speed` of 2 responds in half the time compared to a `conversation_speed` of 1. +Likewise a `conversation_speed` of 0.5 means the bot takes twice as long to respond. + +In summary: +- **Possible values:** between 0.5 and 2 +- **Default value:** 1 +- Response time inversely scales with this value \ No newline at end of file diff --git a/docs/mint.json b/docs/mint.json index 2e0d0bc207..a8952eee9a 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -177,6 +177,7 @@ "getting-number", "configuring-number", "retrieve-call-data", + "conversational-dials", "setting-up-webhook", "using-actions", "vectordb", From 6f94a7bb140baa4424e59b47b17dfad11c5c1103 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Sat, 2 Dec 2023 11:05:06 -0800 Subject: [PATCH 044/148] add account connections api reference (#453) --- docs/mint.json | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index a8952eee9a..a6c70a0914 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -49,19 +49,11 @@ "navigation": [ { "group": "Getting Started", - "pages": [ - "welcome", - "hosted-quickstart", - "open-source-quickstart" - ] + "pages": ["welcome", "hosted-quickstart", "open-source-quickstart"] }, { "group": "Vocode 101", - "pages": [ - "what-is-vocode", - "how-it-works", - "how-to-use-it" - ] + "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] }, { "group": "Guides", @@ -113,9 +105,7 @@ }, { "group": "Usage", - "pages": [ - "api-reference/usage/get-usage" - ] + "pages": ["api-reference/usage/get-usage"] }, { "group": "Actions", @@ -171,6 +161,15 @@ "api-reference/webhooks/update-webhook" ] }, + { + "group": "Account Connections", + "pages": [ + "api-reference/account_connections/get-account-connection", + "api-reference/account_connections/list-account-connections", + "api-reference/account_connections/create-account-connection", + "api-reference/account_connections/update-account-connection" + ] + }, { "group": "Hosted Walkthrough", "pages": [ @@ -201,4 +200,4 @@ "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" } -} \ No newline at end of file +} From cc5ba4c0dfc9cb7c0b67e176df0d27382be227f3 Mon Sep 17 00:00:00 2001 From: Eliot Hsu Date: Sun, 3 Dec 2023 20:54:34 -0800 Subject: [PATCH 045/148] api spec update 120323 (#455) --- docs/openapi.json | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 8b414b4d36..ba9361528b 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1720,7 +1720,7 @@ }, "endpointing_sensitivity": { "type": "string", - "enum": ["auto", "relaxed"], + "enum": ["auto", "relaxed", "sensitive"], "title": "Endpointing Sensitivity", "default": "auto" }, @@ -1746,6 +1746,11 @@ }, "openai_account_connection": { "$ref": "#/components/schemas/OpenAIAccountConnection" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection", + "default": false } }, "type": "object", @@ -1840,7 +1845,7 @@ }, "endpointing_sensitivity": { "type": "string", - "enum": ["auto", "relaxed"], + "enum": ["auto", "relaxed", "sensitive"], "title": "Endpointing Sensitivity", "default": "auto" }, @@ -1870,6 +1875,11 @@ { "type": "string", "format": "uuid" } ], "title": "Openai Account Connection" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection", + "default": false } }, "type": "object", @@ -1985,7 +1995,7 @@ }, "endpointing_sensitivity": { "anyOf": [ - { "type": "string", "enum": ["auto", "relaxed"] }, + { "type": "string", "enum": ["auto", "relaxed", "sensitive"] }, { "$ref": "#/components/schemas/Undefined" } ], "title": "Endpointing Sensitivity" @@ -2025,6 +2035,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Openai Account Connection" + }, + "run_do_not_call_detection": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Run Do Not Call Detection" } }, "type": "object", @@ -2304,7 +2321,7 @@ }, "endpointing_sensitivity": { "type": "string", - "enum": ["auto", "relaxed"], + "enum": ["auto", "relaxed", "sensitive"], "title": "Endpointing Sensitivity", "default": "auto" }, @@ -2334,6 +2351,11 @@ { "type": "string", "format": "uuid" } ], "title": "Openai Account Connection" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection", + "default": false } }, "type": "object", @@ -2359,8 +2381,7 @@ }, "run_do_not_call_detection": { "type": "boolean", - "title": "Run Do Not Call Detection", - "default": false + "title": "Run Do Not Call Detection" }, "hipaa_compliant": { "type": "boolean", @@ -2677,7 +2698,7 @@ }, "endpointing_sensitivity": { "type": "string", - "enum": ["auto", "relaxed"], + "enum": ["auto", "relaxed", "sensitive"], "title": "Endpointing Sensitivity", "default": "auto" }, @@ -2707,6 +2728,11 @@ { "type": "string", "format": "uuid" } ], "title": "Openai Account Connection" + }, + "run_do_not_call_detection": { + "type": "boolean", + "title": "Run Do Not Call Detection", + "default": false } }, "type": "object", From 0a4bdba8ce98457bdd629290cceca1c64c3059c3 Mon Sep 17 00:00:00 2001 From: seungjin-vocode <152908592+seungjin-vocode@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:49:55 -0800 Subject: [PATCH 046/148] update openapi specs (#456) --- docs/openapi.json | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index ba9361528b..ae8d5aa64f 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -3089,7 +3089,13 @@ "title": "Version", "default": "2" }, - "speed": { "type": "number", "title": "Speed" } + "speed": { "type": "number", "title": "Speed" }, + "quality": { + "type": "string", + "enum": ["faster", "draft", "low", "medium", "high", "premium"], + "title": "Quality" + }, + "temperature": { "type": "number", "title": "Temperature" } }, "type": "object", "required": ["id", "user_id", "type", "voice_id"], @@ -3111,7 +3117,13 @@ "title": "Version", "default": "2" }, - "speed": { "type": "number", "title": "Speed" } + "speed": { "type": "number", "title": "Speed" }, + "quality": { + "type": "string", + "enum": ["faster", "draft", "low", "medium", "high", "premium"], + "title": "Quality" + }, + "temperature": { "type": "number", "title": "Temperature" } }, "type": "object", "required": ["type", "voice_id"], @@ -3158,6 +3170,23 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Speed" + }, + "quality": { + "anyOf": [ + { + "type": "string", + "enum": ["faster", "draft", "low", "medium", "high", "premium"] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Quality" + }, + "temperature": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Temperature" } }, "type": "object", From 6538d1f7dcadd626a24d525c1cc2f766b4c21640 Mon Sep 17 00:00:00 2001 From: seungjin-vocode <152908592+seungjin-vocode@users.noreply.github.com> Date: Tue, 12 Dec 2023 12:37:33 -0800 Subject: [PATCH 047/148] update openapi docs (#458) --- docs/openapi.json | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/docs/openapi.json b/docs/openapi.json index ae8d5aa64f..2924a5269d 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1744,6 +1744,11 @@ "type": "string", "title": "Openai Model Name Override" }, + "ask_if_human_present_on_idle": { + "type": "boolean", + "title": "Ask If Human Present On Idle", + "default": false + }, "openai_account_connection": { "$ref": "#/components/schemas/OpenAIAccountConnection" }, @@ -1869,6 +1874,11 @@ "type": "string", "title": "Openai Model Name Override" }, + "ask_if_human_present_on_idle": { + "type": "boolean", + "title": "Ask If Human Present On Idle", + "default": false + }, "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, @@ -2028,6 +2038,13 @@ ], "title": "Openai Model Name Override" }, + "ask_if_human_present_on_idle": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Ask If Human Present On Idle" + }, "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, @@ -2345,6 +2362,11 @@ "type": "string", "title": "Openai Model Name Override" }, + "ask_if_human_present_on_idle": { + "type": "boolean", + "title": "Ask If Human Present On Idle", + "default": false + }, "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, @@ -2634,7 +2656,19 @@ }, "Language": { "type": "string", - "enum": ["en", "es", "de"], + "enum": [ + "en", + "es", + "de", + "hi", + "pt", + "fr", + "nl", + "id", + "it", + "ja", + "ko" + ], "title": "Language", "description": "An enumeration." }, @@ -2722,6 +2756,11 @@ "type": "string", "title": "Openai Model Name Override" }, + "ask_if_human_present_on_idle": { + "type": "boolean", + "title": "Ask If Human Present On Idle", + "default": false + }, "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, From 9b638265e0b1f8550a727834e87258934c53bc7e Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Tue, 26 Dec 2023 13:20:43 -0500 Subject: [PATCH 048/148] Add documentation issue template (#467) --- .github/ISSUE_TEMPLATE/standard_docs_issue.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/standard_docs_issue.md diff --git a/.github/ISSUE_TEMPLATE/standard_docs_issue.md b/.github/ISSUE_TEMPLATE/standard_docs_issue.md new file mode 100644 index 0000000000..c4d31b7ffb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/standard_docs_issue.md @@ -0,0 +1,16 @@ +--- +name: Documentation Issue +about: Use this template for reporting issues with the documentation. +title: 'Docs:' +labels: 'documentation' +assignees: '' +--- + +## Brief Description + + +## Steps to Reproduce + + +## Suggested Fix + From 300bf774006de529dde7f8c2dabfa66b03a23c91 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Thu, 28 Dec 2023 17:53:21 -0500 Subject: [PATCH 049/148] Standard docs issue (#469) * Add documentation issue template * ADD Docs, Features, bug and Comunity Support. * Add issue templates for bug reports, documentation issues, and feature requests * Update bug issue template * Update issue templates descriptions * Delete documentation issue template --- .github/ISSUE_TEMPLATE/bug.yml | 106 ++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/docs.yml | 35 ++++++ .github/ISSUE_TEMPLATE/features.yml | 37 ++++++ .github/ISSUE_TEMPLATE/standard_docs_issue.md | 16 --- 5 files changed, 183 insertions(+), 16 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/docs.yml create mode 100644 .github/ISSUE_TEMPLATE/features.yml delete mode 100644 .github/ISSUE_TEMPLATE/standard_docs_issue.md diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 0000000000..783f9b5729 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,106 @@ +--- +name: Bug Report +description: Use this template for reporting bugs. +title: "[Bug]: " +labels: ["bug", "triage"] +assignees: [] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: textarea + id: brief-description + attributes: + label: Brief Description + description: Please summarize the bug, specifying where it occurs (e.g., in which part of the code or when performing a specific action). + validations: + required: true + - type: dropdown + id: llm + attributes: + label: LLM + description: Please specify the LLM you are using. + options: + - ChatGPT + - GPT-4 + - Anthropic + - GPT4All + validations: + required: false + - type: dropdown + id: transcription-services + attributes: + label: Transcription Services + description: Please specify the Transcription service you are using. + options: + - AssemblyAI + - Deepgram + - Gladia + - Google Cloud + - Microsoft Azure + - RevAI + - Whisper + - Whisper.cpp + validations: + required: false + - type: dropdown + id: synthesis-services + attributes: + label: Synthesis Services + description: Please specify the Synthesis service you are using. + options: + - Rime.ai + - Microsoft Azure + - Google Cloud + - Play.ht + - Eleven Labs + - Coqui + - Coqui (OSS) + - gTTS + - StreamElements + - Bark + - AWS Polly + validations: + required: false + - type: dropdown + id: telephony-services + attributes: + label: Telephony Services + description: Please specify the Telephony service you are using. + options: + - Twilio + - Vonage + validations: + required: false + - type: textarea + id: conversation-type-and-platform + attributes: + label: Conversation Type and Platform + description: Please specify the type of conversation (turn-based or real-time streaming), and the platform (Phone with Twilio or Vonage, Web, or Meeting). + validations: + required: false + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to Reproduce + description: List the steps to reproduce the bug. + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: Expected Behavior + description: Describe what should happen instead of the bug. + validations: + required: true + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain the problem. + validations: + required: false +--- + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..95107361cf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: +- name: Discord Community Support + url: https://discord.gg/xxTAGR9Frm + about: Please ask and answer questions here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/docs.yml b/.github/ISSUE_TEMPLATE/docs.yml new file mode 100644 index 0000000000..bb5bfe097b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/docs.yml @@ -0,0 +1,35 @@ +--- +name: Documentation Issue +description: Use this template for reporting issues with the documentation. +title: '[Docs]:' +labels: 'documentation' +assignees: [] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this documentation issue! + - type: textarea + id: brief-description + attributes: + label: Brief Description + description: Please summarize the issue, specifying where in the documentation it occurs (e.g., section, paragraph). + validations: + required: true + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to Reproduce + description: If applicable, list the steps to reproduce the issue, especially for incorrect instructions. + validations: + required: false + - type: textarea + id: suggested-fix + attributes: + label: Suggested Fix + description: If possible, provide a proposed solution or improvement, such as text rewrites, clarifications, or new examples. + validations: + required: false +--- + + diff --git a/.github/ISSUE_TEMPLATE/features.yml b/.github/ISSUE_TEMPLATE/features.yml new file mode 100644 index 0000000000..6735c9ead8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/features.yml @@ -0,0 +1,37 @@ +--- +name: Feature Request +description: Use this template for proposing new features. +title: "[Feature]: " +labels: ["feature", "triage"] +assignees: [] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this feature request! + - type: textarea + id: brief-description + attributes: + label: Brief Description + description: Please summarize the proposed feature, specifying what it should do and why it would be useful. + validations: + required: true + - type: textarea + id: rationale + attributes: + label: Rationale + description: Please explain why this feature would be useful and how it would improve the project. + validations: + required: true + - type: textarea + id: suggested-implementation + attributes: + label: Suggested Implementation + description: If possible, provide details about how this feature could be implemented. + validations: + required: false +--- + + + + diff --git a/.github/ISSUE_TEMPLATE/standard_docs_issue.md b/.github/ISSUE_TEMPLATE/standard_docs_issue.md deleted file mode 100644 index c4d31b7ffb..0000000000 --- a/.github/ISSUE_TEMPLATE/standard_docs_issue.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: Documentation Issue -about: Use this template for reporting issues with the documentation. -title: 'Docs:' -labels: 'documentation' -assignees: '' ---- - -## Brief Description - - -## Steps to Reproduce - - -## Suggested Fix - From 290211fab9f24e30b30677141e51fa1c30c48086 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Thu, 28 Dec 2023 19:07:41 -0500 Subject: [PATCH 050/148] Documentation Update: Open Source Information Goudete/update docs/open source (#470) * updating outdated or missing docs * adding call object page and removing descriptions for references * revert changes in docs/call-object.mdx --------- Co-authored-by: goudete --- docs/call-object.mdx | 2 +- docs/open-source/agent-reference.mdx | 174 ++++++++++++++++++-- docs/open-source/langchain-agent.mdx | 73 ++++++++- docs/open-source/language-support.mdx | 57 ++++++- docs/open-source/synthesizer-reference.mdx | 179 ++++++++++++++++++--- docs/open-source/transcriber-reference.mdx | 101 ++++++++---- 6 files changed, 506 insertions(+), 80 deletions(-) diff --git a/docs/call-object.mdx b/docs/call-object.mdx index 592a0eba75..1dd1cab4f9 100644 --- a/docs/call-object.mdx +++ b/docs/call-object.mdx @@ -1,4 +1,4 @@ --- title: "Call Object" description: "🚧 Under construction" ---- +--- \ No newline at end of file diff --git a/docs/open-source/agent-reference.mdx b/docs/open-source/agent-reference.mdx index faaf111cef..7feb9cb242 100644 --- a/docs/open-source/agent-reference.mdx +++ b/docs/open-source/agent-reference.mdx @@ -1,59 +1,199 @@ --- title: "Agent Reference" -description: "🚧 Under construction" --- # `AgentConfig` - placeholder + The initial message the agent should send at the start of the conversation. - placeholder + Whether the agent should generate responses continuously (True) or only respond once per human input (False). + - placeholder + The maximum number of seconds the agent is allowed to go without speaking before being considered idle. + - placeholder + Whether the human can interrupt the agent while it is speaking. + - placeholder + Whether the agent should end the conversation when it detects the human saying goodbye. + - placeholder + Whether to play filler audio (typing noises or phrases like "uh" and "um") when the agent is thinking. Can be configured via FillerAudioConfig. + - placeholder + Configuration for sending webhooks from the agent. + - placeholder + Whether to track the sentiment of the agent's responses. + + Configuration for custom actions the agent can take, such as making API calls. + + + # `LLMAgentConfig` - placeholder + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + + + + The prompt to use for generating the first response from the agent. If not provided, the agent will generate a response to the first user message without any initial prompt. + + + + The name of the OpenAI model to use, e.g. "text-curie-001". + + + + The sampling temperature to use for the model. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. + + + + The maximum number of tokens to generate in the completion. + + + + The response for the agent to give when it is cut off mid-response. + + + +# `ChatGPTAgentConfig` + + + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + - placeholder + The prompt to use for generating the first response from the agent. If not provided, the agent will generate a response to the first user message without any initial prompt. + - placeholder + The name of the OpenAI model to use, e.g. "gpt-3.5-turbo-0613". + - placeholder + The sampling temperature to use for the model. Higher values means the model will take more risks. Try 0.9 for more creative applications, and 0 for ones with a well-defined answer. + - placeholder + The maximum number of tokens to generate in the completion. + - placeholder + The response for the agent to give when it is cut off mid-response. + + + + Configuration when using the Azure OpenAI API. + + + + Configuration for hitting a vector database for retrieval before generating a response. + + + +# `ChatAnthropicAgentConfig` + + + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + + + + The name of the Anthropic model to use. e.g. "claude-v1". + + + + Max tokens to sample for autocompletion stream. Defaults to 200. + +# `ChatVertexAIAgentConfig` + + + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + + + + The name of the Vertex model to use. e.g. "chat-bison@001". + + + + Whether the agent should generate responses continuously (True) or only respond once per human input (False). + Google Vertex AI doesn't support streaming, set to False + + + +# `EchoAgentConfig` + +The EchoAgent simply echoes back the user's messages. It does not take any configuration parameters. + + +# `GPT4AllAgentConfig` + + + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + + + + The path to the model weights file. + + + + Whether the agent should generate responses continuously (True) or only respond once per human input (False). + + + +# `LlamacppAgentConfig` + + + The preamble text to prepend before the prompt when generating responses. This allows priming the model. + + + + Additional kwargs to pass to the LlamaCpp model initializer. + + + + The template to use for formatting the prompt with the conversation history and current user input. Can be a string referring to a built-in template like "alpaca", or a custom PromptTemplate. + + + +# `InformationRetrievalAgentConfig` + + + A description of the intended recipient that the agent is trying to reach. + + + + A description of who the agent is representing in the call. + + + + A description of the goal or task that the agent is trying to accomplish, to provide context for the information retrieval. + + + + A list of the information fields the agent is trying to collect. + + + # `RESTfulUserImplementedAgentConfig` - - placeholder + + Configuration for the REST endpoint to hit to get responses from the user implemented agent. + + + + Whether the agent should generate responses continuously (True) or only respond once per human input (False). diff --git a/docs/open-source/langchain-agent.mdx b/docs/open-source/langchain-agent.mdx index 577a6ac996..d2ceb2efb3 100644 --- a/docs/open-source/langchain-agent.mdx +++ b/docs/open-source/langchain-agent.mdx @@ -134,5 +134,76 @@ poetry run python main.py ``` # Code explanation +The Langchain agent is implemented in `main.py`. It uses the Langchain library to initialize an agent that can have a conversation. -🚧 Under construction +## Langchain Agent +`main.py` instantiates the langchain agent and relevant tools. It sets an objective, initializes a Langchain agent, and runs the conversation. +```python +agent = initialize_agent( + tools=[get_all_contacts, call_phone_number, word_of_the_day], + llm=llm, + agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, + verbose=verbose, + memory=memory, +) +``` + +## Langchain tools + +### Tool to get all contacts +```python +@tool("get_all_contacts") +def get_all_contacts(placeholder: str) -> List[dict]: + """Get contacts.""" + return CONTACTS +``` + +### Tool to call phone number +`tools/vocode.py` makes use of the `OutboundCall` class to initiate a phone call +```python +@tool("call phone number") +def call_phone_number(input: str) -> str: + """calls a phone number as a bot and returns a transcript of the conversation. + the input to this tool is a pipe separated list of a phone number, a prompt, and the first thing the bot should say. + The prompt should instruct the bot with what to do on the call and be in the 3rd person, + like 'the assistant is performing this task' instead of 'perform this task'. + + should only use this tool once it has found an adequate phone number to call. + + for example, `+15555555555|the assistant is explaining the meaning of life|i'm going to tell you the meaning of life` will call +15555555555, say 'i'm going to tell you the meaning of life', and instruct the assistant to tell the human what the meaning of life is. + """ + phone_number, prompt, initial_message = input.split("|", 2) + call = OutboundCall( + base_url=os.environ["TELEPHONY_SERVER_BASE_URL"], + to_phone=phone_number, + from_phone=os.environ["OUTBOUND_CALLER_NUMBER"], + config_manager=RedisConfigManager(), + agent_config=ChatGPTAgentConfig( + prompt_preamble=prompt, + initial_message=BaseMessage(text=initial_message), + ), + logger=logging.Logger("call_phone_number"), + ) + LOOP.run_until_complete(call.start()) + while True: + maybe_transcript = get_transcript(call.conversation_id) + if maybe_transcript: + delete_transcript(call.conversation_id) + return maybe_transcript + else: + time.sleep(1) +``` + +## TelephonyServer +`telephony_app.py` instantiates a `TelephonyServer` object to manage the phone call initiated by `OutboundCall` +```python +telephony_server = TelephonyServer( + base_url=BASE_URL, + config_manager=config_manager, + inbound_call_configs=[], + events_manager=EventsManager(), + logger=logger, +) + +app.include_router(telephony_server.get_router()) +``` \ No newline at end of file diff --git a/docs/open-source/language-support.mdx b/docs/open-source/language-support.mdx index fb166582f3..694887fb62 100644 --- a/docs/open-source/language-support.mdx +++ b/docs/open-source/language-support.mdx @@ -3,4 +3,59 @@ title: "Multilingual support" description: "How to configure different languages" --- -# 🚧 Under construction +# Multilingual Support + +The vocode project can be configured to support multiple languages for speech synthesis and automatic speech recognition (ASR). + +## Speech Synthesis + +The speech synthesizer used in vocode is configurable. By default, the `AzureSynthesizer` is used which supports [over 75 voices across over 45 languages](https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support?tabs=tts). + +To configure a different language, modify the `SynthesizerConfig` when initializing the conversation: + +```python +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig + +synthesizer_config = AzureSynthesizerConfig( + voice_name="de-DE-KatjaNeural" # German voice + language_code="de-DE" # Language of text to be synthesized +) +``` + +See the [full list of supported voices](https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support?tabs=tts). + +## Transcription + +The transcriber used in vocode is also configurable. By default, `DeepgramTranscriber` is used which supports [over 25 languages](https://developers.deepgram.com/docs/languages-overview). + +To configure a different language model, modify the language code passed to `TranscriberConfig` when initializing the config object (`en-US` is the default): + +```python +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig + +transcriber_config = DeepgramTranscriberConfig( + language="es" # Spanish +) +``` + +See the [Deepgram docs](https://developers.deepgram.com/docs/languages-overview) for the list of supported lamguages. + +Other transcription services like Google Cloud Speech or Assembly AI could also be used by configuring the appropriate `TranscriberConfig`. + +## Language Configuration + +It is recommended to load the speech synthesizer voice and transcription model from environment variables or configuration to avoid hard-coding language choices: + +```python +import os +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig + +SYNTHESIZER_VOICE = os.getenv("SYNTHESIZER_VOICE", default="en-US-AriaNeural") +ASR_MODEL = os.getenv("DEEPGRAM_MODEL", default="en-US") + +synthesizer_config = AzureSynthesizerConfig(voice=SYNTHESIZER_VOICE) +transcriber_config = DeepgramTranscriberConfig(model=DEEPGRAM_MODEL) +``` + +This allows dynamically configuring the speech language without code changes. diff --git a/docs/open-source/synthesizer-reference.mdx b/docs/open-source/synthesizer-reference.mdx index ef32257ce3..5ce320d010 100644 --- a/docs/open-source/synthesizer-reference.mdx +++ b/docs/open-source/synthesizer-reference.mdx @@ -1,80 +1,207 @@ --- title: "Synthesizer Reference" -description: "🚧 Under construction" --- # `SynthesizerConfig` - placeholder + The sampling rate of the audio in Hz. + - placeholder + The encoding format for the audio data. - - placeholder + + + Whether the audio chunks returned should be encoded as WAV format. Defaults to False. -= False - - placeholder + + + Optional configuration for controlling sentiment/emotion in the synthesized speech. + # `AzureSynthesizerConfig` - placeholder + The name of the voice to use. Defaults to "en-US-SteffanNeural". + - placeholder + The pitch of the voice, as a percentage adjustment. Defaults to 0. + - placeholder + The speaking rate of the voice, as a percentage adjustment. Defaults to 15. + + + + The language code to use. Defaults to "en-US". -# `GoogleSynthesizerConfig` + +# `GoogleSynthesizerConfig` - placeholder + The language code to use for synthesis. Defaults to "en-US". + - placeholder + The name of the Google Cloud Text-to-Speech voice to use. Defaults to "en-US-Neural2-I". + - placeholder + The pitch of the voice. Defaults to 0. + - placeholder + The speaking rate of the voice. Defaults to 1.2 + # `ElevenLabsSynthesizerConfig` - placeholder + The API key for accessing the ElevenLabs API. + - placeholder + The ID of the voice to use. Defaults to Adam voice. + + + + Level of latency optimization between 0-4. + + + + Whether to use experimental streaming. + - placeholder + Stability level for voice. Used with similarity_boost. + - placeholder + Similarity boost level for voice. Used with stability. + + Custom model ID to use. + + + # `RimeSynthesizerConfig` - placeholder + Name of Rime speaker to use. Defaults to "young_male_unmarked-1". + + + + Sampling rate of generated audio. Defaults to 22050. + + Base URL for Rime API. Defaults to "https://rjmopratfrdjgmfmaios.functions.supabase.co/rime-tts" + + + + Speed adjustment factor. Defaults to None. + + + # `PlayHtSynthesizerConfig` + + API key for Play.ht API. + + + + User ID for Play.ht API. + + + + Speed adjustment. + + + + Random seed for stochastic models. + + + + Sampling temperature for stochastic models. + + - placeholder + ID of voice to use. Defaults to "larry" + + + + Whether to use experimental streaming. Defaults to False. - - placeholder + + +# `StreamElementsSynthesizerConfig` + + + Name of StreamElements voice to use. Defaults to "Brian". - - placeholder + + +# `CoquiTTSSynthesizerConfig` + + + Keyword arguments for Coqui TTS model. + + + + Speaker ID for multi-speaker models. Defaults to None. + + + + Language code for multi-lingual models. Defaults to None. + + + +# `CoquiSynthesizerConfig` + + + API key for Coqui API. + + + + ID of voice to use. Defaults to "ebe2db86-62a6-49a1-907a-9a1360d4416e" + + + Voice prompt to use instead of voice ID. + + + + Whether to use X-Tts voices. + + + +# `BarkSynthesizerConfig` + + + Kwargs for Bark model preloading. + + + + Kwargs for Bark audio generation. + + + +# `PollySynthesizerConfig` + + + Language code to use. Defaults to "en-US". + + + + Voice ID of the Polly voice to use. Defaults to "Matthew". + + + + Sampling rate of generated audio. Defaults to 16000. + \ No newline at end of file diff --git a/docs/open-source/transcriber-reference.mdx b/docs/open-source/transcriber-reference.mdx index 112b66a893..4c493e293c 100644 --- a/docs/open-source/transcriber-reference.mdx +++ b/docs/open-source/transcriber-reference.mdx @@ -1,6 +1,5 @@ --- title: "Transcriber Reference" -description: "🚧 Under construction" --- # `TranscriberConfig` @@ -10,18 +9,24 @@ description: "🚧 Under construction" rate provides better audio quality but may increase processing time and data size. + The encoding format of the audio data. Options include: LINEAR16, MULAW. + The size of each chunk of audio data sent to the transcriber, in bytes. A larger chunk size can reduce network overhead but may increase latency. + - Optional configuration for endpointing, which determines when to split the - transcript based on criteria such as time or punctuation. If not provided, the - default endpointing behavior will be used. + Optional endpointing configuration to determine when a transcription segment should end. If not provided, default endpointing behavior will be used. + + + Optional downsampling factor to reduce the sampling rate of the audio before sending to the transcriber. Can be used to reduce bandwidth usage. + + Optional minimum confidence threshold for interrupting the transcription. Confidence values range from 0 to 1, with higher values indicating greater @@ -30,56 +35,84 @@ description: "🚧 Under construction" behavior will be used. -The `TranscriberConfig` class provides helper methods to abstract away some fields to the user. - -For example, when using an input device like `MicrophoneInput`, you can use: - -``` -TranscriberConfig.from_input_device(MicrophoneInput()) -``` - -You can also do this for telephone calls, which all share the same sampling rate, chunk size and audio encoding: + + If true, silence audio chunks will be sent to the transcriber while a transcription is in progress. Can be used to prevent echo during live transcription. + -``` -TranscriberConfig.from_telephone_input_device() -``` # `DeepgramTranscriberConfig` - The language code for the transcription, e.g., 'en-US' for American English. - If not provided, the default language will be used. + Optional language code to use for transcription. + - The model used for transcription. For Deepgram, it can be 'phonecall', - 'voicemail'. + Optional Deepgram model to use for transcription. Defaults to "nova". + - The tier of the Deepgram API to use for the transcription, e.g., 'enhanced'. - If not provided, the default tier will be used. + Optional Deepgram tier to use for transcription. + - The version of the Deepgram API to use for the transcription. If not provided, - the latest version will be used. + Optional Deepgram version to use for transcription. Defaults to latest version if not provided. - - A list of keywords to be used for keyword spotting during transcription with - the Deepgram API. If not provided, no keyword spotting will be performed. + + + Optional list of keywords to boost in the transcription results. + # `GoogleTranscriberConfig` - - The language code for the transcription, e.g., 'en-US' for American English. - Defaults to 'en-US'. - - The model used for transcription. For Google, it can be 'default', 'video', or - 'phone_call'. If not provided, the default model will be used. + Optional Google Cloud Speech model to use for transcription. + + Language code to use for transcription. Defaults to "en-US". + + + # `AssemblyAITranscriberConfig` + + Buffer duration in seconds to accumulate audio before sending to AssemblyAI. Defaults to 0.1s. + + + + Optional list of words to boost in the transcription results. + + + # `WhisperCPPTranscriberConfig` -# `RevAITranscriberConfig` + + Buffer duration in seconds to accumulate audio before sending to WhisperCPP. Defaults to 1.0s. + + + + Filename of the WhisperCPP shared library. + + + + Filename of the WhisperCPP model. + + + +# `AzureTranscriberConfig` + + + Language code to use for transcription. Defaults to "en-US". + + + + Optional list of candidate languages to auto-detect from the audio. + + + +# `GladiaTranscriberConfig` + + + Buffer duration in seconds to accumulate audio before sending to Gladia. Defaults to 0.1s. + From 3a80e6ab5f191eabb0afd19d476fb29b51f8fd84 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Fri, 29 Dec 2023 02:31:20 -0500 Subject: [PATCH 051/148] Pull Request for Issue #461: Introducing `/apps/voice_rag/` - A Demo Application for RAG in Vocode OpenSource (#464) * Add Pinecone vector database configuration * Add RAG documentation and remove vectordb documentation * ADD colab Link * working version manual_pinecone_ingestor * Revert the changes in /apps/client_backend/main.py with the aim of creating a new app in /apps/rag/ * Fix issue #463: Add Content-Type Header for Pinecone API Integration * Add environment files and Docker configuration * Rename rag to voice-rag app * revert pinecone.py Refactor code and update dependencies * Working Version * Update pinecone ingestor script * Add voice_rag application files * Update Dockerfile and README.md in voice_rag app * Fix missing newline at end of file --- apps/voice_rag/.env.template | 8 + apps/voice_rag/Dockerfile | 54 +++++ apps/voice_rag/README.md | 37 +++ apps/voice_rag/environment.docker.yml | 21 ++ apps/voice_rag/main.py | 85 +++++++ apps/voice_rag/manual_pinecone_ingestor.ipynb | 223 ++++++++++++++++++ docs/images/vectodb/pinecone-create-index.png | Bin 0 -> 412248 bytes docs/open-source/rag.mdx | 57 +++++ 8 files changed, 485 insertions(+) create mode 100644 apps/voice_rag/.env.template create mode 100644 apps/voice_rag/Dockerfile create mode 100644 apps/voice_rag/README.md create mode 100644 apps/voice_rag/environment.docker.yml create mode 100644 apps/voice_rag/main.py create mode 100644 apps/voice_rag/manual_pinecone_ingestor.ipynb create mode 100644 docs/images/vectodb/pinecone-create-index.png create mode 100644 docs/open-source/rag.mdx diff --git a/apps/voice_rag/.env.template b/apps/voice_rag/.env.template new file mode 100644 index 0000000000..e49e23b063 --- /dev/null +++ b/apps/voice_rag/.env.template @@ -0,0 +1,8 @@ +OPENAI_API_KEY= +DEEPGRAM_API_KEY= +AZURE_SPEECH_KEY= +AZURE_SPEECH_REGION= + +PINECONE_API_KEY= +PINECONE_ENVIRONMENT= +PINECONE_INDEX_NAME= \ No newline at end of file diff --git a/apps/voice_rag/Dockerfile b/apps/voice_rag/Dockerfile new file mode 100644 index 0000000000..7a7ad834ab --- /dev/null +++ b/apps/voice_rag/Dockerfile @@ -0,0 +1,54 @@ +# Use the official micromamba image as a base +FROM docker.io/mambaorg/micromamba:1.5-jammy + +# Create a new user '$MAMBA_USER' and set the working directory +COPY --chown=$MAMBA_USER:$MAMBA_USER environment.docker.yml /tmp/environment.yml + +# Install the specified packages using micromamba +RUN micromamba install -y -n base -f /tmp/environment.yml && \ + micromamba clean --all --yes + +USER root +WORKDIR /usr/local/src + +ARG VOCODE_USER=vocode +ARG VOCODE_UID=8476 +ARG VOCODE_GID=8476 + +RUN groupadd --gid $VOCODE_GID $VOCODE_USER && \ + useradd --uid $VOCODE_UID --gid $VOCODE_GID --shell /bin/bash --create-home $VOCODE_USER + +# COPY --chown=$VOCODE_USER:$VOCODE_USER ../../../ /vocode-python +# WORKDIR /usr/local/src/vocode +# RUN poetry install -E all + +# Copy the rest of your application files into the Docker image +COPY --chown=$VOCODE_USER:$VOCODE_USER . /vocode +WORKDIR /vocode + +#USER vocode +USER root + +ENV DOCKER_ENV="docker" + +# # Expose the port your FastAPI app will run on +EXPOSE 19002 + +# Set build arguments +ARG BUILD_DATE +ARG VCS_REF +ARG VERSION + +# Set labels +LABEL org.label-schema.build-date=$BUILD_DATE \ + org.label-schema.name="vocode" \ + org.label-schema.description="Vocode Docker Image" \ + org.label-schema.url="https://vocode.dev/" \ + org.label-schema.vcs-url="https://github.com/vocodedev" \ + org.label-schema.maintainer="vocode@arpagon.co" \ + org.label-schema.vcs-ref=$VCS_REF \ + org.label-schema.vendor="Vocode" \ + org.label-schema.version=$VERSION + +# Start the FastAPI app using Uvicorn +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "19002"] \ No newline at end of file diff --git a/apps/voice_rag/README.md b/apps/voice_rag/README.md new file mode 100644 index 0000000000..75208faca7 --- /dev/null +++ b/apps/voice_rag/README.md @@ -0,0 +1,37 @@ +# voice_rag + +## Docker + +1. Set up the configuration for your agent in `main.py`. +2. Set up an .env file using the template + +``` +cp .env.template .env +``` + +Fill in your API keys into .env + +3. Build the Docker image + +```bash +docker build --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \ + --build-arg VCS_REF=$(git rev-parse --short HEAD) \ + --build-arg VERSION=0.1.0 \ + -t vocode/vocode-voice-rag:0.1.0 . +``` + +4. Run the image and forward the port. + +```bash +docker run --env-file=.env -p 3000:3000 -t vocode/vocode-voice-rag +``` + +Now you have a client backend hosted at localhost:3000 to pass into the Vocode React SDK. You'll likely need to tunnel port 3000 to ngrok / host your server in order to use it in the React SDK. + +## Non-docker setup + +`main.py` just sets up a FastAPI server, so you can just run it with uvicorn: + +``` +uvicorn main:app +``` diff --git a/apps/voice_rag/environment.docker.yml b/apps/voice_rag/environment.docker.yml new file mode 100644 index 0000000000..1a09956027 --- /dev/null +++ b/apps/voice_rag/environment.docker.yml @@ -0,0 +1,21 @@ +name: vocode-rag +channels: + - conda-forge + - pytorch +dependencies: + - python=3.10 + - openssl=1.1.1w + - portaudio + - ffmpeg + - git + - pip + - pip: + # Installing vocode from the git repository + - git+https://github.com/ArtisanLabs/vocode-python/@461-VectorDB-OpenSource-Documentation#egg=vocode + - azure-cognitiveservices-speech==1.31.0 + - python-dotenv + - ipython + - deepgram-sdk + - uvicorn + - pinecone-client + - poetry \ No newline at end of file diff --git a/apps/voice_rag/main.py b/apps/voice_rag/main.py new file mode 100644 index 0000000000..d952d688f7 --- /dev/null +++ b/apps/voice_rag/main.py @@ -0,0 +1,85 @@ +import os +import logging +from fastapi import FastAPI + +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer + +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.client_backend.conversation import ConversationRouter +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.vector_db.factory import VectorDBFactory +from vocode.streaming.vector_db.pinecone import PineconeConfig +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber + + +from vocode.streaming.models.transcriber import ( + DeepgramTranscriberConfig, + TimeEndpointingConfig +) + +from dotenv import load_dotenv + +load_dotenv() + +app = FastAPI(docs_url=None) + +logging.basicConfig() +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +vector_db_config = PineconeConfig( + index=os.getenv('PINECONE_INDEX_NAME') +) + +INITIAL_MESSAGE="Hello!" +PROMPT_PREAMBLE=''' +I want you to act as an IT Architect. +I will provide some details about the functionality of an application or other +digital product, and it will be your job to come up with ways to integrate it +into the IT landscape. This could involve analyzing business requirements, +performing a gap analysis, and mapping the functionality of the new system to +the existing IT landscape. The next steps are to create a solution design. + +You are an expert in these technologies: +- Langchain +- Supabase +- Next.js +- Fastapi +- Vocode. +''' + +TIME_ENDPOINTING_CONFIG = TimeEndpointingConfig() +TIME_ENDPOINTING_CONFIG.time_cutoff_seconds = 2 + +AZURE_SYNTHESIZER_THUNK = lambda output_audio_config: AzureSynthesizer( + AzureSynthesizerConfig.from_output_audio_config(output_audio_config, ), + logger=logger +) + +DEEPGRAM_TRANSCRIBER_THUNK = lambda input_audio_config: DeepgramTranscriber( + DeepgramTranscriberConfig.from_input_audio_config( + input_audio_config=input_audio_config, + endpointing_config=TIME_ENDPOINTING_CONFIG, + min_interrupt_confidence=0.9, + ), + logger=logger +) + +conversation_router = ConversationRouter( + agent_thunk=lambda: ChatGPTAgent( + ChatGPTAgentConfig( + initial_message=BaseMessage(text=INITIAL_MESSAGE), + prompt_preamble=PROMPT_PREAMBLE, + vector_db_config=vector_db_config, + logger=logger, + ), + logger=logger + ), + synthesizer_thunk=AZURE_SYNTHESIZER_THUNK, + transcriber_thunk=DEEPGRAM_TRANSCRIBER_THUNK, + logger=logger, +) + +app.include_router(conversation_router.get_router()) diff --git a/apps/voice_rag/manual_pinecone_ingestor.ipynb b/apps/voice_rag/manual_pinecone_ingestor.ipynb new file mode 100644 index 0000000000..a4a0543b30 --- /dev/null +++ b/apps/voice_rag/manual_pinecone_ingestor.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Colab_Link: https://colab.research.google.com/github/ArtisanLabs/vocode-python/blob/main/apps/rag/manual_pinecone_ingestor.ipynb\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Install the Python Requests library via pip\n", + "# python \n", + "# langchain \n", + "# spacy \n", + "# unstructured = {extras = [\"local-inference\"]}\n", + "# layoutparser = {extras = [\"layoutmodels\", \"tesseract\"]}\n", + "# pinecone-client\n", + "# openai \n", + "# torch \n", + "# tiktoken\n", + "# git\n", + "\n", + "%pip install langchain spacy unstructured[local-inference] layoutparser[layoutmodels,tesseract] pinecone-client openai torch tiktoken git\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "Importing necessary modules and functions:\n", + "- os module to interact with the OS\n", + "- Pinecone module for vector database operations\n", + "- OpenAIEmbeddings from langchain.embeddings.openai for generating embeddings\n", + "- SpacyTextSplitter from langchain.text_splitter for splitting text into chunks\n", + "- Pinecone from langchain.vectorstores for storing and retrieving vectors\n", + "- DirectoryLoader and UnstructuredFileLoader from langchain.document_loaders for loading documents from directories and unstructured files\n", + "'''\n", + "import os\n", + "import pinecone\n", + "from langchain.embeddings.openai import OpenAIEmbeddings\n", + "from langchain.text_splitter import SpacyTextSplitter\n", + "from langchain.vectorstores import Pinecone\n", + "from langchain.document_loaders import DirectoryLoader, UnstructuredFileLoader\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "We are using Google Colab's secret manager to securely input our API keys.\n", + "This ensures that the keys are not visible in the notebook and are not stored in the notebook's history.\n", + "We also retrieve the Pinecone index name from the secret manager.\n", + "Then, we add these keys to the environment variables.\n", + "'''\n", + "from google.colab import userdata\n", + "import os\n", + "\n", + "PINECONE_API_KEY = userdata.get('PINECONE_API_KEY')\n", + "os.environ['PINECONE_API_KEY'] = PINECONE_API_KEY\n", + "\n", + "PINECONE_ENVIRONMENT = userdata.get('PINECONE_ENVIRONMENT')\n", + "os.environ['PINECONE_ENVIRONMENT'] = PINECONE_ENVIRONMENT\n", + "\n", + "PINECONE_INDEX = userdata.get('PINECONE_INDEX')\n", + "os.environ['PINECONE_INDEX'] = PINECONE_INDEX\n", + "\n", + "OPENAI_API_KEY = userdata.get('OPENAI_API_KEY')\n", + "os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "We are defining a list of libraries from which we want to fetch the code.\n", + "Each library is represented as a dictionary with three keys:\n", + " - 'name': the name of the library\n", + " - 'code': the URL of the library's GitHub repository\n", + " - 'documentation_path': the path to the documentation within the repository\n", + "'''\n", + "libraries = [\n", + " {\n", + " 'name': 'langchain',\n", + " 'code': 'https://github.com/langchain-ai/langchain',\n", + " 'documentation_path': 'docs'\n", + " },\n", + " {\n", + " 'name': 'supabase',\n", + " 'code': 'https://github.com/supabase/supabase',\n", + " 'documentation_path': 'apps/docs'\n", + " },\n", + " {\n", + " 'name': 'next.js',\n", + " 'code': 'https://github.com/vercel/next.js',\n", + " 'documentation_path': 'docs'\n", + " },\n", + " {\n", + " 'name': 'fastapi',\n", + " 'code': 'https://github.com/tiangolo/fastapi',\n", + " 'documentation_path': 'docs/en/docs'\n", + " },\n", + " {\n", + " 'name': 'vocode-python',\n", + " 'code': 'https://github.com/vocodedev/vocode-python',\n", + " 'documentation_path': 'docs'\n", + " }\n", + "]\n", + "\n", + "'''\n", + "The function get_code_from_github is defined to fetch the code from the GitHub repositories.\n", + "It iterates over the libraries list and for each library, it clones the repository to a temporary directory.\n", + "Then, it moves the documentation to a directory named 'libraries_documentation/{name}'.\n", + "'''\n", + "import os\n", + "import shutil\n", + "import tempfile\n", + "import subprocess\n", + "\n", + "def get_code_from_github():\n", + " # Create a temporary directory\n", + " with tempfile.TemporaryDirectory() as temp_dir:\n", + " for library in libraries:\n", + " # Define the clone directory path\n", + " clone_dir = os.path.join(temp_dir, library['name'])\n", + "\n", + " # Clone the repository using the git command\n", + " subprocess.run(['git', 'clone', library['code'], clone_dir], check=True)\n", + " \n", + " # Define the source and destination for moving documentation\n", + " doc_source = os.path.join(clone_dir, library['documentation_path'])\n", + " doc_dest = os.path.join('libraries_documentation', library['name'])\n", + "\n", + " # Create the destination directory if it doesn't exist\n", + " os.makedirs(doc_dest, exist_ok=True)\n", + "\n", + " # Move the documentation to the destination directory\n", + " shutil.move(doc_source, doc_dest)\n", + "\n", + "get_code_from_github()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "The following code block is responsible for loading, splitting, and indexing the documents.\n", + "'''\n", + "\n", + "'''\n", + "Create a DirectoryLoader object to load all .md and .mdx files from the 'libraries_documentation' directory.\n", + "The glob pattern \"**/*.md*\" is used to match any markdown file in the directory or its subdirectories.\n", + "The UnstructuredFileLoader class is used to load the files.\n", + "'''\n", + "loader = DirectoryLoader('./libraries_documentation', glob=\"**/*.md*\", show_progress=True, loader_cls=UnstructuredFileLoader)\n", + "\n", + "'''\n", + "Load the documents from the directory.\n", + "'''\n", + "print(\"Loading documents...\")\n", + "documents = loader.load()\n", + "\n", + "'''\n", + "Create a SpacyTextSplitter object to split the documents into chunks of 1000 characters.\n", + "'''\n", + "text_splitter = SpacyTextSplitter(chunk_size=1000)\n", + "\n", + "'''\n", + "Split the documents into chunks.\n", + "'''\n", + "print(\"Splitting documents...\")\n", + "docs = text_splitter.split_documents(documents)\n", + "\n", + "'''\n", + "Create an OpenAIEmbeddings object to generate embeddings for the documents.\n", + "'''\n", + "embeddings = OpenAIEmbeddings()\n", + "\n", + "'''\n", + "Initialize the Pinecone client with the API key and environment variables.\n", + "'''\n", + "pinecone.init(\n", + " api_key=PINECONE_API_KEY,\n", + " environment=PINECONE_ENVIRONMENT,\n", + ")\n", + "\n", + "'''\n", + "Set the name of the Pinecone index.\n", + "'''\n", + "index_name = PINECONE_INDEX\n", + "\n", + "'''\n", + "Create a Pinecone index from the documents and their embeddings.\n", + "'''\n", + "print(\"Creating index...\")\n", + "docsearch = Pinecone.from_documents(docs, embeddings, index_name=index_name)" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/images/vectodb/pinecone-create-index.png b/docs/images/vectodb/pinecone-create-index.png new file mode 100644 index 0000000000000000000000000000000000000000..11b84c0baa8c57411aab60d404dd3d56d48b3031 GIT binary patch literal 412248 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

R5Co3e%^)cq3m!qnIM9fH@}h5F7$ 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

HcNW zY3iUf_H*tJG)6{KouP>`i%(8h&0ij~67V9kEPZW^JpP3H6<)v>M>POTok3Cuu8U`` zSTh+qX!0G#SehQI+A9>3)??1l7+on$Q?)+KjYZ2Zj>n!|7vYemjG`vS&R30@2EDgC z?M_Vv)QYffl;eZzO@FqxHx#`a;Arl8c+%(kde)ow^cUK!&!#Hm>rvOd$WrL!*7DKi zM)=|F)oU%yzTd<5oDk35f@bgYN$GH{43C51Mf;n(k(Ji1i6N!-wZ0+DfLB*jmGmS**xmU(8=AMPo@QE}XxrKgB{ zKb_j!z)4kq=B2EnV(-nyLx;>~Ssyc!w>eV(&T+38lq8x2+~K?E=-T|b@dRjzKM=KG z9;?X_XDcVeCvE4ULjv)bQ5XZt!#Xqwh%N_v7nk9KhSmB~pbVzstO;6vlveFDl1_A+ zYhe|ixZI*qSfG0rKRRXl@Inv=vnUhN`15wMJzbBVpB%xpFutGS<~0%(U?=X3CFnR3 z#S86@N0s;%25vpeuOM$R-JI(&R>+Lb^?#w>_{!}skOWx^Ot);8e z{);`U*1L0QVw0^eTwG}^JsaCl;f#S_Hxw>^ln;SmR_m>r_Xy8cQi3EY$`rxkinqrQ zm>}PG2VWSt-jArg$xyZRTtB82`m_gw{_zB~3YqWS;%($GL_kSC)r*a5j5B86p2eejMJLX+LYPWF2#d0Wr|lfXLR$=Y6d$$>=R-<8t1#evv*aje3R=!fv|bYrQ_ISS^*=C^^Zm>LHFl z`dxihbbeK9%(O23%Es+B{PL>&ey_M~)5xFYy%8ZL6+vz2M}hviLOhJ{mjoKgD1KUM zoqQBWcIXo?!=y6UVVLjmOyxS1BkSFTW((%E;<QyJ&3Zc zFnr&i_9q`61bi5fM1BG*?fJ}?q9o2 z)Z`pk;{{7Dqcj|z?60BxcM0$6adH-UH&4)pvWWRD-Xi1q-*D^8t!5BI{w$NWpIF3Ve2I9u3NN+3 z>ia5x@q`|F42&e)EcDe9!KUBvyT@@Ep%$8769bxX2w+f!1YCg*sRqetUt#0|OC<)s zXZ5C<==xHDJ?ad$rYRvO8Dwr$1Pol=x2yPb`!yv6CECx-pTr=A<*Dj_7mk%d&JZ{f z{v7DX@zO{qOa^h?{%SN|{q@5Yev*OU#b=>5-outSVB>LmeKl|f#84EjoK&t|fd!3; zcKRnfJJlP(grrVQ{;Jlum$-z4`Mrsy6@t5UlLg-AwObiLBQT_8yHJzg)GXvZsi+l2 z@%lE==f>ZPL_Vnk$=8er z0^{qdNbTlo-3$3X(xa7>Wh?~|_nrkXT9f23CK(IsJPFO_CSS>jth5O|Se{+o{FVI* zuRbr59rqCRWW+$QJ>|g^VPWhAF;({}YBORGOkDvjlwC!efjWRPng9oNCz<$#G9HdN zDo0;}Y8Gs_AH$%gti>RI$UjyN$s!gf64-Y)`AMU9G>velcLNt&LA9)>OZ=cJiF_ah#MZgi-Zg|F`p$1VR%&mOe? zik)n`KNI4!TR?)iES>#I=8*9AdKkI8@Yx&h^*FC9*S%{#^m$mY)4TZF$Y$8K4I~R* zzb;l*+UyQTR_>fc(m<@1*KRrA?P9yv+PE~)-F=MKGDZ1eE%0yjqUlt&U6(qI3T%S} zNEK=6!+(|*$ZEQi1<1UFc4rY8uzQ^3#f--u1rd$BwR>)=H5S*lXV%J03xn0A>KFZ4w!o%dNZ(z*mTd1S$*ucoCpbNGcBPM zE45><7N@4Tjk^Ljyz&3HU)`rj!6p5SV#vgSBbMWf@THWY5kE*7?&c>p4le;Odp)hP zBs;`cJPU#gzs(!akJdSif|2YqfUWdx=Gf%pp;}Wm4I|80a7T2xTtr(L_w$GERRPzr zGB!4E+KO8u`IV(~SdvJEv%af74Ijvk*@H<`5&7f6#jI1rQxr66CN+xQ}AxS(~nR#*z!rAV3z`w3(>a_gTbvtt%?i z!-tyhA8XyC2TPVVfyO^goH!^C=a@N44i%1vy+SP-sh5^$t}ZACLQDV$B{b^J@;5<_ zuc@fbB%sAq?#Ed9?70cq)gT)(q;8dRe_E!x^iUnGw zcm6mLDDZHqM(;wS;X~p3^3~zlWiUIcyPiL(5si*TMKi~dE85;+!MksE+w$IkJsky- zzwLh7pUmkA&zogU6{zH@X^bR0DMB{J*xDCbKAL(4_sC%2| z4n2y$M}!*l^Ur{b^^T@%_J2ng_bQZ##KfwhVbBme=^9!I;df4agy$2(4#d>xi`tt= zYN!H7hV?IFAWB^XXAHlo6ykAL5z;VNUKS>I6zqw96}0vU6}PDIfPO6#(X)h+2yaP> zXSYGaq~w&fwO`2Db&pLkhKb`~Wc5>!pPDCX6ToriKDAIV4%L6oxlbmB&cGn*@HrGt zhH406O&`=Lu1ccM$)LZDAQMW669I`QP++7&1lFc?IXO{Ph6vdDLsY8}_C;>ViPXbe zo5PZ8MT@}!h^&k$D%EhH7$uZ45D`&KtWQ2%j_ETh>Ut|Z*7B?rvelGSZ^Ky_CBHFK zZj6{{7bP@WtN;;@^QFbB_H66J)|s3BD83OhWicw=y)lZdVzv4Z4UMgVxU;`KqC678E#N&^Xc zNwJEMPNZdtiu!zq@;M0&0ZwK1Q3WM$7w=fwE19EZlqf#8fbc*2G=WEk4`<`*@NZ)^5qiwadLaW3;dIkuSC_ps`@ znvrQ;7c8vd6`>6h!V)7D_)cLD6D zn*g(dw0gCb>GM0Kx7K`QXJ_Xdu+IT&K>G6Xa+J@l3Am5I6WcIYv8#J5`E9MKxt@Qf1NUxKC!rXlh5Y0U6A(P-3_DtZh!xg8RF1SZc*O4S7X2I zzFY27eUP7Yzj%Lh*nai<@GE%hXa03Ba&qzz@=tT?z4A)0?}CiLA0Vse@W$g%WH$gX zQ2JoSmo7d_=ueR_~bIp=i5W#6=cF&%HyjV z@L9Gpw6OAya4YwdTpdcc^_lvi@0xE>|BNyQc!lYESeyU;UGMy+lK2@}dfif>yOtmo z#(G+O^RVMV3ZBGYvJ_if_(Ml0z1<6U;5KLAA7&Yv@}kM$ykQ(dP+v6jKRE z@Jho{nGzA;H+YEGDRreOE!1e`O?~l_iK$~>)`wvU)Q73UtM@D%%UQ=@V)kZ7{E6h` z=QU$oEUwR?P6TD_#8ZC4{h zbPB{iSDPyXHG81B@^!`g#=v_IHAEtBHVUB*lj(J#_$RAP?J`P}OdVH>iSet<@ zRtMbd-@|XCUS0nIKKSRJN1bd8nyg8cU)Mus7JzB)AYM(W>9EZMn}5~!wc!PR=H)M3 zX)=d7;}CN9KOO~28SVgH0C5F8qr>LIdtjZ!#=>INt}Qtd{*KQY z+?-+++Y(5sfY;xs4ksxx0tF~MDk5S{F(syEUlh6S&lh)Y$weiDpJAb}WTfF8NOuA= z#laTMK(EUaR*HkeQnf>wqzFAf-2_#|6P4FhIe$3F19H1J&$a{1i+EdSG~`Kl!+FZ_ zT;!M#q6maO?-warBXiAL3oyjfbH!I%eKjZ`M4PMO4?=;D4;aBC#L<@Qb(|q%iXZY(+*#gOyj8poSuE$%eu*N{&Z~yfh`gf1_6njKPx^S)5~|b{_)I03tg-|J=PZ zV3s`e@wJUx*N+OH4l^^g<{beG;^5}Ve&fphc+?lqe)4w3*k2t8*pL1|L&Mj;z+&Sp zF#rGqZJ&*J7j0`F#q(9rlOCW-z{Z+IrIu#XED$Ezt~6Vbb{>)`7VIbCq@_37$S_2uunOz(TT{ zz@)Y8ap(oyOb37d6wU5J=oC`{e#>xCnNv1)7Izpp_>Pti@3)?N?7ade;3g;RM=PIU zH8EHF!MDnyR>Y~t0SsmgJO25}$-7klsDGDM%VDV1bf7qHmg&5&dQfXDjPH-alBhK5 z4!Q-GMvyVuEZ*n;v;al1aQH}^GMuH$;bE~vL^Bn7Jl9X+7TkT9*zx8R1;5>PSQ;qx ztM^;njqKc=*-kmRRMH5Jnw4@54*sCB6Bg=;+@ia%HJ9ZkV6E@#{(Sk9hq;=NI=H3; z))ftFR(TO9LE!X+UIdU<`wd#9@ z;V~*Z8U3lC?@6CG;kcf9EX|?Ym@#O!jU=_-Zu(p$`Ec}cr;UWOe#7Yij4%U(`)G+L zpfO7dyll5Q^iKqS;Q(e?6a`m72&`e=JWaKjK>Tv-;r4OpHG$=_RksjILrr}Wt8myy zYM(CbHld+)huQ(?h{vh#f7urcne_2OPJ~y$`T+VFB?_nWm8i05W`=GnFH7 z6x`&$t_9Iw3krMJP2b#f+1BcqO`>0G?bo;tf6Mr2RF{%RK9TDt%l&}@LpeLR(XSYB zxBR6wT7n#HARUY+K2R{CKnz+dw?j{5<29+QIqR(4D5#t?fWZ``irVF?qV~kM$X|q% zsWYbQ(pWZ@yD~}9Zmz?LC|xZ-@{T&Eu?85TY5^DG5vk<`9F}&~y-(i=A47c}I>b=O z9}Vb9M9VHKUZvB6fHIYCHV=nF2JuaKeLWuKy~#vG=JK-|{M1SS_A6J=@B?@nD`464 zs(%g!_g}DV`dkBpJb;UskES=R-Ga)S!s~DKV~tW#QBex^uRKe=E2=KL<%NfhE8YOJ zB%wmEXv=k{1#F)+W@BUNO}mB_&;FTE30hNnl2V&4Sa`*t<#ef+&=3|O5-rK^;U>+0N;_U;bg%g^K?E8Kkza40UAt4+RCy3rA^Rcw1X=v2HI?2g%(IC3_;P_SV3$u< zg~f{V({uAvDH5Vmqr=djncK{fuyb&6h2X$sm_53iuHi{Ml{KhwxZb%Fx5j*HZhrjr zLCXgv`3hKl_V)IKHzLL!X=Ih!{6jSePm(cK-yXVa)$7`23UBB6yxK~4+Bv)4O!5Kb zynMi?+8KE1vp4qFbw(#MO~5G$6mqAaaPT<30#`6Lh0CQ0R4U$pf#rE#Ytd5Be5tns ze|Zf`5t(PuRT#T@X2yUS^L6FLB|<}5^NYi3o$<60SEEhV*(L7t1(e2A_Ttj?zmDRUtuzMW zvWj#Bf4(38zNVU*Eecajs4FPx#3U8@t;a4OR2$*Mw_(YAS(7OAb(&KZCb(WFvJwh| z;P@kRV7|c_k;mUMz2{*4M!HLJfqAn2D@tU^fqr9u^Z4~$S!1JOeJ1{QBsR!F65hZ?L2KpR5&rlFk>8a$yBqp=gB(dXi9KPpp^OFa1YC|e8FYw zZcUEbS*79|Dw!N=_`O{`8V4GmLii=cUlBrhHlu5agX_nkJd~$Qt&RS}-_sbWJcr)7 zfJ9iz*d{^4tMps!7h0os&Op{O&64-Mle3LKGrw5pCzvk`_o*|BQ+D^18Np14Q{W&) z;t8U1h}MUbGL%6oHi}e<$wp+a2ikP=(Ob%L$#p<;?M%qR{m~HD516DIzsISh*&R@-&0h5 z&F50a@RLU$+}Jq^R7$4kKD}hkYYnQ9JE@C(pD=Nk^qPHc=Wx!xvV5@Ka}7HVU5}VI zF#sK9QK9Qw;$Z_JH4-jvJev4$G|qQCh)MB$8Gil;fxkutN{(RvfUrO#W_%|( zIi;ymoTeNcU#xJ1b(Dg~`u3j}34MepmY=G*b80m*8zN1-d;Qe&cL5L*Pj*`#S7Z*O zxgx=!`e4db&MTZUG#cu6X{;2bHM<4oOS$ryiN_gZ*mA_g#mQ&g>$}bh3xA{1zNIt| z+wKJ>U~#o5edAqXj=_~DfT2~v#V6_=;{=BDvrr9? zW>TkK>S#4F8S>1@((zE)2y0c%IQxE&8!vFyM>NlY3`zZnk5>5|@WyLU$EHpO!lAJ> zTZt*(|Kr<9V1xi|bHl3!zT)rkKZs|G8|Iv>H`g}9`^&~m9WQE>N;=M?xLII^gYZOdHgHCyKt)+|A6Wt9dsbe(DH3u2!N#&r--27N*{={tb>8RX@iCM3F z(;4BR1Z6$xh=-v@%(6!~ey((?MXnsHk#|r3yV_yAuP9Qz0;04+Q{e`m8u4`5=Dlwr zF|KAkWFJk=Bb1_~p^D!8#!K7-{T2Om`1w&TjwXLFCuJuU_D^;x#=AE>NuM#T4liS> zb%>A4Vof)gH-(aaVVj#8HL^NwrOJw=fo>kXV%hKYR^lP*^;RMdKV~PHT5bYGS*|lN z&mXIB*rKi26;-UJ8RTxYNHNUS@LR35Gezh~5_!W?8a-6Cn+0k-4VIDcfKqFC`EQ*8 z_HGSyZJLG@s7458NGLL~@nPcgG_NMRFGBZgR zg%3oXu~x0qjie!MwrUtz#y|8n_p&I>&CC|~S#qYktNrk+g%~uU1fE`PBGsp6oRA?(CX|)c#5^6zHJlSww+Kb5o!%-=rWn|-Jq*`3 zIfxc@pM!}%XilgK5Nog^;r7rf{5K`LFTUs~eAdzMv?k1I2^y@MWZ=X4}(P87(>SHy%WLsjNbXONEF=PE};t zs3}N9G`+&2Uwci zEGon`O6(21$y7KIB3!5oJ#9lgZNO-dc|daSOlp(QD9_Kn14Y%j^kf+L6cL0 zXlF0GLSrE%l@?&e^>c8gaV+sB!ivQzK{_sfLoOg=CvG8Y=w-#}dCXR-MER&!VL(y4 zeJhWtzZzXEjcW`}8GSXSvDz3p?XymK971CR8rzc=p0D2&vQcyCo*jN+*ho^tyUEUcIkg#PhgKWwCVR!p4U!CXXOB-&yYz`G zw}0SJ?AvB!u=Cx%B*_(Hl?*ep(kPCHRiK&s>dF^r-MtnEKpqba`8_SuIivwx?)eFMO- zxfq{h)8(`0HXpZt28*(E@+^Z?Mzz9;_{zG3lD&Y~g_$Pz@bWFKT0LxM^a)kBT5a&i`I87fE9Uh!4X;GaNa*M@T~wgz7K=r`VH zcOFmLj7T*4{Mzp9t7#iNFhRMIwr(xngrHa1N(yjyrQ%X4N{SRJBQq5H!pk7;BuLpU z?3V@9_ECTJ$HO~T-KBGY`@-!juKYxfw|JK~-igi;k8gr6 zqqajY=aZRA$ycW_=7^n+I#CS4m&hx6Fn1BBB?t`4xdeT0YrQ1@El ztF!GK`U*f`10-0iCr`Xj;xcu={cX~-Z$0xm^Z;qlPg(UZ>6Y~gTKyt8T3bzcS3EIH zhWkF#K0ZXtQtIIyiC8fWh2-d2kQhdkYP3*9w0F2=@ZxY{)AaE11n5Ws* z;Zqv>>ILZ8iEMv1ZX968o_g!!_3>j~OhX--Jqof+$(hCMlk-n3;)@xLw}~T0e3|}mC`MpE_jov zR9P1p#?eQ-3}B)M&4+E%rCPw``f*GITlltx9_gr3q)E&X-R$Q8LYGb4o!wQFl5u)v=sb^F$?!5F5%{4iv+S zcev81omjldqYic`?yd>PGM#5aD~mI>zUZBOk$AJ{bz#T$?UL(e-{S;Vdar#_Y4ZH% zsRZ>&H`9Y5A>7fIi%VK=_Zvd(mrHN4y?(tobXsO>xmg1s z^F6|$+eO;Ku`hQq^)@$ALf-dzvKxR>axZwmeXaNR?5y<^K%RPk9rc29379-v>&HdA z#n~TQe@*|q1r}ZP*J6Yeqfg?rjHRd_KYU@ zR1{d(5$~{8k)`uNF1}EgT!EzfZ^V;?iIcp*L`6AW3Af(4&*)q#-GqtP+Wy9cp~2ML zycs{My{qWuLhWIA!o_eHGOb0}nhaQLrTqwWeE$Qha zLC;bD`m+XikhWk$yf3>+-(0po zf&XyS=|TRXSK@|%X3;Q6Vkn5&}AkQ_SMOya;-Bj7^b(c<7^ zVyw;!(sM8|A*sSAi-pB*_)V=W5b+*9dqJRCc0r!bgOL=)p;5iVk)9_h_&$h2gRe%y zOhHS_CC4KnZ3F{uH5@NS$B7y;RY79hrfkjfVyBmynXli-T)A^0WUV< z{P<^+(;`YH;Jg_coPbjrIOSsXSGQ}}2+1HQ0rYv7%h>-d%o>rXm5K-yPJ^hRXT^$y zIXjZAGLdK{%2*0$q`~4)b#(-pNHeCMJSl&i9uE{$)aB-A5)uYFxs$0luegG_{fi=z z6LqH&MJbYz<%+@YS!HDJ^Vzq5(;k$aRa#*_d6Gw5Ep!;m?A})!Z%LorLceGoo(f+; zgD>%}htZRXZ<$H>rD`-&x!#QKoyWl!g@l2kOx22rNbx`lqxmIV zuFG~}itwQF*|J-c)=+%`*#%#@9uOm7d;XCK0jDQ#sU5q}P#W9WTK5}Pd{z-cm@m&n zB-h%Hg5nO^AF7cs4(_^$l&8Y7mo6lv!Iq~`)2<| zy&W&bGqqiv5o+D9U8#(5T%!V}nz0iB<&=@o6KK7RG&5u0yi^UHDFMJY=*Dm>k`cYx z>4UP>s7aHl^iGg+OXdT3hyUEu^`gZb9AM>>ga zhj{0BQ@*Dv*iY%6;9-)ohiO*L2x^E^@>=7;#UPL#i$#pkGjtVsI8Lcg*p`wP3V#~U zU^<`6Yw2wmTRO$DtFO0BI*6xndCn_wNXm>f+W)MKVp0!(VQ+aYA?g!5VRoz>PaYSg zGul|KY^cqzIj59OqOth)PY$Vd3N!e5UzEJuiCp&^Q9QLk#jz;JG-8d^r?1W%B711? zjz~hVLxQEiVSA>F^R&UfwZi{z)~+d}HQ=zaMTK6 z5jAiJY80RyH0zRe^fdJ|H~t#1aw<7}o749Xd!zHBK2CW;46-$!MnpNB$tDygmGjj3 zcV14i52UWK(=n*YlpWIfDH}1WJF%qY9S9@Aw1P_1=mJ!*;l-&cHgU8OrZ{xYVof*o z<2yx_kwo`tU6awoJBx7q!^ZSPWevaMqFtxX7KX|i{nt&i=Rw?R#b6Ik`HmtRfmPyr z7KG|wPiYd$PkTwZE+P>CDNu=txFTS@x3EQ|$Iu94`c@$NMh8DLyb!sV-J_btQNSoj zT8<&IApL0=l<4))yK#l}m{(b0T?Go~gqv!O({vq&H$tbq^b#_kS| zq%NW#w&c_o=Kb;KPwv2o`9oKsZ7%os?53r>gX)BA%^3Ulq!^l!6z|J;1)VdklH$mBEngG{* zZ0dE}FZ7?IaO9NglwmM+_&O*ci@^wb{7?f|TQ3Y+X3s{_V7?{QXo|lDCs? z!HWuS-fh%De7;QE2fGNy?S)%XP{|&NAmU{Yx+hdH z)QGbeOtE=;A>F(@cqdW98)3NZH4G!^k;Eo>^##2MgI=r}IW*-&iU*w0uVz>{n@88S zk#)s-=QW&leok0Os~#% rcF{$SQG6qK;yDfbiXUPZUDMkQy!P2z(SEKjtH&Qcmc zKq|%-Q=ljPN~5AIrb^5?7!1zo{=2}4#3n4AA3TcRuqksY1a~58zEcg3CC=^X3P$vU zBc$r~iz!j1+{{z%5bx2EfP2@X<>+j-(v_*Zjc+4D$jXo+#g-fI(Cz$;(~OBdTQ}Ch z!1D#ia1ikp*%{2k6ixH<)7`KWOL>yWz2Z&d@70P(x^=n?PNCmBcMy3I>Bf73A`Q@(k3(X+xYF7REPk zT6SlZ72j&9nm=#U=`uqbEezTv=WA;&4Zn$3&9c$Yd4Kr&KP>=lwT@;*3im*7K`xD+ zow!KD*)I~E+10Es`Nrfr1wTm26Lbfr%ny0X9oY&eb^3K#CalFb(Z2K6XUAm8)b&=x zTyiHwoQkrHQ7MntP`%`ngY8a2?Rh{3&QA~}cdu*nC^>tX>3KqmJ7#mXZ|`$6rr-K- ze?!Egi%1y=5@+@{hmzWL9PS!zDqBAR;C9g@ z{)Vaw9g=6ofIs`0^wkHsT-tN%r5{;#{C1Ax^SKgOBuUB7TJ_7t#X2pNXT;@rs@(*= z7frkTw&M}>w|@Uw2s$+%*YB5o*>!1drBM2FSBNj>OK1Tv?&kabqI$gX1@-OpJ)5)~ z8$4QY?hYE{*AG`SjcsQZ70aMW1yo{`5R+jIt+zZ@6M1}06%U{G>p_-O^ZCdj-#-u4 zpGXPH!}NMh=)z)edzF*Dy0)-w^ z($4KbM`^y_02 zmnF|#p2m3g?iXqru}QM0uFO&W@o%k%Yy=ml6?@C+%9<+5ksb5(sn5swL7E|h*Lhpy ze^Nq=v0NX|D zp~&AK5@W)r3WtW5r3N*o104NiTt4@=Kt^->sF`uYEOB28A_ArIy)M4WM(-$#4cZRzQKAejI?{Yx#iKCp*h?plM1MaybCm zPD}T*riZN;ZMP>wQ6lGa-A{zdL>MpEuzg%jO@F~&e0KdiE*+l350bpL#xi|COqtBz-O6x@JsH<}(QFgp(mBdG&`T7Yc%7EPu?NPk;i1k1508-d~Y=K|V z=f@y92AHH+s4Fjf79uGezf*x=DKXSFAlugY`e6+Sdw_`Ifw#+fz8!B z59MQ!*(n6PAJP9*buU)9`L~1qP#4NoB2Lbd;)aYmp`oPGgVkchPNx@G;5d=GNS(^Vuy? zR&Fm=q&xG3SPNR(pphl?e~idrAB`2qkS*o4Kr53SsNrdgS&ViJFb;*$kIdo3sM0LRZ=%GPV$H9v(!Kq$|4WzD}W;WclRrE3r#kZ8`>hs1LU!1yG zdANVn*8!X_Q`q{b(4jDpM?7WL{_u!#20hD}1(3~m3i4?V0Gsvr4PZ!H04X7mrvWkS zYfr%Dy;_)U`vl~-Z_@dXLG)Ys>@E;R^#DXQ5TjhBjCuYBL2^rALV3!f`w?`B8=66! zk=kS88i*3JxjNYd-Hk3F59}Le`@9Bl*FNAjgI)VmYQd{taf@0HgX{*!1)y_syL9O7 z^7E@hKaev6I4powo=Ap2eM|}kyZtfHSG)zWs|{&)AYA9;W`fpZAQ+@TA;ocoXO_w~F!_qRg7) zb6%TycXzM-zq7sN4?VX0@@kqv=&(6mJQWJhn;K{`U@ zVrqWmmJ3mKy8P();I}h>g+|go-fXuofAoCEAg?E%s4!<@I?0$!kumjlcW=+Imfy$r zDp}%_e$Cz$N8N%olZCoJ{sbhL$=}KWJ~5H2O7g9WZzm(%47*v-xqZ##Hq-N_!H^m{ zqugxTvfz{qM$#v3N{G}rwQ}ESnJmcHgNuGHk&sp8F)DG7zK-Di3^LKuU6$Rz6$7CO zKf%o}nce}xZ`XdG+nEJt2A?Ywrvzu92!Cp-Sj9wt{{`~6N z65{s7zKGLih8gmx*Dld0HJDiVyFHoV^!l0&hmi{Qj*K{iSOc-ar35b zIj{51lru=VeB1n~8*vCswuK_r*F)f$ir^Z3r0BB&2DO&wyT{)Q?PYp&0fR3Fh-9FB z`xtKc01RmS4%EK6p9Ob-uH7&^=P~(hPs;=PzlHZ9nK{Y5*}^q#OA^i;oL-n~B0)A< z7zrgi>0}iOE!q2Eh)QJ_uV4^*f4;;35-eG~RI6CZj!>BoZ92kSS=JtOp4%ei0%zqC z(sNP4j+;4us`6{xcstnMIZVg@A+iqhwz)4 z;n^UVe;{HuE!GQRcEO12DisYo5}A^jYIYqM%(Ab95xwX_swEY11|0=0R>vmKNJ`|$ z&{aw0Z(r5SXy)sO-vG%CstgY>=jOJ)+V%dOwx7zly+0g4D(3Xic*A4X<3!Gy;15!^zfB*gnG7osv=@ z+z$rfpAKNjxCb-!*X-t`#)lJMzPgs|VE`|G6xp?ZUH4eIS$@2>fX`g1SqfrLffl`Y zD043JV!gu9lc>^F=-=!7-TxOt_ZzwAvD_LeDySSBA(V*mp)IrAW)xCyix6;vv6pGe zd^x1VML(oR6HqTdP54|wORLJ(=ZY|as*D|>Wlj5QB%7$gtb2@Tps6E-^w|rhy!N38RM}nH~92E?mCa9XJ zW?}B6gTtZ5A&Mn{1`VX|KamaLqK%tvmDiIzKth^_Pf`83O1)tDxBwYCjqm^&VGp3W zqZxs7l}Ekc0{-b^>e+cmeEm5%U4cIWD`Ex+FoK+~_&l6TM~s-CJ~|k{48CAfS66t& z0%pg@v>NbW(BOiZ$pi8zy?m@FhE7Z8Yb_c*2x86=zk~b1pjJ?4f%)pV2Y(Dq--a#o z;C~;#!Tx|Bk)h|YylOoWS0BLJLqL&m1Xg?=P%tnLJ2&BpMMW< zp9s#KD{W2}9E{TT7E?g&X7Z1@f6nY=!fw793m=o5B`V<4iqFq2aXyzrvliS)mdR3b zN2T(J`ig=vc{``syc`O25+DHv!GwwtBHw!NC6nR2~G+xZ&9tEwcB zjI+ABDoONKot{96e=RU2`f|&?Uuf9@)SJto;5u}lZT_eDavWj_2SJOVI32D`0&-7K zii~!4cDCQ|wto>gabmi~133!`;3V+4siDPt{v^@Kie@PFR8ZG4w~>GiBjggf=ds z$um6bus$;TBkyPGRK5xfk60GE2%MJ_wMKCKLuyp;43h7YQ6u3;uKpNF3H&`X#>>XH-%6SnZbiG#!iX* zN39&3b`5XiqM(qHfYjSnGE$*W-nGrmCpKTle~(1najQF#ZCL`N({|mY_nHS{zXMsn z!@Uz>_vpa{qq(Rkl$yGm85q~hA-rw$_>?LY3h%FiMA+*z+qOc9e!KcNG!Q#eX`Gl& zhz5UeqMN`!4s+qNZ|?Jvg1v|DbiimO(IZHi(ch@w>hj*~Hadtj7Mg8ucRAfTfjjAI zZ7DW|(_tD|z{kapr70z#=M9A$3bc$6qr!op1>tlk&_F(z$4rgAqQZyA*Tu0!#3i+> ztC<*VX?~b(TSOZA-gexCgfo+}#Q85C{<5-8}?%4esvl1b4UK z?(Xgq+_^JnpMAc%)cQeDP>VI^n4`N#_xrpT0bubQT`x1*NWN+*t5wx{IE!&$nl~DwgG-viU~@2uC*74RqErwb&DXU3Icw%?zjbeEb;Kty~5T#Dbjy zDn!q#My@MO8^ltUJx~zW2=Zi(<$L#-*B@keRj>o;R4Ss_-Kj*=TSz(FGJc+GI;oOL6Nm+7@8|HDyQueqsp&P8|@kWHZ z7zcw7f#v?6*Y&WkkDq_F6&P%c8HFVROD(fF;Lca>m?Kwp7w}jB@(G^rU|NWero*!= z!{Cfl*0BtL1!tC*%(CfG=XbGVDbgRD;ZGhtJ!P2L>zn=z<2IZ-PGoNI?XmgdRNb$- zm)l*LO_^98p{kif`crW@*p-&hcQV*gR%#Q9pqi|{W>J;wWoXGD*Ba~&0`^bDe2|rR~Fy)^A(=+%TnS%)@!Xm z>zRNY*nd}=ZF*Kggph~+duNL0EFCK<8Y<9%g3wDXWJ1?ro`6(jEy2=V)EH%fh5Vhe z)siBtAi*bc1; znTIrmZ|B@ggB-2&T`n7Ft6J`eDv?oh(2%kvmZMDH2h=2%iwOdF@+vDySWEg2l+%x7 zMBpF_3L-E)IA4E|h#--Kg(t?Da(UwV)BH%Iwfoz==EZ1@$J{YFAUOB~NC({Ohz(2u zKw6xN+Q{qcT3%ipD-5B#)rzv}IxJ`;3EAVlVj`pEtwn|QO^h66Ys2f$&(=&lhwhwz zR>BVF`#UpGeSjn&eZspEQKQW$GL8^<1SZ0}nMXYuKrh>JITU2jAVKTVQB-Eu=-@Ku zD2MgNs=S3t*{J@24g-FjI9J<)m+=yGtg}=r3VQg1+Yuyt3Ju3Na!Pt#3R>?^4V_6{ zozjkp+!O;}_)vv5L&&6<(9K8Bq$TehrSj-Lrokl!E}G~iOKLU*8`+u^As8-^1ofs; zfx_m^AVnZSD$!!l0a($0s3?;%z2BbJ+yjBrhm>nZHA3h&2xKcTAKD5|X9ug}jSSc4 zg^O46J*_`2*XM251L~=rTS(Ze9@qHq=L>7CL4kphbXsht&kYCO@^Id7NB6yFH-%|$ zCi^FZ9q%%#+K&7r->#Yt={*F=BfB|wf_VX&dBSUz(jfw2?Xmz_z?3?=5PtDvU+iNVV@MTEXFbcBaV4k zw0R9dJ#fKE6$o&mntDj0GVHWO870A^Vi-4-O77@8a{0t=rFAyimc*Oj)vK*<0t-iy zrQB{sH3}*@8nlz8zv}9opJWhv7~7U_dL5dMAYjBeEogcE5m@{4ljr=Q8?UnC;r;D)H%@glZQ=eUb4%CZ z5k|n}mD*CZeTAi<~bDqSI;Qm?ksfopn z$vg#a8D^&Jdsb7YmtGS;JL*WJk0O2T3~uga(|WO&o2lLPj($FBXmffJ1ezg+KS*ye z*4UB`uG_zhQM{QcPAJIKWb7kCuLM;HqMxXscmq@1{wxU^p|Mjc+lcp2WsgYSt=q{c z66M>Kuu7R4ig9lO zr%;jrAHUM`vb!Ag15mYazrWl%uf1}CV8Oi${pmHG(t+Djl(o+4{QUxO(SrOtOF{qH zd+XJCqy7lEW;}LAS7wg=^|C?+J5Uc|rB zhh#~E!`WY0W3Xrqk?JkZnyjLe_m%GOzkN9UKB!JU&Mv~0fmv6GMw3nDW*{i434eBA z!1egEP)q#=OJ0Q$v0g*@`|YQ7vZofPu@s4qi!%Pn4LiZGC?P_)w4Q{pTLGBC;lV!e zaxo}fK4#Gndgk;HYVm`DUo~N){q^)jxqrQ|8RjXT%;P&RXs3;LcER|-oNv^8f3-bX zz!%`=nA=!@0x?03Bq1Rpz1Qpoe_p*@PN2me_xF=Z8hBI9|6DinKS~geX7jW|GR_~u^=MICG6S}5Qv1B75r*+BUlK9sTPIx zS$}d=B?!c1|27)hn=)G%9PCf!N8*p;LW8wDv+l8xwq~P{My#mm6WNpdC1_A?UinH) z(mj*-B5?pGe#jx%#2Onj^!J1z?gc}yrV9S*5+AR|m31ojglwQ!sVC&dNg?spK2(W1Oy==_QM$+;p z(tEz_8qv3g%pGgLC`PkpDBHylE+g?h9)~@YF{oF_Hs!uhN%YNy43M%Xe@36;w_{2H z8AP=zCmIwFF}ciJkoxN(1PbM1{BAUx!V!YB3ZB#u@i9uM5|?07(JbgD5YvMO0S_+_ zQF(zUPgTqIJIaGd&lkX|eY_f*v>1qqC6-Ap$5lxtQ;9w?c}6 zD^JG;-})VJF+*-Y4rhPA$a-BTeCsyFW=y#s%xi2|8EVMlecvGzfC9~5Ilu3Hp)Av2 zVNGBgxypg~0tB!Ni`)6P*Pyo>*-pE8R3QbyBcQXg*G8?O_5CC>RYLbvmKGZ@ z@jIec)iAZ)3Hc|5C=bI5S{(u5Q>9Ip8q%&X0eQS#6_J zpf06)WKR=$UghOv&2A2E-H`Cjtm&{Gf1#4E&T%E`Huv-)tW2+yFBe&WP+ZS=arBrV zA6h9=9wp#oxh@@umMn^11HpQNtW?dJKk4E2jCK%RY|-HZ&!} z{2DPivtoO{mgVhnUCY49+hB6Vz9mm@=lBT*1Tslv`*fo5H}xK;g=MYMXG8&+g(Ll( z{75P(5u%SnQ$9_`N>Q7h9V{`(1b@YQUq*q(`o0tKLNq}P3vb1jr#XrRmNF?~P^Ab5 zi<^nC9M)#4pp7W<6_K<~iC=|iD=hPaZh#xfji3RQR1GtxzX;6mgVpPftYhZ&aW4+n zMY@|IZ^V2>>onoh$%GSBAh;}?dHzjyvGw5+ogoQvy*}1&5UKsJdZC@kxHVq1Zwxv_ zZ$G$1l~<7pb*#yV=$8Ds&qJENL7NlcTp8&||LO4joB$U$g~z!90TutCnCW_OP{P^y zzPcj#Key8lrvd4koUw{xcV&Jxc%3lWe6d@)Tei`rJBx&3l?tnU>?j#?eQLwg?Vjyl{wRzm<~^l^a^PV@6t%aIamB>8hzvW zIgb}sLYdXYDw^Z1>&U`Z-2G?5CSAW0!&Unp&3(r3B(0jmt$}&v%m-hN`JmWt!Jo)v zs7;%XhlFt}3@B28bBUK4kAQ=}xAI+vIojCJYBNBCdIB9}#0KG_04tnRPXSKt zzyEId9GWs(APQ+kzmnpMY61;yi9}K}yh0sy##%*pOidDwn^SOy5SL;i>t|Cvz_H zOV*#t?F+-A=by*4P2Z4U;B)}?o^)MGNRTzSdNh?n2D2t(@b4-K!LNPNM#>bZi@#Ea zY*~p(ST#pP2S>YDS14IXz7ng!>ivWjMeMj;aYQ_jVPmnz9SPu{|3dNd%THy_Qd(}v zW^RT5(}K153`9+x`TYl6=h3CkCim_OoDi##DC6&9LpK#LqiONP!_u)B91bj?FVtcBN}8waU4xI^xoWtb3kHRQ~Nv zQ62B^7WYP8*@dc%#ct*EcRb=!2inG$^#k(cz0!hO0yUp;y}2_MIry4&^T}R`xY=&EuPLhaT)^6E9muD35xt4q!l$JA=Lo`MTiSJ#sHmAxB-y3X-tk$Y8eB10F z+$S(+NJ_P+5EQ3N7!pQuu$@&Ig+ZWob_0;ZhJNhnYjLUB>GvCx5XuDw&5D)e?Q6&=KzK>wx%a<=t0?d{RbW%7_=Gc z&^a>N)Zx>kjpoUy-dw^rP0Nw217dh$Sk#a*%&sm(L_xpk0OKS1-rz1D|1PUV9|e*j zKPL)uYC}JTO-xZ}a+%-ocn|5)Ms}mUMGpQGhVHNMw+|F>#10I|AIo32fcCZ!mNMveY1l4R6Wv>00AI>SFEFZ*k)wE<_P@Qn;2;@CHjIDgww?| zB=QQAfa`%%u<6x`KH%7X)GU`uY-*iE@g3uPHyWbeo1u@S@#?G8BkRVxcO4vHl!AWg zTPL!3Xw=LK!Q&elS95sjGgp}DfjJfMHsn-qI*%YcT$vquE9Tpic+AnvWJr9nGF{!F zKgPkWObXo+G%askS;4N0YbYFtc8TjzO#G0ykVc(>zoc2_R74sihQTfY>-4PocgOzw zy8e1#8V6peSQ$nYG;Hxb^7BkMg1nO`CZT(}i{hiX{G?>+uH0of^QayhLU&>pI4g+{ zCYez2YVghCNF3logLE%Tn|hndDMlO?EHZkL;ua_W!`i>SqGr5VZbxre#PcTSQ&sqr4kgrv0S>3`+dLpgQ8SmQu5G5I(mWZR4;I`_B}B zV{Ar`4q|}-XNs*>8B75a@Ag5oT7tc5@2adn@!ZSoN|oJzq%3XOtZ=#V+d1 z)x2))VHaypwp5W`cl=R+^2j55YFT&QwpYUMeKcq&GWM7dw%&Btfe&-=a&C$2u@h#< zb1xn?ae0+bj?gt+D@0DkF*wHH_-}@s5E(wHpLO%{wKhg^vBpayeej+i%+PYnaqqNR zJ-4qfKgAL~VYnZsfDNQEh>EgALK-I~SS}+N>u+OEW`xksq5%nKp)zG!U@xyRMJNqEXbJMZo~b>nd%N_0#OB`5v>qsAWmxtyz3csrG^d(+n0hT7TOl@9ekT zxQMzumNlAEXD=p??^Mr4HnuR1SfVC=T6zZ2k}WR<|L!hr(~c9h>aql~-xvgR&%D$y zkcuscrQ#`-Qo9E#EnaSCgvtr>T`Ms0aK+jOg=h)E5nu%o!_Df*NkGvggJ8HgU0*9F z%{XG4rf~4|ne4Mw2iasT| zG272ZOMc!4$aw6+nke6?V0L(V*Rp8ln~#u*X^=9Un$Rr|nXGGHi4)*t5lskiRp@k@ z81Sa^bH;u^b{xmMl)XyTx!vA*;A!NG$_Q&yzUFh)c3LS{XTJ;O|KTe(Wwv)G@Hg4` z`#Qjkq^+sC9KNaRcp;l=cDH^=;3HS`!zU4|w zG0xZFem^)HmtswGw1?>FTi&~=*7(!GvE9nL=ZZbC*b?26S1wk@8WcMA z*6TgyZ(ah=x=I#Pxd8_L|NE5Vc>E~R9u-w%r3;p;GqmMYrCOmer+D79EC#qz%vi#? z7znaKAd0lAM7$&YeNm8$+Nh+vV6U~dcckQ#Sp=-zXnVNS?*$@WLE~^1Ye@olBgxHY zoq8C}q12sQ?YtJYPm!Ky>*MQnB8j_sAt8|>wPbSQce5G*2!coDur65Wdk$t+yBfcf zE`cUekt$`sfoveUnYiVwqt1a4S}WycKDpZ*4c|xXMn2Qo)bBQ6GL6?F?hkE^_>GOf z(w^fvt7~sPXq$E)jC5ztH)aK%<4MtBwC@!D-EBS@ZZEwa%`V>UA()WQOw@yKRa53A zCYcUXa!5{*q(nAsU|50FNFHL*Ge~g2$7RNKm{pTsS6#lOHK$H8_5o zRZ+|=BO|0v<_g6jQ*`ixpFu?U=9J^d$tbJStsp&}aW$YQD8jWCKb#Viw(PAui$##f zxVX`UJ%ii$(m_6*`s!&dkF69lsea)|x60>6i6T@IhAJ$mLn*-F$~95EITopfzb05O zbOrk(6o};#z2DhR^?nUAkT#S~esVug$T^R{^>2`{56{V-D&{>=RwdwKJIr$P^3-vO zE#`H9UI1(Zue5H*u3zjp+6HWXD6r`bi9{t6fq-PSTshbW%#u!+6I&xrk^?oCIz$0I zl|cBr<8VKAGFw`JaJ3u*ynsdTZJSfCWgo5dJHH-sNw{L)ct@Lkrj~l28}vIHd3b$) z)g>ADT1!-Oy6E9V*zQwY^=|`xp^I-n6cM-+@zTV~6( zL5m)gpRhy|C6!J~Hp=RoU85FFZ$>J3@0c)6HnGE79)ayggF*W^ohc*{nh?2Oly%Gq z1#bjZ=JEAt@Aq{XbGj7jaW5oz4wz0*mI-gcp5D|lnWt#XkiS)QIe7B?@VY{h!j}(6 zSc1-!*rL`>vX7UE{f8n)<4)_O28$#1gbgJz3Hn8fd`A&_mjp=k$8FORTOE)3&(b9z41DJg;UbfmRo7RYpd>Sbv z_{eozEmNQ_CZ<;QU{`)o+6Gr+6boLcUe9CkvDSpkdgXJ-TE5~|ZBZ9v;8w%-M;XVY=IYwWZH{o& zB!y`iT9l0t(?AR9zx9r7Bv)OklttONc8#U)oUQda3D3QYqh9ghEi`)2NN&73R$`43 zv5X7^#!s+V`H@3$Q-Si%Xa-IhRje%meh!xUT0{juCW+s1(1^HUU*iM?eS^Dz(oXIC zeANE@nEERtLZN2Z0Y-MqAR7hiT4Jqwh#hg}Bn-P1PO#B(Cehl6-O`@~2+5ApEz|1n zUboGU<|Q#V7=a~NbZ+68Ltoa?uE*-KQzpj z{35rQ=d5-cPE)qnTAajQdSL4Lju8Qc>d~g5daFDqo2rYSI742_0}ubUo=yIX$I>&Lq+d*=Xbk0Z0>&} z>Px)-cPzJ9B%AHX9ir>8U9j{{$mdY?CyAV0*{Ji#uj^$hIbJS}+$TQ)qBot}-C+0F zirIb7Dh{Ief#Rd5ZnQU-*>Co{K?sCztv}o*HLT^omPd%u)8j$=!iq}l4uK@hkgVv) zN(KT{j&BJo=#%F*P}yrMDkK?3)HB#BIB9mwG1V2%*fVOv+S`#hF%H}bWnXq$xG#9y zZi1Bq+O8?lSq2A&4g3xoq>TcVIlshJr(i9A?#f-6zFfCrGR}YsKu-)a3D0z~NXMj7 zr`pY*4jfgzTR~TuOyr4b*qSfrIrn{TJY8a~1Nu`*^mwo$-c}CBzAz1CI_(Z?PdglZ zFQb)oTL75zbug$?t+LUiWBu}O!^A0!2>-v&440Ec1D2MV-`pf7WHWovvfQ6?O1_P- zfk+$^e5d*%3M8zP16?{mnS3}I#U0gZ(jvWu>7Co*9K~BhnU{PL1(tCC;ha-{-u24| z0c=|{YOp(tG9DSy%Cst_-7ZsN>F;IV>W5yPrY%$wAMMtjmi9c+uW1tHhwDhbX!r>s z$>{|wW5aCVLkPN4iCBu}sLkIux_Pz9#*<=3fs+U?7%*l(6P{_*-pDP^2%v=Lx8?e| z3PJ19QZ*1Q>M(h=#`zp+^O9ZJX*rf!kb%DkjLwjflJ0=29EREe>?ot@*tyr$ zkhb?_M`!rX%>fp`uq{&kRX`sl@EjuR@z{@7={>fG=Z^x+z99=-W9#x9AN)J}aIn`0 zPkoR@H{f(2%Zu78StK{+d7sF$|MT0-5$dcp@8ac5TS3jXVOrdgh)`|9>MODBHc$JQ z$kF0!xDXEh25egChV78zhB+?}fac{R8*cBK;eyo%tD9Hp3;)Q=Xx)z{-CZi}sAQ$< zxU$}GpYAmS7xprKM6%C|ub>x~$Yw~P+^mhUkFwdl+9OV&4pI9`es5Ljx6H@82rWQi zL!&HW7?+W&mr1}DMexZ@Yq8L?qc3RXxXY{dVreMg701OzgDmniYTKK?Et}r^N>mYM zau2fwHGHs?T{g3RcvIfA$Q76zPo&R!U%%JUu51K)vcR%cs%(5ajH7)Z;V`{Ael`5~T3``$DZzK^I2D@bJE!An%vncEuyStN7wNjdW}-cAKR-L} zn$T%0=4wueGmhgYOlYZ8?aI>PY>7LKi zIq zC}iukrDi*GinzcS-Vw%;akrVf#Hml=QQ?dG)EUod(}Fc}Siinb9M{wk5x91=8zio( zP~ltm1mtu&j*NG_jc?^lrEFSEWNxvI42T!?Oui?aAcN_-xHxRA|2#;qz562IcGUvR zza9_cEo8QVgZ9TxG~3;dzVKh&rOcq%p0DzQTu!UcH1Nvfj*j;2d0@acyEeC2$9Zk{ z>wuBJZYLfvAIA4r=T4Uqn9i%ci?>x_0#}C>>9xS1FXi>#e^T!GZ#L0&TlRPu3x5B* ziMO@Eaex=8q}y(dt3xQF|7n}H;wxootDz-SD%bnY^myo7(qbbFw^@>yPEhc8GOaH6 z9p9{o`YxS~<6$Rz(YlKLsXuB(>|pD>Jj7{ND&=(24hv0;iRcVa)Q-Yf6Lh%CFU@5b}3Zsq+m-3nYln_6!t?di#5g+a9)h+=rJ zxUF2wzP*B2{<5c5j~*ZVY(eauef1a})b3oCJ0)wBr!``XcB1G^nQNllq;;cGRY1O= z*|_d@P#Bc8baTlHG*I`#yr0Xft4qo?oyR{l-_G;YvJv7W-_nM;0qyva#EH&7KNmb7 zFFK!Regc4y5}h8K2nTI9|F@Uym8ek&{bJAXFbr!sqP(4Gb8;cbQHL?); zc@tXT@yBK)GOo^gIOh3GX@*qbTA1${JmwS_ovySY?qi3I9W^r?#0d}$@mFIab;+dU z8yX!w9a0cSanMsG7ts9GNH5>m;kZ7qG5JT}+a9tuixl|5@V(dc@I8xq;_n(7DQ``K zudnS%4|c>lD?6UfG<@w^+bTb-qu8_WK0oHyFe37+PS94;et$nF%fxhaj&GAof=uep zDl;AVn&1NTHXFE2vzz4XY`&Dq$k{B@fhphQ9a7B`LgzGEJqqf2FH8`WsYw0prao=c zjak&!nND0*(uJmUx~*sfO?^#d{-#^gC|y8Q?Qv)CJ^6|~*OcLL6{qV;?J5I|1W&El zyaT=;axhj;eB1Q`{T`I1>Ggz1>4GYhdn>%-ELI8 zz^7q|2)5H~2}_2Dj+%awd{-<{sxuGW^Z3=raO$cL-&q8XE9U3=k`txb~I=VejM83WhJQ+k0ai}btCBglNS%kmh3dl^*r4#-oQoJkpbllYphg3&#KyD zS&SfE<&{4G_md>KQ*dgGeGgeZ>Y^^6@63N2AD<5PBFdrZB=Q8|iTn(lbzS$&P{hVY z1!d}yeTfX??>zY0OG{T3ZH#jmW9PkSuu$4_w|oXzz&)7?g;bv00W`OtSt(3z;y zfiirV4HPKMmKxo~Ipvj<<=%D0t!5V!DtGGYY&-4&nP9eIHY})fGq1fwl6P{zZ?J3?eShHf0 z%_XPiBH9f;RDqwIjTk0qEv7TEt1DSoF|*>@93PDHh+ljy5M5S+KQME}z|X*H1b0z( zYs5_TH$6=LuN}pW<>wYJ;eSI03#ywwCc`4pLyfJ5?uPb)4^GE1j1J~ihz*gjERVs( z+|>YAw~jYWK&56yAIjGsx@Z4nWg;^w%1jk(V3OK0yjL?SN}m72*C*^iC@wAmM zea_RJka|OlFULKfl_gOPoB|}v4LALG#Y64a8zU**$qm$FM1=LokBnu%4gaAnlCZUN~OY(Eb0N zk(Y9I@;qhKn!w~#pTbc~`V)*KXm=ZNc#)N&V|l8>^C@t^r0k|^j$&dAr8=!#2g7Hk zOVj_LkEjn4a{jVDED5PWgn;xhtncc^q1EYkn~`urnwgajn%n!^+M5Kk{FEwHXZC&UnCIp??h{x6-31x6+L?DIZBGCo~$V4AVuSvI8CKk$Y@J%a)@${6>sB7ZnkaNtiWs6V;du@C#a*~>{ zOk^V*gP%N4!Nz=|swn29jx<|dLUgBbQ=YFFiUy}i(UQ>Eh7!xDtrN!YdkgwE?c-#W zni+oEl)&=WUool<`KdrXqM4GDX%HeoX{DS!wdl2RlH|knVTlfvGjoZ}nn4s-*^inY zS(<}lMSayO38Chb%7?VkYtksYP849gP^!kjgvQI9Tgs$bcY_^vrrT^cAh|JraeAIy zUol&qAb&@ZMT*UpUrp371vMlY#p9by4Us>&eDbbc8AeuDfri=!KPE?9bPHG!tBuNU zOq;D22ZhHt+iuJG{g2)Z$@qd{BFh7nSY!}TFfS(K#2MBiaZm;%FzO_DliACXwu z*&P81=ANt5Q2|~p-Rqwy!j7loQb4&de{1*87Vq^l$EPB*7)k36K2{7qo3@)5tv%*6 z`lgL0oEFI+#U%q38?grI3yWgKaz~XZM>Lpq1b;=PyPtesrdT4qj0Or8Wx0~L<6vZH zHIOj-WO%zMJ?W>5>-9uc}=Y7rtco;GKQDHl-1xt3t4|^aol1FA52c+?zX7ig9zJb6oMi7gK%(t_mX;s?UOm0d z*|8nEfs4xp2`b8Z`vr*g_5ih03P2_TDDn4M8YhOQGBzzvz|;_->uwBSCX(bbgx&E2 zz|DDYN$EaK|J7RRYJC1rOiWKIpcdKSOUIAtP;S2Z8IB`-v|uOMQhSJRzBdey=#TMh z**9i?szJUS)S^sWoq<8cln{%b5dJVZ7N;@&3tIlf@3?s;JdzwF*x>S@{IaiXjtOvTMS5R~{zRKng-iHY z9oI2ByFGcNwk z-)vLQl9lHman~Mlu62u-tU9)kD!tzx+dVzoOI0$eEEg&O`L}GA+wswa=ehlRH8>!v zVPUa5tQlc=2Ba;kOG}TL_b+eD^^`V?Ra*j$%l|w-UzJF z?s~TtgW;V;;|ssyrGF0_@=NHr7~?R;Z{XJBHOVoSa-AJmR4P1^ae6=tx2iAu6G9G? zTf&Z`M_lF8VaoXpTg&cgQ|I!7qDfrHxKF7$4z?rvk}_cmpPih+IWtkMSgc;Ky|_pU za}XV!(Gd&@we}0g*d0LO`JiN{s^B#$si)719=ym?20!^ zWpGm&K1s%`Pex}){4Nogtkr$S=VwGGB_p#U++)6dA&C`F`zw>M`CBegzlx^LgMA+|Aa=7?w$O@@bx zkIOS-N4TK%wIEwk$byw6lFBhd>r4L$b+LC0%{yD>LHqOhwgee3pdl271wn%Q0)8?( zfH6VIuU}Tb{(=LDMaIvU>rblmMK)Y^A_{*41cKtSGQc(_>93C5;bQ%DloiGkP>KSR zv-{z;JN;l?vn4ab!^58j0MnRf;2S_91_MgJ1~j6(@rqA?1wt3VEzogZt2Z__K5}TO zuC6XC`%BBSJ_by*J7{TX-4AnMz_Lpo@od^`=haPhZ2R^=a>~lLz{;prt;~FVzWtT_)B^{-3&b49IX|}UI3(km&qx>1t-&SKBe6~%L9P*xo0}N z^Z>GR>%&RnwN__B=50R!Ovi@#*IXxq+wo~DNE>vym!zARkgx{4hqvrk%>OV`ysAU# z+1jF4RmcdfWhk6;cQnF63J!f0uE!ge@x@Zy{Z4&JSnB1T?Mv1Luq#e*+m4Jpq;#8F z^WIuNylIAR#eBG%$@q<&06ox9*yu3#wu-O4q^`9V_u}ev`+)1)>b`yQ`~>6B)yY3} zJjw8y);+%)Cej@fK#}0(XU5@(AH+stleOr&agZi?g)oxKaz-M9-5?14`;(NcA3}7D z<3}^t$C5#m8OApL=0M989xe{ZTr`L&mQQSo^L=p@1*&8LXP>vVV7np3=BPm#$t872 z&^5TQz%-C{!_Pyol+n+4G?u@7-gp~zG4^1AS-OY;bbuJqV5}Yl?|yrHdt7>*rqg*f zoDMk16$2yQpVwV_0Jj@%V5N;e0@rKZ;Re{^@z@SW|6(BO7j*Chygah_J-_i-3r=K8 zEtG5Os;T{WyKX^G*Vb2M~whsH9mg+e3fR8Gwx&8telA zGIURuSNIPd>d{!r?cwN=$IJ<67u2?x@lv|{!7Z1Jus(L{mGy{S6jca1gR6ofJj+Ce zqZdzMRIMyM<*hl<(`BNNr#b^bRW8X2iQ_*T55AX~&zk#GfgddxENR}Q2?-=%=1o1mt}1QN987<#hbi(qN?g2_z^EYy5InuV-Bq;L9@ zvW;plPZREGIx8`jPJ=h=WgRL}b;?z%eFBlh49Z8r6YBu_Q9UL=9zVjx#RcF39;1m( z0pA&W;9GUY05AyXZ(029CHpUr*T7Bx>~gtTTG8UR)?y1>@mnCF@D#PVKA32vJK0M* zz`(}d_|X$F&?z$lIDcI}Uu%7LVIQg4AJ6zgeKuWi0!W-| z+-?_s!XRe~c=Lm#)9wa0yMJ;W5V$`Yha~K-6U81Lxv#X-Fl_Ztm~A7M?q44DEn5zU%pH! zLr4)>rA~iQWwFj*O};q>q0lHXC!uFk>uS| z42ByUTAl7}VMAs?UVz7^*s-V&Brl3B=W*q4+frI-m@(=HMOPX3Amb{ zwR3k54giYH<7W5q)6-KSympJjcekkqYdp}P5sLteis#=ik%RG!(6BHtB1Xo_y1F&n z@ml8#ei=p%n{`AGGVi5e0Lu8uV;+HV)NHL~E}2=Cz%=+Df}7VL>F|=sl8`FYyf-rF zluFVJQ-^L3Ed)-gGuM;GQ{=CT6Q8*x@#;`59asGUn$t~;*-!UuaTOK&&ywN(gjy&P zuswZ3*hivu40RB`T4OYDgD6J8!jtSrfzBn4G+IVw=yyNb(I%u_Lbt(g~8p@z05i8giOlet~1sl%XAcE(E zI5d>B|0Gk$2P@T;_KfqL?GuQ%;3)MHGl=pH70G7asSr7@Y7IabbpPD(dWW~*=%{T& zvkG8B0Zt67*0*OD!r^g%Wk6LH&AeX>=u)#xy9op(s7MvAyHqZ9TdR=u|E96aRMUnEB{e#QwMK$#zXN<}op0gK~C z4Wy9CAevZd8Nr#EbMX?ZuCT70H!s>Fl>B0*7Pklvo{Sa>R}|0mK?`0K=@+vRh?sjm zc3K<<0c;dK5L%)r9l=O1tq2TE7?zlW3*;DNKBkZ)1buMdiTJz@ST_1kUTz(Lx}wVZ z4z9tvfS8t=`q{eRy4Gx?!|MK=ZzPG4ki`hr(5f#KQ)ch+@o{NM9X97%26sx~5LXua zNrBVZ*H))9co2YcQlm*AU^N*9R>=OS>m#7Ce`((ThbMdGovQx_%$uMg2aA#ejy?cL z=2i87HFZrQ&cuKdMH}dR06b~*)_TG4@C6#QtAi{E8yaK8Tnx!3ETmO1_F+8v%b5qj zR1~!+<~`G{d`L#2VAn9YV&~Cw4E=l9%FKswz#t{SvHZ|O?L+->H}PAZSypPblEk$a zOjAPY!qgNN34XJYb4^)O(K7bMu7}vD;LgcRn{DiTS z_aN1>;;#caP@A}!DdNts$#RzrJl*0|wBM!v{+%n*I>P1*@DPBSW)y&1nXNQf^Jm=x z^rVv(ev8@4sA4CeI;IEA6SsZ`0BjWoDk?x5{ik|(0EBP%E?EnR7{-4Up2 z$!h_STS>qh4d6Fcs#O~dM4km@8u#J+P1FHm3P7*f`0$bK5J;*u>yJ+~ZSbA%mP~=_ z5zq&S$#fDtzTR5`gs-I-QpVAViTCEh{QsC2U3sg@c>daMY0QUJ$b$Ly)nUdYvZ-9v zR~*Vl`h+L0hR*L^)8ImJL#eY#Yx|V@lr(v0bXoU4bv+VrR!JTfHDO~Sk>mb6OOto@ zHgb|0tBs6%%x>X~fKT<;6L;XT8Oi3%N_?W2f< zx{eX*TcAFVgZLeb^3@+Y)zlSN)eHwEv4RP4Odri3F{CLZS|5i2n}QOy2_sT4`!mPY z(?`@wqLw^&liwmOOc2p=;e-x&AI&%^vtd3hlv)*YP$j|)6XU|rUWgtDKlX)+k|1Dr zyaGjz=hM+NyJZJ8HFXDIG+NPQ;4m{~S<$RAbEB%0!fHBBORo{n3*e;yc&g3&RyD=9 zHW}Dzmp|K32v~r%9($>3<=fRrCp&&BkZJnEq0g5+7HT$D#8GbC2MN4v74!KE=R96x zOQ*2xz20vahToriUIDoPE_^^_@qCeN*2@bJF_-NpUf+?E2rTJiB#eME1exz9_NoufQg;ux_<;%(K!S4KOn7I&Vl(_*?R7#{ds>Z4KUyvZEITv z%C9#7dX}WXf7$gKKmBKCfYcuVB8^YweG#|=a5B7CgA*)-|0z%6-)GR|2WV*Yo$~Uh zH>%@a&xZ9lm*4|<0#;9h8KGR#cFD6Z7N-u4_lWl4o#c=|5{Ry+R^Obi1jWOnUN)OP zI^Y4ri5t2V1sp{+VO@I~>_5;h?R$PXpN7^k$%NWFepvVQl(?3{5=TKfE4g32EOX?I z`7tVe;AhWmMA|+uQbE+sfqzs3{{9JK!~)6j@7?Oa?ZU#W9!0{+T?ndV!ud|r#wS&i3gAid`BmvEdv zwYr}e)N70Yf4wvgYXUC2{1#57e~Ohp6t!)mX*RV$d0iE}l@Dgmma!N8byYD`rgha* zOB&mnYi7@my?jZQ!3z4H6(TqVF0Cg#;~rj_Jnj24I`P;#V?>%5F+%f1zYqUEs@^)P zs<7SO-gHSL(o)jh-Q8gj(%s!1(p>@)(jhGk0s?|`cXuP*@jaaLd*3s@G5EtFW3SEH z`>Fe$*P3(0u|%J=Bc`Q--Wyi~Y9Fs#QelFHijA`10&l9yV3jCoe@YBS32BBVlDDK8 z)gY?Ir>Vt~+cY#XF`4jj?XXlLF9!)l)Tk>UB$o*aO`uwQ#B#4t;P6ivw#=+W`s|E~ zolK%hh9~V$PDTAa7No@h2`!kgxy4SYU<@i_mc4!1_`ZC!o*{B5OLpeNQ{yN+mSvcXQ_b#XDN0#YZ!JWqU5ayX#Cv2q)Xf%-xtNO zflBRp^65YK3Qb6WrC>RWsj9=RIn^_AlG*ig$cbL4&*Ss~EyX}WU^7jktOY@-A|<^fX-x2z zfxSY$=&w~s92U=zF+o&m>aOb6O11DWp(hxVw$e6+=knH+HpYA z%^hj!lND~Y40V}EPiGR6AH5c_T(7OMimwicb&`+Y&Vz+NZ$iMyb+&(}>_;da0>Zq2h zH9f|L`Lu;2h_O9}2-NC7a92TFh*bNOyDOe&korWUN z=1Yo_|51c{oL2qlgH6ld%pWF&LM5TEUcqw_DzFEMx(Sw!C4IfJzzk{B&lr7K%l>!G zR!zc|^QTOJITtWAw3TNbLRR{X(0QjeVnWlzT3x8#TKkQ*eg2E*W$qX1^GwD*^pI74 zGEKqN=?OxGTCWBL1sz4fL(`q+r|J0JfZ*DIB$ZfXWztW!uZQPh$u#^sNaLLGa~5I6 zKJQz~{y;YARO5pE+z?aC6K*Mjh#gQy6s)kvXXCxrQ%8t~c7%6?JErZ%_(*Q^(MMV$ z5F}a6d$s@Z)}Hw5U-jxxdFK6VH&iHF{al+a+qai9-PrHf;k5@Y{*6&#qj4SEqf%%# zFpszCJ*FsrG>F+LAk7@MjBOIF!_Gwdzk8J@kH+Zah0~X5q#>Cw(;M_@R+rtwg(go5 z50C!TwmU#4%Qmn(4dv2r;tW|L3-(?8asDqPJa&C(oMF%6ULA8^x#5m;aITnFELA}! zMkK5@Y@t?M#!A5~Apr%|Aag&-aBWUE9YgR`y!IEWYt!kYc^ zDT7yG;=Zb)-uuv2%Tv{dhfC(qkiT*_#+H6251$0B%EX$VMbdEV2LmOhxEjp9J(^u3 z`{@`}a(Ra&V^dwe{{NlVFJH+v)R3e^$>dwS4+**Rxu;P_W(POZcAUGe|{}x zPT?uyXHbgWo0))DU83FENpOaRm0R040W*Y(^nVLNgQ)_XXx)%#*Gb;sprDd5K;|4| zIU})&)oM0G!I6*jK>&;TcPo+F^chxWH7aU&ZhVmyep+$a_qMWDd*8z@o808~p)2?# zhw#zrO@6KltW3WBspLPdQWN3?2)7_DL+QGFB|(uh0F|7Wv7VcR!8Pr5@ugOeO+>tr zX3wz>r{)vW&UJ*}&wvndO{uDybtjzx-mxZ?r-CQULgiS1u-&ox_vuBnqco>q}yC$#TX>X>%NN z6wlOYuO>?@c9xu~Y*wY3m>nNHQ%qK(gZxRy{|;NkT03&o>~%I+cIESBWRnOc((UXG z==})%^rLVlBF&2?T3clB(`CHRF?~C1_gf_4VVWP?hQiByIxsE2R?_IBD35NCrhv#L zlkocrA}{ICnu=hkt1p~7!k|C#pB0(+H^y|T3{)zf0Tf9h?fc~0!+^JFF-NS6`Mh7W zxP!=gxU)a*9xjq*KB_!&XGF*gkF|V6Js_bopv@hVi`TdgxbJ#gu`EeQ(#`zyi)ZYe zJjIDaeBZS;DyP^r%ydDO4OZXtdHl)5V9BF9G!1T;7A7jS_v`yw zv24s5f$jc7?+`Xq(E&!}R&5A|6riqUW?$W!AKH^=^Oos~<|-_GABn45;{ zL=+<`htia$B0Wn;mrX){{WI6h@3=RC<$sdd2D*-@BSRp z!!erb=ddL)oRtA%jKnA=MM4fg(phBL9~f5)wkk98U!v>qi&VdkPsNcfy?1sC%^>%y z&}q^$LRbXWyGpiMmESW>;dI(E+Ec|9- z#MTP`E+mS4Ix}Xc`*b|fIDHZ$aiBBy>-G3!>w;YxB9eW{MNo$fyLBvk@FSM2@k3nC zN+D@K;KWvwkC;bGEwMNYM^@rW>@d5V|IX>v4GEQ4&&1q?u(wE>de1W*3da?nRU4Pp zl=kjr(oa9@>>+vzy{!XEj5J7bxcEAV>zneS{J2+0ZZWv~_5ho);dW0bN&(VQ_|WOofn z<&0axq!`<{KJ~xNSCGZ(semC^KI}J!|BRN({*}C6m0td^!2jAr1Drr>7y5jVgT_>h zyxn*ZT3mf-z9AYA1}{)H3&T6>_rAX!CT|}Wpy1E=O0z;VfIj6)Q!97o&Xy_WYX48j zK}+}1rbv_6=TBO3`TdacbB}brOdaiPZYaf6OPU3h4__t2ztQF5{!=rpO^<^atMrxf zmA3?wZG1nzychN@ewb)|I6E}x3V9LsgnT^F3AuphmMyeDCI!=t*F7(2=c95jLLfk# znOpwl<=2BRbTyj?{2!n2`5zpfJLbQErq_$_Xjtb)_KN_>Z#6CdJUc49uA=({^$p+x zKzf`w@Z(|V-P3rCCGn9IAbBoATiOKf%v#OPd#95Rn~BQ%2M4j9yN5p!p34&NZYA@^ zfIsPVHeWZd_>!OHGZ=^c?Sj%yJ_-nLECP4McC349;yrpe;U3Vb$FxVTb?&5LClL0D zBRvd-yJEg03Md!SyO*UutTk*JPH;0-9%Y}&KT|XuF3Qa0dd^gg8*5NYP-i8fxq9%U zyipnN3dNM9m9>7AL4n<*Yw)*DAWC&*xM?nC6r%tF_a7EOpn=oXVJU5=?DTEaF4@E@ zs!w)S46Z{Mk=`vRq2fY{GcGVwleP5uTB@w`wIugQ$pZYlKeOD6$_$lTzR(Bpk&=;f zjjcS!EKV%ZU3O;Wv5&+Km6att`aLS}OFHj{UJ$ROtu1;Re)!e!{=mw-Z!%md=q%C& zxM=%6oKjz}Ja>RvPw43;(Jaej+i!NwC|1#Ku4Ze5t$_;ADvzT%;(k47&$5Qq8s`UH z&-97Hr9MKW6s*{Oz88yBzb%qyPm+<&zIFY$&W~mFD5%s9!^R& z*u9E|)n~8Q$`GNNrnBVpeio6x{DAfO)e{Z=pYh~W*)@l(@qTjZ*neK8C=QxA*9WA; z$2*(96jzp5_@VKk>O~X`6)-UsX3^-!)g|Fa@;WCeab@fS;I2XkZQIIf_e>3F`dK3) zv<-SJ4qL(4HC*S`iLDE#iiB}^I*NGT|5}p|Du8v2v0VSOMkMs@Mf%Vz8_%>QrWK6o zR?-Y|O{Dbzn_$wFh0Y9dlrDR(p}xMgd2`4s+Fxk2nx{K(wH!Z)-}w?$py$@hN(;5P zC)xzf=SbbYNl;VD;BlBJj0UQK2S`YS(!V;?1oqgl{y;P!_WiA{T5a}lbE?)K0E57l zyy&{n4b;k~#z*u%_dU`P9*3i}U3V7JR^)OD~-~o+WV(#N< z05yz!<3@*+meN%MH7TA#nnb|ee!Uy1&$y&=k+WMDn^>3l$jQzujC;q*k_FW=ZT*NM$j2 ze)19Y%y5>Vk&1201uq2U?Gd;>CD!fLg5A%W8X#AOZ?iTXH(SxuT`fEG5`#`6aQt?X zlV51CS&*8jE$n-7joqK5#oNH7kOHAoE}?hNz{$N(*^dDO5dZGe&gB1u=&&j>70vy03?d!o>#TMjuZ2fj-2MTUAsm~U5-a>;xt1^peGtn2HyZAC zKGZ-&pYVM8w*BQzU;gUiE~pO7x3w>y;2u#$aq&yW0%#AWjpbGD0{kLN@HJ2!vfWzQ z@$tMO8|*3tN~nb36OC0UdiTzJI`ZM@3lUkW zcl-1;&c(*>m%dNZvjk)zU8;bBI2hve#{9cu2)mJZv6awub`ApPCVTi4nAIFu{^0=} z-B{5z%9V&cAy5l~iyB9^zV`Ib0q_@UOY}1ZqXH=yfgaE;BFQGI0OwP7l*0z z<9f8`5V*-pwI~`43OAGO>AxB#W{n+j4*PsaZa~-;I=fbLq7*oIzv|{VzEMSBGEC2Hk;5&E$PBF7Nl#d~6-$P%z>~a$eR0VddpA;JeqT zTCLlgcq>ndHADz3y4iv3^11a!hxU2F*!6Js^kxHOdo15`a&l@nq;T8uxE<32^aRi; z*CA-cTB@oJ-D041%-W=-R?x~ekh0#UBWko)UT%Rstr zSmtXhK^Qp)DIjgY)p;+|4HsAnHvtl-WYHl5Sa$(n@c|$&J^+?c`~qg?=*=m13d8M5 z+0Ws0ZaXGOnO^(xDF}1`no~QNSVje1EEk|*4qToYUo;Tuv-RdJZ*nkneITipRM^f79zcFPZ~@v zFkO;&q*0MS-tk#3qAIB)znjSxBaXF^k_bON+CqF$N|eBMLO1^=g=ooW{BO>Y980;6 z%~u0BXUYkI*C!ag`1wZmB@hdYS4sAL#3{85*^1y%*d5k2OL#O^2BZ`mh`c?qbY41R z;~KO(tIoNJdpbp^M+Fn&S2eNsBcnV{)e@-&WK%1d{q668+yw+^I0&EtO3KUWnO9!Y zW`Mt=8bpQ?>%)f+z)ak>R8v#aW51*by5n{yyWQoWzKb6yo^K$VJ8v+=Am6`#x4%Aq zTW`10=5d|^!cC+gGDQ=wU%v(_K5#`R50)U0FAM?LfZt)Ybl%u582L3dHR;IhPo7hM z|RNqJuk3RAs)sd=O;pG+C^t=h#;eI%3=%h6&74Z$X%`Cg4S?StD45 za@T+n;)1h_!`)s{XxAD=?$}Q=W#EQ1V7E|@3c-&_` zu+U)lZ@j=tR1^yGu*K}h+xn27=xJ(Z2Gap{oCW9PGccqkC*Q+BjLM{A6FsjEIrTd_ z3K#grLtg3p+$LNY=6Kr-Xb8wCIAj#khZ=2}0K^KQNZ@T@{3Dr~&A0kr!ysh&N^r!K z9yw%V^+wE=e$Z1+=P037443G1$k;Y`nVwkT-C&cLuYK5_-~qe%SEk4Oswxb!_bMu* zts_Q5?I45W$0xrRF%0dkP^)-o49I@wv%G5q9~b7<4}fU^0uJhho&u4=*A!%y6}OHt zu5?${cm5C&u+>9-2QQhLLO}mlBppkFm=hTIFkQYt8jOq*X;@7IIh_0H)!`2Xu?LAC zfZMqQU3Grv^+#jMSkBMq=<})zBn}=ALj)erK{$|MykH7USjdl$Cy`84!6GzKO2RPZ zI`p5)ajqZIpgSyJPAp(p0HJ7qoq4!;ega4FcjdJPXo+pD;Ge+>$cozQH1Z_}Y8@); z)ZvT{#rzTqLQB8PzY;K!0o znD7<}r*p-j0eiwfny?#5Ash(qf`AqE=fF(en_U;I3EbMFp&P1pOShG>3*&!3Qvz9l zLT?#&)fr%^+A!?4MzshDAud!WaJKI`SD+HPb~q%%7>txB`aK&*w1BUyB3g`tV-|N2 zK!q<8E59eRy(cw_`>JX<>;l7oGYVSDGKgSHFJk;zU<*S`O^$X8oXD7)cXPKn(U-E; zABvveJG1M{8NC;{icCC2Dvy=c2K>n*MBCZC-t0OiaZB0QAOp(n2~$}lSLQ7_r}!TnB&Kv z_};2$EU!*8TyK^XQNJx8l}+xAOOlXdi1JJj&6mvi=zqf*zb@k|VJ3`0J-~A1>o@vo z?+u>Q`iz1f)t2pWzE!=w1jaN?0udrPZLA78N5-J*1s~Qi*{8cp%Lpe&Mr)a}CJ|nj z-xCb!&jj(M{Z7+fef1#1RfL9^&>g-(-tvlo1zR_Fn6H#zYUrORoB6?=?(>b*IKC4;IO^Q^O(KAeaIA4~?|KomBAMIpSPi=Y(*;iAPyaLA!0y7~L+k(u zL6DH;JV9hw%>x0&+Tmi;hIGoJH?Ob<-II=1gY87pmSp7e-b(v(EV@rdy5DF-q

#i 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 bI`97nq0GJvFTVC;00000NkvXXu0mjfF|q`_ literal 0 HcmV?d00001 diff --git a/docs/open-source/rag.mdx b/docs/open-source/rag.mdx new file mode 100644 index 0000000000..0c0b4f5b7e --- /dev/null +++ b/docs/open-source/rag.mdx @@ -0,0 +1,57 @@ +--- +title: "Retrieval-augmented generation (RAG)." +description: "use agents knowledge via embeddings in Open Spurce library" +--- +# Vocode Retrieval-augmented generation (RAG). +## Introduction + +For Open Source developers building advanced conversational AI models, one challenge looms large: +limited context windows in prompts. Past interactions quickly vanish, forcing bots to rely on incomplete +information. Vocode introduces a novel solution: retrieval-augmented generation (RAG) powered by vector databases. + +## Here's how it works: + +- **Pre-computed embeddings:** Vocode leverages vector databases like Pinecone to store concise representations + of relevant knowledge. These bite-sized "memory chunks" efficiently encode factual details, + contexts, and even emotional nuances. +- **Dynamic retrieval:** As your bot interacts, Vocode queries the database for embeddings most similar to the + current conversation. Think of it as a smart librarian fetching the most relevant books on the fly. +- **Contextual guidance:** The retrieved embeddings are then fed to the language model, enriching its + understanding of the ongoing dialogue. This enables the bot to generate more informed, contextually rich, + and ultimately **smarter responses.** + +## Benefits for builders: +- **Scalability:** Vector databases grow seamlessly with your needs, accommodating vast knowledge + repositories without straining your system. +- **Efficiency:** Say goodbye to bloated prompts filled with redundant information. Vocode delivers precise + relevance with minimal data overhead. +- **Openness:** Built on open-source principles, Vocode empowers developers to contribute, customize, and + build upon its foundation. +- **Transparency:** Explore the reasoning behind retrieved embeddings and gain valuable insights into your + bot's decision-making process. + +## How to set up your Pinecone database + +In this guide, we'll get your Pinecone database fired up and ready to fuel your retrieval-augmented +chatbot with a robust knowledge base. Buckle up, developers! + +### 1. Create Your Vector Index: + +1. Navigate to the Pinecone dashboard and grab the "Create Index" button. +2. Name your index something meaningful, like "vocode-documentation-vector" for our Vocode-documentation bot. +3. Set the dimensions to 1536 for compatibility with your chosen OpenAI model. +4. Stick with cosine metric for consistency. +5. Hit "Create Index" and let the magic happen! + +![Setup](images/vectodb/pinecone-create-index.png) + + +## Document loading script + +You can manaully add documents to Pinecone any way you like as long as you include the required metadata. +If you have a folder of PDFs, docx files, text files, etc. that you want to add to pinecone, you can use +the below script which uses [Unstructured](https://github.com/Unstructured-IOVector/unstructured) to parse +many kinds of files types, extract the text, and add it to pinecone. + +`apps/voice-rag/manual_pinecone_ingestor.ipynb` + From 6adf9013b48105a4acf4bd68d73ae5e9f8a3f1e0 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Fri, 29 Dec 2023 17:35:03 -0500 Subject: [PATCH 052/148] fix vocode#473 (#474) --- docs/how-to-use-it.mdx | 18 +++++++++--------- docs/open-source/action-agents.mdx | 2 +- docs/open-source/agent.mdx | 6 +++--- docs/open-source/python-quickstart.mdx | 2 +- docs/open-source/telephony.mdx | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/how-to-use-it.mdx b/docs/how-to-use-it.mdx index faf6912c3e..c0daf89543 100644 --- a/docs/how-to-use-it.mdx +++ b/docs/how-to-use-it.mdx @@ -1,17 +1,17 @@ --- -title: "How to use it" -description: "The different ways to use Vocode." +title: "How to Use It" +description: "Various ways to utilize Vocode." --- -## Understanding our libraries +## Understanding Our Open Source Libraries -Vocode supports Python and React–with future support coming for -other languages. +Vocode's Open Source supports both Python and React, with plans for future support for +additional languages. -## Get started with Python +### Getting Started with the Open Source Python Library -Use the [Python quickstart](/python-quickstart) guide. +Please refer to the [Python quickstart](/open-source/python-quickstart) guide. -## Get started with React +### Getting Started with the Open Source React Library -Use the [React quickstart](/react-quickstart) guide. +Please refer to the [React quickstart](/open-source/react-quickstart) guide. diff --git a/docs/open-source/action-agents.mdx b/docs/open-source/action-agents.mdx index fa1827a911..389174d10c 100644 --- a/docs/open-source/action-agents.mdx +++ b/docs/open-source/action-agents.mdx @@ -93,4 +93,4 @@ class NylasSendEmail(BaseAction[NylasSendEmailActionOutput]): return NylasSendEmailActionOutput(response=json.dumps({"success": True})) ``` -See [Agent Factory](/agent-factory) for more information on how to register your action with the agent factory. +See [Agent Factory](/open-source/agent-factory) for more information on how to register your action with the agent factory. diff --git a/docs/open-source/agent.mdx b/docs/open-source/agent.mdx index 0f77cef5e5..ee2538691c 100644 --- a/docs/open-source/agent.mdx +++ b/docs/open-source/agent.mdx @@ -10,7 +10,7 @@ generation/understanding layer of the conversation. In other words, Agents are t AI that is actually having the conversation. Vocode provides agents that work out-of-the-box (see below) and also allows developers to -[create their own agents](/create-your-own-agent). +[create their own agents](/open-source/create-your-own-agent). ## Default Agent Implementations @@ -34,7 +34,7 @@ The `LLMAgentConfig` is configured to use the completions endpoint using the sim ### InformationRetrievalAgentConfig -Primarily used for [Outbound phone calls](/telephony), the `InformationRetrievalAgent +Primarily used for [Outbound phone calls](/open-source/telephony), the `InformationRetrievalAgent A description for the call recipient. @@ -52,4 +52,4 @@ Primarily used for [Outbound phone calls](/telephony), the `InformationRetrieval The fields that are to be collected on the call. -To build your own agent, see [Create your own AI Agent](/create-your-own-agent) +To build your own agent, see [Create your own AI Agent](/open-source/create-your-own-agent) diff --git a/docs/open-source/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx index 0c2b028bfb..10cfffb5a7 100644 --- a/docs/open-source/python-quickstart.mdx +++ b/docs/open-source/python-quickstart.mdx @@ -13,7 +13,7 @@ pip install 'vocode[io]' # Getting started -The `io` extra installs the packages necessary to run our voice conversations locally, but is not needed for other surfaces, e.g. [phone calls](/telephony). +The `io` extra installs the packages necessary to run our voice conversations locally, but is not needed for other surfaces, e.g. [phone calls](/open-source/telephony). You may need to install [portaudio](https://formulae.brew.sh/formula/portaudio) and [ffmpeg](https://formulae.brew.sh/formula/ffmpeg) on your system. ## Working with system audio diff --git a/docs/open-source/telephony.mdx b/docs/open-source/telephony.mdx index 8a0456e85c..d608f0e07f 100644 --- a/docs/open-source/telephony.mdx +++ b/docs/open-source/telephony.mdx @@ -6,7 +6,7 @@ description: "How to use agents with inbound and outbound phone calls." # Overview Vocode supports using agents with inbound and outbound phone calls. Users -can [create their own agents](/create-your-own-agent) and use them +can [create their own agents](/open-source/create-your-own-agent) and use them to fulfill a variety of use cases like information collection, appointment scheduling, sales, customer support, and more. From eb25e88ab9325bd4a4425e98b0e8b9acf1a6b46d Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 3 Jan 2024 15:59:55 -0800 Subject: [PATCH 053/148] api reference for warm transfer (#479) --- docs/openapi.json | 497 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 479 insertions(+), 18 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 2924a5269d..5b802918ee 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1587,14 +1587,18 @@ "oneOf": [ { "$ref": "#/components/schemas/TransferCallAction" }, { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } + { "$ref": "#/components/schemas/DTMFAction" }, + { "$ref": "#/components/schemas/AddToConferenceAction" }, + { "$ref": "#/components/schemas/SetHoldAction" } ], "discriminator": { "propertyName": "type", "mapping": { "action_transfer_call": "#/components/schemas/TransferCallAction", "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction" + "action_dtmf": "#/components/schemas/DTMFAction", + "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_set_hold": "#/components/schemas/SetHoldAction" } } }, @@ -1613,7 +1617,9 @@ "oneOf": [ { "$ref": "#/components/schemas/TransferCallActionParams" }, { "$ref": "#/components/schemas/EndConversationActionParams" }, - { "$ref": "#/components/schemas/DTMFActionParams" } + { "$ref": "#/components/schemas/DTMFActionParams" }, + { "$ref": "#/components/schemas/AddToConferenceActionParams" }, + { "$ref": "#/components/schemas/SetHoldActionParams" } ], "title": "ActionParamsRequest", "discriminator": { @@ -1621,7 +1627,9 @@ "mapping": { "action_transfer_call": "#/components/schemas/TransferCallActionParams", "action_end_conversation": "#/components/schemas/EndConversationActionParams", - "action_dtmf": "#/components/schemas/DTMFActionParams" + "action_dtmf": "#/components/schemas/DTMFActionParams", + "action_add_to_conference": "#/components/schemas/AddToConferenceActionParams", + "action_set_hold": "#/components/schemas/SetHoldActionParams" } } }, @@ -1629,7 +1637,9 @@ "oneOf": [ { "$ref": "#/components/schemas/TransferCallAction" }, { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } + { "$ref": "#/components/schemas/DTMFAction" }, + { "$ref": "#/components/schemas/AddToConferenceAction" }, + { "$ref": "#/components/schemas/SetHoldAction" } ], "title": "ActionResponseModel", "discriminator": { @@ -1637,7 +1647,9 @@ "mapping": { "action_transfer_call": "#/components/schemas/TransferCallAction", "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction" + "action_dtmf": "#/components/schemas/DTMFAction", + "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_set_hold": "#/components/schemas/SetHoldAction" } } }, @@ -1645,7 +1657,9 @@ "oneOf": [ { "$ref": "#/components/schemas/TransferCallActionUpdateParams" }, { "$ref": "#/components/schemas/EndConversationActionUpdateParams" }, - { "$ref": "#/components/schemas/DTMFActionUpdateParams" } + { "$ref": "#/components/schemas/DTMFActionUpdateParams" }, + { "$ref": "#/components/schemas/AddToConferenceActionUpdateParams" }, + { "$ref": "#/components/schemas/SetHoldActionUpdateParams" } ], "title": "ActionUpdateParamsRequest", "discriminator": { @@ -1653,10 +1667,115 @@ "mapping": { "action_transfer_call": "#/components/schemas/TransferCallActionUpdateParams", "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", - "action_dtmf": "#/components/schemas/DTMFActionUpdateParams" + "action_dtmf": "#/components/schemas/DTMFActionUpdateParams", + "action_add_to_conference": "#/components/schemas/AddToConferenceActionUpdateParams", + "action_set_hold": "#/components/schemas/SetHoldActionUpdateParams" } } }, + "AddToConferenceAction": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["action_add_to_conference"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/AddToConferenceConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["id", "user_id", "type", "config"], + "title": "AddToConferenceAction" + }, + "AddToConferenceActionParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_add_to_conference"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/AddToConferenceConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["type", "config"], + "title": "AddToConferenceActionParams" + }, + "AddToConferenceActionUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_add_to_conference"], + "title": "Type" + }, + "config": { + "anyOf": [ + { "$ref": "#/components/schemas/AddToConferenceConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} + } + }, + "type": "object", + "required": ["type"], + "title": "AddToConferenceActionUpdateParams" + }, + "AddToConferenceConfig": { + "properties": { + "phone_number": { "type": "string", "title": "Phone Number" }, + "place_primary_on_hold": { + "type": "boolean", + "title": "Place Primary On Hold", + "default": true + } + }, + "type": "object", + "required": ["phone_number"], + "title": "AddToConferenceConfig" + }, "Agent": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -1671,14 +1790,18 @@ "oneOf": [ { "$ref": "#/components/schemas/TransferCallAction" }, { "$ref": "#/components/schemas/EndConversationAction" }, - { "$ref": "#/components/schemas/DTMFAction" } + { "$ref": "#/components/schemas/DTMFAction" }, + { "$ref": "#/components/schemas/AddToConferenceAction" }, + { "$ref": "#/components/schemas/SetHoldAction" } ], "discriminator": { "propertyName": "type", "mapping": { "action_transfer_call": "#/components/schemas/TransferCallAction", "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction" + "action_dtmf": "#/components/schemas/DTMFAction", + "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_set_hold": "#/components/schemas/SetHoldAction" } } }, @@ -1800,7 +1923,11 @@ { "$ref": "#/components/schemas/EndConversationActionParams" }, - { "$ref": "#/components/schemas/DTMFActionParams" } + { "$ref": "#/components/schemas/DTMFActionParams" }, + { + "$ref": "#/components/schemas/AddToConferenceActionParams" + }, + { "$ref": "#/components/schemas/SetHoldActionParams" } ] } ] @@ -1929,6 +2056,12 @@ }, { "$ref": "#/components/schemas/DTMFActionUpdateParams" + }, + { + "$ref": "#/components/schemas/AddToConferenceActionUpdateParams" + }, + { + "$ref": "#/components/schemas/SetHoldActionUpdateParams" } ] } @@ -2172,6 +2305,27 @@ "title": "Do Not Call Result" }, "telephony_id": { "type": "string", "title": "Telephony Id" }, + "stage": { + "type": "string", + "enum": [ + "created", + "picked_up", + "transfer_started", + "transfer_successful" + ], + "title": "Stage" + }, + "stage_outcome": { + "type": "string", + "enum": [ + "human_unanswered", + "human_disconnected", + "bot_disconnected", + "transfer_unanswered", + "transfer_disconnected" + ], + "title": "Stage Outcome" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, @@ -2288,7 +2442,11 @@ { "$ref": "#/components/schemas/EndConversationActionParams" }, - { "$ref": "#/components/schemas/DTMFActionParams" } + { "$ref": "#/components/schemas/DTMFActionParams" }, + { + "$ref": "#/components/schemas/AddToConferenceActionParams" + }, + { "$ref": "#/components/schemas/SetHoldActionParams" } ] } ] @@ -2429,7 +2587,22 @@ "enum": ["action_dtmf"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["id", "user_id", "type"], @@ -2442,7 +2615,22 @@ "enum": ["action_dtmf"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["type"], @@ -2461,6 +2649,19 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} } }, "type": "object", @@ -2579,7 +2780,22 @@ "enum": ["action_end_conversation"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["id", "user_id", "type"], @@ -2592,7 +2808,22 @@ "enum": ["action_end_conversation"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/EmptyActionConfig" } + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["type"], @@ -2611,6 +2842,19 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} } }, "type": "object", @@ -2631,6 +2875,26 @@ "title": "EventType", "description": "An enumeration." }, + "FunctionCallActionTrigger": { + "properties": { + "type": { + "type": "string", + "enum": ["action_trigger_function_call"], + "title": "Type" + }, + "config": { + "$ref": "#/components/schemas/FunctionCallActionTriggerConfig" + } + }, + "type": "object", + "required": ["type"], + "title": "FunctionCallActionTrigger" + }, + "FunctionCallActionTriggerConfig": { + "properties": {}, + "type": "object", + "title": "FunctionCallActionTriggerConfig" + }, "HTTPMethod": { "type": "string", "enum": ["GET", "POST"], @@ -2803,6 +3067,27 @@ "title": "Do Not Call Result" }, "telephony_id": { "type": "string", "title": "Telephony Id" }, + "stage": { + "type": "string", + "enum": [ + "created", + "picked_up", + "transfer_started", + "transfer_successful" + ], + "title": "Stage" + }, + "stage_outcome": { + "type": "string", + "enum": [ + "human_unanswered", + "human_disconnected", + "bot_disconnected", + "transfer_unanswered", + "transfer_disconnected" + ], + "title": "Stage Outcome" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, @@ -3027,6 +3312,49 @@ "required": ["items", "page", "size", "has_more"], "title": "PhoneNumberPage" }, + "PhraseBasedActionTrigger": { + "properties": { + "type": { + "type": "string", + "enum": ["action_trigger_phrase_based"], + "title": "Type" + }, + "config": { + "$ref": "#/components/schemas/PhraseBasedActionTriggerConfig" + } + }, + "type": "object", + "required": ["type", "config"], + "title": "PhraseBasedActionTrigger" + }, + "PhraseBasedActionTriggerConfig": { + "properties": { + "phrase_triggers": { + "items": { "$ref": "#/components/schemas/PhraseTrigger" }, + "type": "array", + "title": "Phrase Triggers" + } + }, + "type": "object", + "required": ["phrase_triggers"], + "title": "PhraseBasedActionTriggerConfig" + }, + "PhraseTrigger": { + "properties": { + "phrase": { "type": "string", "title": "Phrase" }, + "conditions": { + "items": { + "type": "string", + "enum": ["phrase_condition_type_contains"] + }, + "type": "array", + "title": "Conditions" + } + }, + "type": "object", + "required": ["phrase", "conditions"], + "title": "PhraseTrigger" + }, "PineconeVectorDatabase": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -3381,6 +3709,96 @@ "required": ["type"], "title": "RimeVoiceUpdateParams" }, + "SetHoldAction": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["action_set_hold"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["id", "user_id", "type"], + "title": "SetHoldAction" + }, + "SetHoldActionParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_set_hold"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["type"], + "title": "SetHoldActionParams" + }, + "SetHoldActionUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_set_hold"], + "title": "Type" + }, + "config": { + "anyOf": [ + { "$ref": "#/components/schemas/EmptyActionConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} + } + }, + "type": "object", + "required": ["type"], + "title": "SetHoldActionUpdateParams" + }, "TransferCallAction": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -3390,7 +3808,22 @@ "enum": ["action_transfer_call"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/TransferCallConfig" } + "config": { "$ref": "#/components/schemas/TransferCallConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["id", "user_id", "type", "config"], @@ -3403,7 +3836,22 @@ "enum": ["action_transfer_call"], "title": "Type" }, - "config": { "$ref": "#/components/schemas/TransferCallConfig" } + "config": { "$ref": "#/components/schemas/TransferCallConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } }, "type": "object", "required": ["type", "config"], @@ -3422,6 +3870,19 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} } }, "type": "object", From d0695aeb3366a9802818606df6ad125e00782fc4 Mon Sep 17 00:00:00 2001 From: Nick Trimmer <75459551+chambored@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:03:58 -0800 Subject: [PATCH 054/148] Fixed word omission for clarity (#478) Added the word 'like' for greater clarity in the documentation. --- docs/open-source/react-quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/open-source/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx index 3be1cf6414..1b3a7372d6 100644 --- a/docs/open-source/react-quickstart.mdx +++ b/docs/open-source/react-quickstart.mdx @@ -13,7 +13,7 @@ Or, start from our [Replit template](https://replit.com/@vocode/Simple-Conversat ## Setting up the conversation -Our self-hosted backend allows you to expose a websocket route in the same format that our hosted backend does. This allows you to deploy any agent you'd to into the conversation. +Our self-hosted backend allows you to expose a websocket route in the same format that our hosted backend does. This allows you to deploy any agent you'd like into the conversation. To get started, clone the Vocode repo or copy the [client backend app](https://github.com/vocodedev/vocode-python/tree/main/apps/client_backend) directory. From 262a0ff6db391ff1d550caa36a5b2913492a0235 Mon Sep 17 00:00:00 2001 From: Stan Kirdey Date: Thu, 18 Jan 2024 18:10:18 -0800 Subject: [PATCH 055/148] fixing event manager so it can clear the queue (#441) * fixing event manager by moving async handle outside to accomodate future annotations * handling events * unit tests for events manager * typo --- tests/streaming/utils/test_events_manager.py | 65 ++++++++++++++++++++ vocode/streaming/utils/events_manager.py | 27 +++++--- 2 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 tests/streaming/utils/test_events_manager.py diff --git a/tests/streaming/utils/test_events_manager.py b/tests/streaming/utils/test_events_manager.py new file mode 100644 index 0000000000..d6bfaf4aba --- /dev/null +++ b/tests/streaming/utils/test_events_manager.py @@ -0,0 +1,65 @@ +import pytest +import asyncio + +from vocode.streaming.models.events import PhoneCallEndedEvent, EventType +from vocode.streaming.utils.events_manager import EventsManager + +CONVERSATION_ID = "1" + + +@pytest.mark.asyncio +async def test_initialization(): + manager = EventsManager() + assert manager.subscriptions == set() + assert isinstance(manager.queue, asyncio.Queue) + assert not manager.active + + +@pytest.mark.asyncio +async def test_publish_event(): + event = PhoneCallEndedEvent( + conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED + ) # Replace with actual Event creation + manager = EventsManager([EventType.PHONE_CALL_ENDED]) + manager.publish_event(event) + assert not manager.queue.empty() + + +@pytest.mark.asyncio +async def test_handle_event_default_implementation(): + event = PhoneCallEndedEvent( + conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED + ) # Replace with actual Event creation + manager = EventsManager([EventType.PHONE_CALL_ENDED]) + await manager.handle_event(event) + + +@pytest.mark.asyncio +async def test_start_and_active_loop(): + event = PhoneCallEndedEvent( + conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED + ) # Replace with actual Event creation + manager = EventsManager([EventType.PHONE_CALL_ENDED]) + asyncio.create_task(manager.start()) + manager.publish_event(event) + await asyncio.sleep(0.1) + manager.active = False + + +@pytest.mark.asyncio +async def test_flush_method(): + event = PhoneCallEndedEvent( + conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED + ) + manager = EventsManager([EventType.PHONE_CALL_ENDED]) + for _ in range(5): + manager.publish_event(event) + await manager.flush(timeout=2) + assert manager.queue.empty() + + +@pytest.mark.asyncio +async def test_queue_empty_and_timeout(): + manager = EventsManager([EventType.TRANSCRIPT]) + await manager.flush(timeout=0) + assert manager.queue.empty() diff --git a/vocode/streaming/utils/events_manager.py b/vocode/streaming/utils/events_manager.py index b6310cf563..818ab80acb 100644 --- a/vocode/streaming/utils/events_manager.py +++ b/vocode/streaming/utils/events_manager.py @@ -1,13 +1,19 @@ from __future__ import annotations - import asyncio -from typing import List -from vocode.streaming.models.events import Event, EventType + +from vocode.streaming.models.events import Event + + +async def flush_event(event): + if event: + del event class EventsManager: - def __init__(self, subscriptions: List[EventType] = []): + def __init__(self, subscriptions=None): + if subscriptions is None: + subscriptions = [] self.queue: asyncio.Queue[Event] = asyncio.Queue() self.subscriptions = set(subscriptions) self.active = False @@ -21,18 +27,19 @@ async def start(self): while self.active: try: event = await self.queue.get() + await self.handle_event(event) except asyncio.QueueEmpty: await asyncio.sleep(1) - await self.handle_event(event) async def handle_event(self, event: Event): - pass + pass # Default implementation, can be overridden - async def flush(self): - self.active = False + async def flush(self, timeout=30): while True: try: - event = self.queue.get_nowait() - await self.handle_event(event) + event = await asyncio.wait_for(self.queue.get(), timeout) + await flush_event(event) + except asyncio.TimeoutError: + break except asyncio.QueueEmpty: break From 6f7e9cd90710c3cc7f927de4315b6e97906e318d Mon Sep 17 00:00:00 2001 From: Stephen Handley Date: Fri, 19 Jan 2024 18:00:49 -0800 Subject: [PATCH 056/148] Add update script and update api for numbers/update example_context (#481) * add update script and update api for numbers/update example_context * rename and move update script to docs folder --- docs/openapi.json | 10 ++++++++++ docs/update_open_api_docs.sh | 4 ++++ 2 files changed, 14 insertions(+) create mode 100755 docs/update_open_api_docs.sh diff --git a/docs/openapi.json b/docs/openapi.json index 5b802918ee..6c8ed4cd1d 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -3974,6 +3974,16 @@ ], "title": "Outbound Only" }, + "example_context": { + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Example Context" + }, "label": { "anyOf": [ { "type": "string" }, diff --git a/docs/update_open_api_docs.sh b/docs/update_open_api_docs.sh new file mode 100755 index 0000000000..9d1c7fc8f3 --- /dev/null +++ b/docs/update_open_api_docs.sh @@ -0,0 +1,4 @@ +FILE=./openapi.json +curl https://api.vocode.dev/openapi.json -o $FILE +npx prettier $FILE --write +npx mintlify dev \ No newline at end of file From 4b2f03b20a4ddecfcf378420dc2fd822e02c2f7c Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Mon, 26 Feb 2024 11:44:06 -0500 Subject: [PATCH 057/148] 486 support for pydantic v2 v1 compatible (#490) * Update dependencies and import statements * Update Google Cloud Text-to-Speech import * Update dependencies and imports * Update Google Cloud Text-to-Speech import * Update google-cloud-texttospeech version * Update dependencies in pyproject.toml and poetry.lock --- .github/workflows/test.yml | 2 +- .pre-commit-config.yaml | 2 +- apps/telegram_bot/main.py | 31 +- apps/voice_rag/main.py | 28 +- playground/streaming/agent/chat.py | 2 +- poetry.lock | 469 +++++++++++------- pyproject.toml | 12 +- tests/streaming/agent/test_utils.py | 2 +- tests/streaming/data/__init__.py | 0 tests/synthesizer/conftest.py | 1 + vocode/streaming/action/nylas_send_email.py | 2 +- vocode/streaming/action/transfer_call.py | 2 +- vocode/streaming/agent/anthropic_agent.py | 23 +- .../streaming/agent/bot_sentiment_analyser.py | 4 +- vocode/streaming/agent/chat_gpt_agent.py | 2 +- vocode/streaming/agent/llamacpp_agent.py | 4 +- vocode/streaming/agent/vertex_ai_agent.py | 2 +- vocode/streaming/models/actions.py | 3 +- vocode/streaming/models/agent.py | 2 +- vocode/streaming/models/model.py | 6 +- vocode/streaming/models/synthesizer.py | 2 +- vocode/streaming/models/transcriber.py | 2 +- vocode/streaming/models/transcript.py | 2 +- vocode/streaming/models/vector_db.py | 4 +- .../synthesizer/google_synthesizer.py | 2 +- vocode/streaming/telephony/server/base.py | 22 +- .../user_implemented_agent/restful_agent.py | 2 +- vocode/turn_based/agent/chat_gpt_agent.py | 8 +- 28 files changed, 393 insertions(+), 250 deletions(-) create mode 100644 tests/streaming/data/__init__.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f01740f9f..f415eba8de 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: - "3.10" - "3.11" poetry-version: - - "1.4.2" + - "1.7.1" runs-on: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9f54bb9976..939b311ee2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: black - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.3.0 + rev: v1.8.0 hooks: - id: mypy args: [--ignore-missing-imports, ./] diff --git a/apps/telegram_bot/main.py b/apps/telegram_bot/main.py index 1b77078c1a..c6090615a7 100644 --- a/apps/telegram_bot/main.py +++ b/apps/telegram_bot/main.py @@ -4,7 +4,7 @@ import logging import inspect from collections import defaultdict -from pydantic import BaseModel +from pydantic.v1 import BaseModel from typing import Tuple, Union, Optional, Dict, Type, List from pydub import AudioSegment from telegram import Update @@ -76,18 +76,22 @@ # Define a Voice model with id, name and description fields class Voice(BaseModel): - id: Optional[str] = None # Optional id for the voice - name: Optional[str] = None # Optional name for the voice - description: Optional[str] = None # Optional description for the voice + id: Optional[str] = None # Optional id for the voice + name: Optional[str] = None # Optional name for the voice + description: Optional[str] = None # Optional description for the voice + # Array of tuples (synthesizer's voice id, nickname, description if text to voice) DEFAULT_VOICES: List[Voice] = [Voice(id=None, name="Coqui Default", description=None)] + # Define a Chat model with voices, current_voice and current_conversation fields class Chat(BaseModel): - voices: List[Voice] = DEFAULT_VOICES # List of available voices for the chat - current_voice: Voice = DEFAULT_VOICES[0] # Current voice for the chat - current_conversation: Optional[bytes] = None # Current conversation as a pickled object + voices: List[Voice] = DEFAULT_VOICES # List of available voices for the chat + current_voice: Voice = DEFAULT_VOICES[0] # Current voice for the chat + current_conversation: Optional[ + bytes + ] = None # Current conversation as a pickled object class VocodeBotResponder: @@ -95,14 +99,13 @@ def __init__( self, transcriber: BaseTranscriber, system_prompt: str, - synthesizer: BaseSynthesizer + synthesizer: BaseSynthesizer, ) -> None: self.transcriber = transcriber self.system_prompt = system_prompt self.synthesizer = synthesizer self.db: Dict[int, Chat] = defaultdict(Chat) - def get_agent(self, chat_id: int) -> ChatGPTAgent: # Get current voice name and description from DB user = self.db[chat_id] @@ -142,7 +145,9 @@ async def get_response( voice_description = user.current_voice.description # If we have a Coqui voice prompt, use that. Otherwise, set ID as synthesizer expects. - if voice_description is not None and isinstance(self.synthesizer, CoquiSynthesizer): + if voice_description is not None and isinstance( + self.synthesizer, CoquiSynthesizer + ): self.synthesizer.voice_prompt = voice_description elif voice_id is not None: setattr(self.synthesizer, voice_attr_of[type(self.synthesizer)], voice_id) @@ -162,7 +167,9 @@ async def handle_telegram_start( start_text = """ I'm a voice chatbot, send a voice message to me and I'll send one back!" Use /help to see available commands. """ - await context.bot.send_message(chat_id=update.effective_chat.id, text=start_text) + await context.bot.send_message( + chat_id=update.effective_chat.id, text=start_text + ) async def handle_telegram_message( self, update: Update, context: ContextTypes.DEFAULT_TYPE @@ -302,7 +309,7 @@ async def handle_telegram_help( - Use /help to see this help message again. """ assert update.effective_chat, "Chat must be defined!" - if isinstance(self.synthesizer, CoquiSynthesizer): + if isinstance(self.synthesizer, CoquiSynthesizer): help_text += "\n- Use /create to create a new Coqui voice from a text prompt and switch to it." await context.bot.send_message(chat_id=update.effective_chat.id, text=help_text) diff --git a/apps/voice_rag/main.py b/apps/voice_rag/main.py index d952d688f7..3460df8913 100644 --- a/apps/voice_rag/main.py +++ b/apps/voice_rag/main.py @@ -16,7 +16,7 @@ from vocode.streaming.models.transcriber import ( DeepgramTranscriberConfig, - TimeEndpointingConfig + TimeEndpointingConfig, ) from dotenv import load_dotenv @@ -29,12 +29,15 @@ logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) -vector_db_config = PineconeConfig( - index=os.getenv('PINECONE_INDEX_NAME') -) +# Ensure that the environment variable 'PINECONE_INDEX_NAME' is not None +pinecone_index_name = os.getenv("PINECONE_INDEX_NAME") +if pinecone_index_name is None: + raise ValueError("Environment variable 'PINECONE_INDEX_NAME' is not set.") + +vector_db_config = PineconeConfig(index=pinecone_index_name) -INITIAL_MESSAGE="Hello!" -PROMPT_PREAMBLE=''' +INITIAL_MESSAGE = "Hello!" +PROMPT_PREAMBLE = """ I want you to act as an IT Architect. I will provide some details about the functionality of an application or other digital product, and it will be your job to come up with ways to integrate it @@ -48,14 +51,16 @@ - Next.js - Fastapi - Vocode. -''' +""" TIME_ENDPOINTING_CONFIG = TimeEndpointingConfig() TIME_ENDPOINTING_CONFIG.time_cutoff_seconds = 2 AZURE_SYNTHESIZER_THUNK = lambda output_audio_config: AzureSynthesizer( - AzureSynthesizerConfig.from_output_audio_config(output_audio_config, ), - logger=logger + AzureSynthesizerConfig.from_output_audio_config( + output_audio_config, + ), + logger=logger, ) DEEPGRAM_TRANSCRIBER_THUNK = lambda input_audio_config: DeepgramTranscriber( @@ -64,7 +69,7 @@ endpointing_config=TIME_ENDPOINTING_CONFIG, min_interrupt_confidence=0.9, ), - logger=logger + logger=logger, ) conversation_router = ConversationRouter( @@ -73,9 +78,8 @@ initial_message=BaseMessage(text=INITIAL_MESSAGE), prompt_preamble=PROMPT_PREAMBLE, vector_db_config=vector_db_config, - logger=logger, ), - logger=logger + logger=logger, ), synthesizer_thunk=AZURE_SYNTHESIZER_THUNK, transcriber_thunk=DEEPGRAM_TRANSCRIBER_THUNK, diff --git a/playground/streaming/agent/chat.py b/playground/streaming/agent/chat.py index 546054f1a1..bba34122f1 100644 --- a/playground/streaming/agent/chat.py +++ b/playground/streaming/agent/chat.py @@ -2,7 +2,7 @@ import typing from dotenv import load_dotenv from playground.streaming.tracing_utils import make_parser_and_maybe_trace -from pydantic import BaseModel +from pydantic.v1 import BaseModel from vocode.streaming.action.base_action import BaseAction from vocode.streaming.action.factory import ActionFactory from vocode.streaming.action.worker import ActionsWorker diff --git a/poetry.lock b/poetry.lock index 85c8605aec..acdb3a03b0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -150,6 +150,20 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + [[package]] name = "anthropic" version = "0.7.1" @@ -687,18 +701,18 @@ files = [ [[package]] name = "elevenlabs" -version = "0.2.24" +version = "0.2.27" description = "The official elevenlabs python package." optional = true python-versions = "*" files = [ - {file = "elevenlabs-0.2.24-py3-none-any.whl", hash = "sha256:f1dc780e50ace7a499717cc67485b87bf5cd806a2711fca7a4fbf1b8b9f3a41c"}, - {file = "elevenlabs-0.2.24.tar.gz", hash = "sha256:7719816f8d74666c0da5567e737b6c0200f2807bed9d9c21ed750f14e8a3669d"}, + {file = "elevenlabs-0.2.27-py3-none-any.whl", hash = "sha256:c31ea892d5668002bc26d0bb46a6466b0b4e2fe5aaed75cbc1b7011f01d3fa29"}, + {file = "elevenlabs-0.2.27.tar.gz", hash = "sha256:1b17d3c997557e5aa654b296e3960c25ea183525cfdbd0ec53070b038ba5fd95"}, ] [package.dependencies] ipython = ">=7.0" -pydantic = ">=1.10,<2.0" +pydantic = ">=2.0" requests = ">=2.20" websockets = ">=11.0" @@ -1041,21 +1055,19 @@ protobuf = ["protobuf (<5.0.0dev)"] [[package]] name = "google-cloud-texttospeech" -version = "2.14.1" +version = "2.16.1" description = "Google Cloud Texttospeech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.14.1.tar.gz", hash = "sha256:dd716f2a768ad67502cfd99b9925c51ffd6e16be93b410abeeffdaac190bfe81"}, - {file = "google_cloud_texttospeech-2.14.1-py2.py3-none-any.whl", hash = "sha256:883fe35e3c823ff77cc633b30ab9a93d3b5eb38ebce7eaeef6f87e8d03210e54"}, + {file = "google-cloud-texttospeech-2.16.1.tar.gz", hash = "sha256:f0c81ff37a5ddc51689299dbd60f030ed85504163e86f04c9a375fd9fa50b304"}, + {file = "google_cloud_texttospeech-2.16.1-py2.py3-none-any.whl", hash = "sha256:58ed78a30ee17cce96ef11f4c793e6bf8f67d029860699b338138bce9502000f"}, ] [package.dependencies] google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = [ - {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, -] +google-auth = ">=2.14.1,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" [[package]] @@ -1186,7 +1198,6 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -1195,7 +1206,6 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -1225,7 +1235,6 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -1234,7 +1243,6 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -1580,59 +1588,136 @@ files = [ {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + [[package]] name = "langchain" -version = "0.0.198" +version = "0.1.4" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.198-py3-none-any.whl", hash = "sha256:9d8e57ec25901989339ffac2ea7e759333d084100c90526e8ad57fb61b2003c9"}, - {file = "langchain-0.0.198.tar.gz", hash = "sha256:656385c23aeec1f8f4efbce598f729c817c60eb3f7c9fd77c03a8d28e7d0fa81"}, + {file = "langchain-0.1.4-py3-none-any.whl", hash = "sha256:6befdd6221f5f326092e31a3c19efdc7ce3d7d1f2e2cab065141071451730ed7"}, + {file = "langchain-0.1.4.tar.gz", hash = "sha256:8767a9461e2b717ce9a35b1fa20659de89ea86ba9c2a4ff516e05d47ab2d195d"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.6.0" -langchainplus-sdk = ">=0.0.7" -numexpr = ">=2.8.4,<3.0.0" +dataclasses-json = ">=0.5.7,<0.7" +jsonpatch = ">=1.33,<2.0" +langchain-community = ">=0.0.14,<0.1" +langchain-core = ">=0.1.16,<0.2" +langsmith = ">=0.0.83,<0.1" numpy = ">=1,<2" -openapi-schema-pydantic = ">=1.2,<2.0" -pydantic = ">=1,<2" -PyYAML = ">=5.4.1" +pydantic = ">=1,<3" +PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.2,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.6.1,<0.7.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] -cohere = ["cohere (>=3,<4)"] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<5)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] -llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] -qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] -name = "langchainplus-sdk" -version = "0.0.20" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +name = "langchain-community" +version = "0.0.16" +description = "Community contributed LangChain integrations." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_community-0.0.16-py3-none-any.whl", hash = "sha256:0f1dfc1a6205ce8d39931d3515974a208a9f69c16157c649f83490a7cc830b73"}, + {file = "langchain_community-0.0.16.tar.gz", hash = "sha256:c06512a93013a06fba7679cd5a1254ff8b927cddd2d1fbe0cc444bf7bbdf0b8c"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain-core = ">=0.1.16,<0.2" +langsmith = ">=0.0.83,<0.1" +numpy = ">=1,<2" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)", "zhipuai (>=1.0.7,<2.0.0)"] + +[[package]] +name = "langchain-core" +version = "0.1.17" +description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchainplus_sdk-0.0.20-py3-none-any.whl", hash = "sha256:07a869d476755803aa04c4986ce78d00c2fe4ff584c0eaa57d7570c9664188db"}, - {file = "langchainplus_sdk-0.0.20.tar.gz", hash = "sha256:3d300e2e3290f68cc9d842c059f9458deba60e776c9e790309688cad1bfbb219"}, + {file = "langchain_core-0.1.17-py3-none-any.whl", hash = "sha256:026155cf97867bde410ab1834799ab4c5ba64c39380f2a4328bcf9c78623ca64"}, + {file = "langchain_core-0.1.17.tar.gz", hash = "sha256:59016e457cd6a1708d83a3a454acc97cf02c2a2c3af95626d13f83894fd4e777"}, ] [package.dependencies] -pydantic = ">=1,<2" +anyio = ">=3,<5" +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.0.83,<0.1" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" requests = ">=2,<3" tenacity = ">=8.1.0,<9.0.0" +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langsmith" +version = "0.0.85" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langsmith-0.0.85-py3-none-any.whl", hash = "sha256:9d0ccbcda7b69c83828060603a51bb4319e43b8dc807fbd90b6355f8ec709500"}, + {file = "langsmith-0.0.85.tar.gz", hash = "sha256:fefc631fc30d836b54d4e3f99961c41aea497633898b8f09e305b6c7216c2c54"}, +] + +[package.dependencies] +pydantic = ">=1,<3" +requests = ">=2,<3" + [[package]] name = "markupsafe" version = "2.1.3" @@ -1875,38 +1960,38 @@ files = [ [[package]] name = "mypy" -version = "1.5.1" +version = "1.8.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, - {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, - {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, - {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, - {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, - {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, - {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, - {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, - {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, - {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, - {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, - {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, - {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, - {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, - {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, - {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, - {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, - {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, - {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, ] [package.dependencies] @@ -1917,6 +2002,7 @@ typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -1969,48 +2055,6 @@ files = [ [package.dependencies] setuptools = "*" -[[package]] -name = "numexpr" -version = "2.8.5" -description = "Fast numerical expression evaluator for NumPy" -optional = false -python-versions = ">=3.7" -files = [ - {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, - {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, - {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, - {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, - {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, - {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, - {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, - {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, - {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, - {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, - {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, - {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, - {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, - {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, -] - -[package.dependencies] -numpy = ">=1.13.3" - [[package]] name = "numpy" version = "1.24.4" @@ -2090,20 +2134,6 @@ dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-moc embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] -[[package]] -name = "openapi-schema-pydantic" -version = "1.2.4" -description = "OpenAPI (v3) specification schema as pydantic class" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, - {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, -] - -[package.dependencies] -pydantic = ">=1.8.2" - [[package]] name = "opentelemetry-api" version = "1.19.0" @@ -2148,13 +2178,13 @@ files = [ [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -2372,55 +2402,113 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, +version = "2.6.0" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"}, + {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"}, ] [package.dependencies] -typing-extensions = ">=4.2.0" +annotated-types = ">=0.4.0" +pydantic-core = "2.16.1" +typing-extensions = ">=4.6.1" [package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.16.1" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"}, + {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"}, + {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"}, + {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"}, + {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"}, + {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"}, + {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"}, + {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"}, + {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"}, + {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"}, + {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"}, + {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"}, + {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"}, + {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"}, + {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"}, + {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"}, + {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"}, + {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"}, + {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"}, + {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"}, + {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"}, + {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"}, + {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"}, + {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"}, + {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"}, + {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"}, + {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"}, + {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"}, + {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"}, + {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"}, + {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"}, + {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"}, + {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"}, + {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"}, + {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"}, + {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"}, + {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"}, + {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"}, + {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"}, + {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydub" @@ -2480,13 +2568,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" -version = "7.4.0" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -2518,6 +2606,23 @@ pytest = ">=7.0.0" docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] +[[package]] +name = "pytest-mock" +version = "3.12.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, + {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -3360,31 +3465,31 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "vonage" -version = "3.8.0" +version = "3.13.0" description = "Vonage Server SDK for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vonage-3.8.0-py2.py3-none-any.whl", hash = "sha256:05f8029479a0330f506b5cf5fa4bc773215d5ba4a2edef91c62868e631465888"}, - {file = "vonage-3.8.0.tar.gz", hash = "sha256:b793a0fa86d973ab2f2007d82a2844485f2658daa278512894b4197eb41099e7"}, + {file = "vonage-3.13.0-py2.py3-none-any.whl", hash = "sha256:f84e74f4c2dd8c8f97bffecda9016d503de1d4b9df98efcbd6e7ddfb1a3359dc"}, + {file = "vonage-3.13.0.tar.gz", hash = "sha256:1e82fa51b6d9d0af300b85f3ee25a3ef2f96c4f3ab753f20ba4b38e164b06db8"}, ] [package.dependencies] Deprecated = "*" -pydantic = ">=1.10,<2.dev0" +pydantic = ">=2.5.2" pytz = ">=2018.5" requests = ">=2.4.2" -vonage-jwt = ">=1.0.0" +vonage-jwt = ">=1.1.0" [[package]] name = "vonage-jwt" -version = "1.0.0" +version = "1.1.0" description = "A JWT Generator for Python. Creates JWTs for use with Vonage APIs." optional = true python-versions = ">=3.7" files = [ - {file = "vonage_jwt-1.0.0-py3-none-any.whl", hash = "sha256:967df0ea98e149cbba2f12dfaee1ba37fcbc7cf6f512523909b71feba1e1ff6c"}, - {file = "vonage_jwt-1.0.0.tar.gz", hash = "sha256:71cb82ea436743dcb26b6934279997314eb041152f07dff654733e6b28efbfd5"}, + {file = "vonage_jwt-1.1.0-py3-none-any.whl", hash = "sha256:f41d2fc51f80cebddff1d65ec2146527ee83ca95f3e8a8fe9cda2263a435e2ed"}, + {file = "vonage_jwt-1.1.0.tar.gz", hash = "sha256:ed6af2bf82dc7cffe42ad453295472b86e02852baaaa3f2b97cd49fcb4e9019d"}, ] [package.dependencies] @@ -3691,4 +3796,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "280732b3a6ac72e26b018edf6f19dd19d01644b5725c2ecb0d7c713d84251c79" +content-hash = "b4f87f3ba43e7fe33f78e8f0e14272167fbb1bb437d73cbfb3cae86e9afb98bd" diff --git a/pyproject.toml b/pyproject.toml index 4b0d71378e..9117e5da4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ scipy = "^1.10.1" anthropic = "^0.7.1" elevenlabs = {version = "^0.2.6", optional = true} -google-cloud-texttospeech = {version = "^2.14.1", optional = true} +google-cloud-texttospeech = {version = "^2.16.1", optional = true} gtts = {version = "^2.3.1", optional = true} google-cloud-speech = {version = "^2.19.0", optional = true} @@ -38,10 +38,13 @@ vonage = {version = "^3.5.1", optional = true} nylas = {version = "^5.14.0", optional = true} speechrecognition = "^3.10.0" aiohttp = "^3.8.4" -langchain = "^0.0.198" +langchain = "^0.1.4" google-cloud-aiplatform = {version = "^1.26.0", optional = true} miniaudio = "^1.59" boto3 = "^1.28.28" +pydantic = "^2.0" +langchain-community = "^0.0.16" + [tool.poetry.group.lint.dependencies] @@ -50,14 +53,15 @@ black = "^23.1.0" [tool.poetry.group.dev.dependencies] python-dotenv = "^1.0.0" -pytest = "^7.3.1" +pytest = "^7.4.3" pytest-asyncio = "^0.21.0" aioresponses = "^0.7.4" pre-commit = "^3.3.3" +pytest-mock = "^3.12.0" [tool.poetry.group.typing.dependencies] -mypy = "^1.3.0" +mypy = "^1.8.0" pydub-stubs = "^0.25.1.0" types-requests = "^2.30.0.0" types-regex = "^2023.5.5.0" diff --git a/tests/streaming/agent/test_utils.py b/tests/streaming/agent/test_utils.py index cd1be9ec09..1eb0f30e5c 100644 --- a/tests/streaming/agent/test_utils.py +++ b/tests/streaming/agent/test_utils.py @@ -1,6 +1,6 @@ from typing import Any, Dict, List, Optional, Union from openai.openai_object import OpenAIObject -from pydantic import BaseModel +from pydantic.v1 import BaseModel from vocode.streaming.models.actions import ( ActionConfig, ActionInput, diff --git a/tests/streaming/data/__init__.py b/tests/streaming/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/synthesizer/conftest.py b/tests/synthesizer/conftest.py index c537e7ce1f..2a09b36d26 100644 --- a/tests/synthesizer/conftest.py +++ b/tests/synthesizer/conftest.py @@ -17,6 +17,7 @@ import re from tests.streaming.data.loader import get_audio_path + import asyncio import pytest diff --git a/vocode/streaming/action/nylas_send_email.py b/vocode/streaming/action/nylas_send_email.py index 08be384cfd..cec889c188 100644 --- a/vocode/streaming/action/nylas_send_email.py +++ b/vocode/streaming/action/nylas_send_email.py @@ -1,5 +1,5 @@ from typing import Optional, Type -from pydantic import BaseModel, Field +from pydantic.v1 import BaseModel, Field import os from vocode.streaming.action.base_action import BaseAction from vocode.streaming.models.actions import ( diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index b2706c572a..efc6b67068 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -3,7 +3,7 @@ from aiohttp import BasicAuth from typing import Type -from pydantic import BaseModel, Field +from pydantic.v1 import BaseModel, Field from vocode.streaming.action.phone_call_action import TwilioPhoneCallAction from vocode.streaming.models.actions import ( diff --git a/vocode/streaming/agent/anthropic_agent.py b/vocode/streaming/agent/anthropic_agent.py index 62c9459d08..009bbdd649 100644 --- a/vocode/streaming/agent/anthropic_agent.py +++ b/vocode/streaming/agent/anthropic_agent.py @@ -3,13 +3,14 @@ import logging from typing import Optional, Tuple +from pydantic.v1 import SecretStr from vocode.streaming.agent.base_agent import RespondAgent from vocode.streaming.agent.utils import get_sentence_from_buffer from langchain import ConversationChain from langchain.schema import ChatMessage, AIMessage, HumanMessage -from langchain.chat_models import ChatAnthropic +from langchain_community.chat_models import ChatAnthropic import logging from vocode import getenv @@ -34,15 +35,25 @@ def __init__( self, agent_config: ChatAnthropicAgentConfig, logger: Optional[logging.Logger] = None, - anthropic_api_key: Optional[str] = None, + anthropic_api_key: Optional[SecretStr] = None, ): super().__init__(agent_config=agent_config, logger=logger) import anthropic - anthropic_api_key = anthropic_api_key or getenv("ANTHROPIC_API_KEY") + # Convert anthropic_api_key to SecretStr if it's not None and not already a SecretStr + if anthropic_api_key is not None and not isinstance( + anthropic_api_key, SecretStr + ): + anthropic_api_key = SecretStr(anthropic_api_key) + else: + # Retrieve anthropic_api_key from environment variable and convert to SecretStr + env_key = getenv("ANTHROPIC_API_KEY") + if env_key: + anthropic_api_key = SecretStr(env_key) + if not anthropic_api_key: raise ValueError( - "ANTHROPIC_API_KEY must be set in environment or passed in" + "ANTHROPIC_API_KEY must be set in environment or passed in as a SecretStr" ) self.prompt = ChatPromptTemplate.from_messages( [ @@ -52,13 +63,13 @@ def __init__( ) self.llm = ChatAnthropic( - model=agent_config.model_name, + model_name=agent_config.model_name, anthropic_api_key=anthropic_api_key, ) # streaming not well supported by langchain, so we will connect directly self.anthropic_client = ( - anthropic.AsyncAnthropic(api_key=anthropic_api_key) + anthropic.AsyncAnthropic(api_key=str(anthropic_api_key)) if agent_config.generate_responses else None ) diff --git a/vocode/streaming/agent/bot_sentiment_analyser.py b/vocode/streaming/agent/bot_sentiment_analyser.py index 9565d71cf0..ed2ed14903 100644 --- a/vocode/streaming/agent/bot_sentiment_analyser.py +++ b/vocode/streaming/agent/bot_sentiment_analyser.py @@ -1,7 +1,7 @@ from typing import List, Optional -from langchain.llms import OpenAI +from langchain_community.llms import OpenAI from langchain.prompts import PromptTemplate -from pydantic import BaseModel +from pydantic.v1 import BaseModel from vocode import getenv diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 1d1620d4f2..4afacf2492 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -6,7 +6,7 @@ from typing import AsyncGenerator, Optional, Tuple import logging -from pydantic import BaseModel +from pydantic.v1 import BaseModel from vocode import getenv from vocode.streaming.action.factory import ActionFactory diff --git a/vocode/streaming/agent/llamacpp_agent.py b/vocode/streaming/agent/llamacpp_agent.py index ae938172e4..c7f5777332 100644 --- a/vocode/streaming/agent/llamacpp_agent.py +++ b/vocode/streaming/agent/llamacpp_agent.py @@ -15,7 +15,7 @@ MessagesPlaceholder, HumanMessagePromptTemplate, ) -from pydantic import BaseModel +from pydantic.v1 import BaseModel from langchain.schema import LLMResult, SystemMessage, get_buffer_string from langchain.memory import ConversationBufferMemory from langchain.prompts import ( @@ -24,7 +24,7 @@ HumanMessagePromptTemplate, PromptTemplate, ) -from langchain.prompts.base import DEFAULT_FORMATTER_MAPPING +from langchain_core.prompts.string import DEFAULT_FORMATTER_MAPPING ALPACA_TEMPLATE_WITH_HISTORY = """### Instruction: Your previous conversation history: diff --git a/vocode/streaming/agent/vertex_ai_agent.py b/vocode/streaming/agent/vertex_ai_agent.py index 80df9d805c..0f979bc8a8 100644 --- a/vocode/streaming/agent/vertex_ai_agent.py +++ b/vocode/streaming/agent/vertex_ai_agent.py @@ -5,7 +5,7 @@ from langchain import ConversationChain from vocode.streaming.agent.base_agent import RespondAgent from vocode.streaming.models.agent import ChatVertexAIAgentConfig -from langchain.chat_models import ChatVertexAI +from langchain_community.chat_models import ChatVertexAI from langchain.prompts import ( ChatPromptTemplate, MessagesPlaceholder, diff --git a/vocode/streaming/models/actions.py b/vocode/streaming/models/actions.py index 68322a782d..e93a0006b5 100644 --- a/vocode/streaming/models/actions.py +++ b/vocode/streaming/models/actions.py @@ -1,7 +1,7 @@ import asyncio from enum import Enum from typing import Generic, Optional, TypeVar -from pydantic import BaseModel +from pydantic.v1 import BaseModel from vocode.streaming.models.model import TypedModel @@ -28,7 +28,6 @@ class Config: arbitrary_types_allowed = True - class FunctionFragment(BaseModel): name: str arguments: str diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index e6dfc5336c..47e7da1df7 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -2,7 +2,7 @@ from enum import Enum from langchain.prompts import PromptTemplate -from pydantic import validator +from pydantic.v1 import validator from vocode.streaming.models.actions import ActionConfig from vocode.streaming.models.message import BaseMessage diff --git a/vocode/streaming/models/model.py b/vocode/streaming/models/model.py index 42a4590db1..a4a810e682 100644 --- a/vocode/streaming/models/model.py +++ b/vocode/streaming/models/model.py @@ -1,8 +1,8 @@ from typing import Any, List, Tuple -import pydantic +from pydantic.v1 import BaseModel as PydanticBaseModel -class BaseModel(pydantic.BaseModel): +class BaseModel(PydanticBaseModel): def __init__(self, **data): for key, value in data.items(): if isinstance(value, dict): @@ -16,7 +16,7 @@ def __init__(self, **data): super().__init__(**data) -# Adapted from https://github.com/pydantic/pydantic/discussions/3091 +# Adapted from https://github.com/pydantic.v1/pydantic.v1/discussions/3091 class TypedModel(BaseModel): _subtypes_: List[Tuple[Any, Any]] = [] diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index a98b80d0d4..c9d2c33b82 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -1,7 +1,7 @@ from enum import Enum from typing import Any, Dict, List, Optional, Union -from pydantic import validator +from pydantic.v1 import validator from vocode.streaming.models.client_backend import OutputAudioConfig from vocode.streaming.output_device.base_output_device import BaseOutputDevice diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index fb47419a1a..b4d1249349 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -1,7 +1,7 @@ from enum import Enum from typing import List, Optional -from pydantic import validator +from pydantic.v1 import validator from vocode.streaming.input_device.base_input_device import BaseInputDevice from vocode.streaming.models.client_backend import InputAudioConfig diff --git a/vocode/streaming/models/transcript.py b/vocode/streaming/models/transcript.py index aa17fb3efe..140a3adb9e 100644 --- a/vocode/streaming/models/transcript.py +++ b/vocode/streaming/models/transcript.py @@ -1,6 +1,6 @@ import time from typing import Any, Dict, List, Optional, Union -from pydantic import BaseModel, Field +from pydantic.v1 import BaseModel, Field from enum import Enum from vocode.streaming.models.actions import ActionInput, ActionOutput from vocode.streaming.models.events import ActionEvent, Sender, Event, EventType diff --git a/vocode/streaming/models/vector_db.py b/vocode/streaming/models/vector_db.py index 719c9ef02d..b87c5bade5 100644 --- a/vocode/streaming/models/vector_db.py +++ b/vocode/streaming/models/vector_db.py @@ -16,6 +16,6 @@ class VectorDBConfig(TypedModel, type=VectorDBType.BASE.value): class PineconeConfig(VectorDBConfig, type=VectorDBType.PINECONE.value): index: str - api_key: Optional[str] - api_environment: Optional[str] + api_key: Optional[str] = None + api_environment: Optional[str] = None top_k: int = 3 diff --git a/vocode/streaming/synthesizer/google_synthesizer.py b/vocode/streaming/synthesizer/google_synthesizer.py index 9014bf7d82..d834eef27f 100644 --- a/vocode/streaming/synthesizer/google_synthesizer.py +++ b/vocode/streaming/synthesizer/google_synthesizer.py @@ -33,7 +33,7 @@ def __init__( ): super().__init__(synthesizer_config, aiohttp_session) - from google.cloud import texttospeech_v1beta1 as tts + from google.cloud import texttospeech as tts import google.auth google.auth.default() diff --git a/vocode/streaming/telephony/server/base.py b/vocode/streaming/telephony/server/base.py index 62d279faf1..10c2b365ac 100644 --- a/vocode/streaming/telephony/server/base.py +++ b/vocode/streaming/telephony/server/base.py @@ -3,7 +3,7 @@ import logging from typing import List, Optional from fastapi import APIRouter, Form, Request, Response -from pydantic import BaseModel, Field +from pydantic.v1 import BaseModel, Field from vocode.streaming.agent.factory import AgentFactory from vocode.streaming.models.agent import AgentConfig from vocode.streaming.models.events import RecordingEvent @@ -99,16 +99,24 @@ def __init__( self.router.add_api_route("/events", self.events, methods=["GET", "POST"]) self.logger.info(f"Set up events endpoint at https://{self.base_url}/events") - self.router.add_api_route("/recordings/{conversation_id}", self.recordings, methods=["GET", "POST"]) - self.logger.info(f"Set up recordings endpoint at https://{self.base_url}/recordings/{{conversation_id}}") - + self.router.add_api_route( + "/recordings/{conversation_id}", self.recordings, methods=["GET", "POST"] + ) + self.logger.info( + f"Set up recordings endpoint at https://{self.base_url}/recordings/{{conversation_id}}" + ) + def events(self, request: Request): return Response() async def recordings(self, request: Request, conversation_id: str): recording_url = (await request.json())["recording_url"] if self.events_manager is not None and recording_url is not None: - self.events_manager.publish_event(RecordingEvent(recording_url=recording_url, conversation_id=conversation_id)) + self.events_manager.publish_event( + RecordingEvent( + recording_url=recording_url, conversation_id=conversation_id + ) + ) return Response() def create_inbound_route( @@ -156,7 +164,9 @@ async def vonage_route( conversation_id = create_conversation_id() await self.config_manager.save_config(conversation_id, call_config) return VonageClient.create_call_ncco( - base_url=self.base_url, conversation_id=conversation_id, record=vonage_config.record + base_url=self.base_url, + conversation_id=conversation_id, + record=vonage_config.record, ) if isinstance(inbound_call_config, TwilioInboundCallConfig): diff --git a/vocode/streaming/user_implemented_agent/restful_agent.py b/vocode/streaming/user_implemented_agent/restful_agent.py index 5c76f181f3..0d13fff3d8 100644 --- a/vocode/streaming/user_implemented_agent/restful_agent.py +++ b/vocode/streaming/user_implemented_agent/restful_agent.py @@ -8,7 +8,7 @@ RESTfulAgentText, RESTfulAgentEnd, ) -from pydantic import BaseModel +from pydantic.v1 import BaseModel from typing import Union from fastapi import APIRouter diff --git a/vocode/turn_based/agent/chat_gpt_agent.py b/vocode/turn_based/agent/chat_gpt_agent.py index e81d9e168e..37e6e5b0e7 100644 --- a/vocode/turn_based/agent/chat_gpt_agent.py +++ b/vocode/turn_based/agent/chat_gpt_agent.py @@ -7,7 +7,7 @@ HumanMessagePromptTemplate, ) from langchain.chains import ConversationChain -from langchain.chat_models import ChatOpenAI +from langchain_community.chat_models import ChatOpenAI from langchain.memory import ConversationBufferMemory from vocode import getenv @@ -36,7 +36,9 @@ def __init__( HumanMessagePromptTemplate.from_template("{input}"), ] ) - self.memory = memory if memory else ConversationBufferMemory(return_messages=True) + self.memory = ( + memory if memory else ConversationBufferMemory(return_messages=True) + ) if initial_message: self.memory.chat_memory.add_ai_message(initial_message) self.llm = ChatOpenAI( # type: ignore @@ -49,4 +51,4 @@ def __init__( ) def respond(self, human_input: str): - return self.conversation.predict(input=human_input) \ No newline at end of file + return self.conversation.predict(input=human_input) From 9b03de2552e871159e74861ba8942aa85505f441 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Mon, 26 Feb 2024 11:44:25 -0500 Subject: [PATCH 058/148] 482 unify version across demos (#489) * Update vocode version in apps/client_backend/pyproject.toml last stable vocode Version * Update langchain_agent README and pyproject.toml to last stable vocode version * Update apps/telegram_bot Python version and Vocode dependency #482 * Update apps/telephony_app dependencies and fix documentation links #482 * Update vocode version in apps/voice_rag #482 --- apps/client_backend/poetry.lock | 2418 ++++++------ apps/client_backend/pyproject.toml | 2 +- apps/langchain_agent/README.md | 2 +- apps/langchain_agent/poetry.lock | 2587 +++++++------ apps/langchain_agent/pyproject.toml | 2 +- apps/telegram_bot/Dockerfile | 2 +- apps/telegram_bot/main.py | 9 +- apps/telegram_bot/poetry.lock | 3424 +++++++---------- apps/telegram_bot/pyproject.toml | 4 +- apps/telephony_app/.env.template | 15 + apps/telephony_app/README.md | 2 +- apps/telephony_app/main.py | 24 +- apps/telephony_app/poetry.lock | 2379 ++++++------ apps/telephony_app/pyproject.toml | 2 +- apps/telephony_app/speller_agent.py | 47 +- apps/voice_rag/.env.template | 13 +- apps/voice_rag/Dockerfile | 2 +- apps/voice_rag/environment.docker.yml | 2 +- apps/voice_rag/manual_pinecone_ingestor.ipynb | 2 +- 19 files changed, 5450 insertions(+), 5488 deletions(-) diff --git a/apps/client_backend/poetry.lock b/apps/client_backend/poetry.lock index 635531af4f..ce04d94f45 100644 --- a/apps/client_backend/poetry.lock +++ b/apps/client_backend/poetry.lock @@ -1,119 +1,105 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.9.1" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +114,6 @@ frozenlist = ">=1.1.0" name = "anthropic" version = "0.2.10" description = "Library for accessing the anthropic API" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -147,199 +132,159 @@ dev = ["black (>=22.3.0)", "pytest"] [[package]] name = "anyio" -version = "3.7.1" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" -category = "main" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "azure-cognitiveservices-speech" -version = "1.31.0" +version = "1.34.1" description = "Microsoft Cognitive Services Speech SDK for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, -] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, ] [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -347,99 +292,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -449,7 +407,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -461,7 +418,6 @@ files = [ name = "dataclasses-json" version = "0.5.14" description = "Easily serialize dataclasses to and from JSON." -category = "main" optional = false python-versions = ">=3.7,<3.13" files = [ @@ -477,7 +433,6 @@ typing-inspect = ">=0.4.0,<1" name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -489,7 +444,6 @@ files = [ name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -505,14 +459,13 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "elevenlabs" -version = "0.2.23" +version = "0.2.24" description = "The official elevenlabs python package." -category = "main" optional = false python-versions = "*" files = [ - {file = "elevenlabs-0.2.23-py3-none-any.whl", hash = "sha256:f2d921ec7fc71731438bfd6ebc155e54bb26f2fe6e88d703c79a577dcb7f85b2"}, - {file = "elevenlabs-0.2.23.tar.gz", hash = "sha256:561657f6a784fccb3ca9fcd1e4a0d6183898cfb3b6cab85bf167db2144c232f1"}, + {file = "elevenlabs-0.2.24-py3-none-any.whl", hash = "sha256:f1dc780e50ace7a499717cc67485b87bf5cd806a2711fca7a4fbf1b8b9f3a41c"}, + {file = "elevenlabs-0.2.24.tar.gz", hash = "sha256:7719816f8d74666c0da5567e737b6c0200f2807bed9d9c21ed750f14e8a3669d"}, ] [package.dependencies] @@ -523,14 +476,13 @@ websockets = ">=11.0" [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -538,191 +490,249 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastapi" -version = "0.95.2" +version = "0.100.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, - {file = "fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, ] [package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] [package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, ] +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +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)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -732,127 +742,152 @@ files = [ [[package]] name = "httpcore" -version = "0.17.3" +version = "1.0.2" description = "A minimal low-level HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.26.0" description = "The next generation HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.20.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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, + {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, +] + +[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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +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.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "6.11.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, + {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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 = "ipython" -version = "8.14.0" +version = "8.18.1" description = "IPython: Productive Interactive Computing" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, - {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "janus" version = "1.0.0" description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -865,14 +900,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jedi" -version = "0.19.0" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] @@ -881,18 +915,17 @@ parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -903,21 +936,19 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.1" +version = "1.3.2" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, - {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] name = "langchain" version = "0.0.198" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -955,7 +986,6 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] name = "langchainplus-sdk" version = "0.0.20" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -970,90 +1000,97 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "marshmallow" -version = "3.20.1" +version = "3.20.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, - {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1068,7 +1105,6 @@ traitlets = "*" name = "miniaudio" version = "1.59" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" -category = "main" optional = false python-versions = "*" files = [ @@ -1133,7 +1169,6 @@ cffi = ">=1.12.0" name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1217,7 +1252,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1229,7 +1263,6 @@ files = [ name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1253,42 +1286,40 @@ twitter = ["twython"] [[package]] name = "numexpr" -version = "2.8.5" +version = "2.8.8" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, - {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, - {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, - {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, - {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, - {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, - {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, - {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, - {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, - {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, - {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, - {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, - {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, - {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, + {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, + {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, + {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, + {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, + {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, + {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, + {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, + {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, + {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, + {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, + {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, + {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, + {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, ] [package.dependencies] @@ -1296,49 +1327,58 @@ numpy = ">=1.13.3" [[package]] name = "numpy" -version = "1.25.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, - {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, - {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, - {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, - {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, - {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, - {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, - {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, - {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, - {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, - {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, - {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] name = "openai" -version = "0.27.8" +version = "0.27.10" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.8-py3-none-any.whl", hash = "sha256:e0a7c2f7da26bdbe5354b03c6d4b82a2f34bd4458c7a17ae1a7092c3e397e03c"}, - {file = "openai-0.27.8.tar.gz", hash = "sha256:2483095c7db1eee274cebac79e315a986c4e55207bb4fa7b82d185b3a2ed9536"}, + {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, + {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, ] [package.dependencies] @@ -1348,7 +1388,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -1356,7 +1396,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1369,14 +1408,13 @@ pydantic = ">=1.8.2" [[package]] name = "opentelemetry-api" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python API" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.19.0-py3-none-any.whl", hash = "sha256:dcd2a0ad34b691964947e1d50f9e8c415c32827a1d87f0459a72deb9afdf5597"}, - {file = "opentelemetry_api-1.19.0.tar.gz", hash = "sha256:db374fb5bea00f3c7aa290f5d94cea50b659e6ea9343384c5f6c2bb5d5e8db65"}, + {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, + {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, ] [package.dependencies] @@ -1385,50 +1423,46 @@ importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-sdk" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python SDK" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.19.0-py3-none-any.whl", hash = "sha256:bb67ad676b1bc671766a40d7fc9d9563854c186fa11f0dc8fa2284e004bd4263"}, - {file = "opentelemetry_sdk-1.19.0.tar.gz", hash = "sha256:765928956262c7a7766eaba27127b543fb40ef710499cad075f261f52163a87f"}, + {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, + {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, ] [package.dependencies] -opentelemetry-api = "1.19.0" -opentelemetry-semantic-conventions = "0.40b0" +opentelemetry-api = "1.22.0" +opentelemetry-semantic-conventions = "0.43b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.40b0" +version = "0.43b0" description = "OpenTelemetry Semantic Conventions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.40b0-py3-none-any.whl", hash = "sha256:7ebbaf86755a0948902e68637e3ae516c50222c30455e55af154ad3ffe283839"}, - {file = "opentelemetry_semantic_conventions-0.40b0.tar.gz", hash = "sha256:5a7a491873b15ab7c4907bbfd8737645cc87ca55a0a326c1755d1b928d8a0fae"}, + {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, + {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1442,41 +1476,27 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." -category = "main" optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -1486,7 +1506,6 @@ wcwidth = "*" name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -1498,7 +1517,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "main" optional = false python-versions = "*" files = [ @@ -1513,7 +1531,6 @@ tests = ["pytest"] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1523,48 +1540,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" +version = "1.10.14" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -1578,7 +1594,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -category = "main" optional = false python-versions = "*" files = [ @@ -1588,29 +1603,28 @@ files = [ [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -1620,7 +1634,6 @@ cli = ["click (>=5.0)"] name = "python-multipart" version = "0.0.6" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1635,7 +1648,6 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1683,107 +1695,110 @@ files = [ [[package]] name = "regex" -version = "2023.6.3" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1803,46 +1818,50 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "scipy" -version = "1.11.1" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, - {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, - {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, - {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, - {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, - {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, - {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, - {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, - {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1854,7 +1873,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1866,7 +1884,6 @@ files = [ name = "sounddevice" version = "0.4.6" description = "Play and Record Sound with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1885,80 +1902,88 @@ numpy = ["NumPy"] [[package]] name = "speechrecognition" -version = "3.10.0" +version = "3.10.1" description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "SpeechRecognition-3.10.0-py2.py3-none-any.whl", hash = "sha256:7ae9966887d9909ce3e5a0c27ecc3eacfca16fd0c0829f77f552919418e86306"}, - {file = "SpeechRecognition-3.10.0.tar.gz", hash = "sha256:14131155e8a8ba00ead1b7b9b1a2fa71c845e4db5f9a5f66a33a1bd6c55c6c35"}, + {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, + {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, ] [package.dependencies] requests = ">=2.26.0" +typing-extensions = "*" [package.extras] whisper-api = ["openai"] [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.25" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, + {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, + {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -1968,7 +1993,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -1978,18 +2003,17 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "main" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -2004,7 +2028,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "starlette" version = "0.27.0" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2021,14 +2044,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -2036,113 +2058,181 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" -category = "main" +version = "0.15.1" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, + {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, + {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, + {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, + {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, + {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, + {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, + {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, + {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, + {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, + {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, + {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, + {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, + {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, ] +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + [package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.14.1" description = "Traitlets Python configuration system" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -2156,19 +2246,17 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "2.0.4" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, - {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -2176,7 +2264,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "uvicorn" version = "0.21.1" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2193,21 +2280,20 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "vocode" -version = "0.1.111a3" +version = "0.1.111" description = "The all-in-one voice SDK" -category = "main" optional = false python-versions = ">=3.8.1,<3.12" files = [ - {file = "vocode-0.1.111a3-py3-none-any.whl", hash = "sha256:714dd891d10d702dba85283272fa22771009670aa1d62ad27ba4c26b2bfdfbd3"}, - {file = "vocode-0.1.111a3.tar.gz", hash = "sha256:e1dd95d1bc1881e39167772a08e3bca586db8ae1346d5f6deb0e00b4499f8a49"}, + {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, + {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, ] [package.dependencies] aiohttp = ">=3.8.4,<4.0.0" anthropic = ">=0.2.9,<0.3.0" azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" -fastapi = ">=0.95.1,<0.96.0" +fastapi = ">=0.100.1,<0.101.0" janus = ">=1.0.0,<2.0.0" jinja2 = ">=3.1.2,<4.0.0" langchain = ">=0.0.198,<0.0.199" @@ -2235,21 +2321,19 @@ transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] name = "websockets" version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2327,171 +2411,180 @@ files = [ [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +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 = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -2500,21 +2593,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "84c5140bff7f1e824602e3be07fc9eca2a7a65ec67356182ecec9c5c2b7ffe62" +content-hash = "1f9bab039c4649c00109eb45a3d2e3ca5ff31cf0cdbabbed9e610c2d2aef9d35" diff --git a/apps/client_backend/pyproject.toml b/apps/client_backend/pyproject.toml index 4b3a87d922..6863fbd168 100644 --- a/apps/client_backend/pyproject.toml +++ b/apps/client_backend/pyproject.toml @@ -8,7 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.9,<3.12" python-dotenv = "^1.0.0" -vocode = "0.1.111a3" +vocode = "0.1.111" elevenlabs = "^0.2.23" diff --git a/apps/langchain_agent/README.md b/apps/langchain_agent/README.md index 9054cfc8d3..55df9b61ce 100644 --- a/apps/langchain_agent/README.md +++ b/apps/langchain_agent/README.md @@ -1,3 +1,3 @@ # langchain_agent -See https://docs.vocode.dev/langchain-agent for setup steps! +See https://docs.vocode.dev/open-source/langchain-agent for setup steps! diff --git a/apps/langchain_agent/poetry.lock b/apps/langchain_agent/poetry.lock index af4e852c77..61fc8b8a30 100644 --- a/apps/langchain_agent/poetry.lock +++ b/apps/langchain_agent/poetry.lock @@ -1,119 +1,105 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.9.1" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiohttp-retry" version = "2.8.3" description = "Simple retry client for aiohttp" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +114,6 @@ aiohttp = "*" name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -143,7 +128,6 @@ frozenlist = ">=1.1.0" name = "anthropic" version = "0.2.10" description = "Library for accessing the anthropic API" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -162,169 +146,152 @@ dev = ["black (>=22.3.0)", "pytest"] [[package]] name = "anyio" -version = "3.7.1" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "azure-cognitiveservices-speech" -version = "1.31.0" +version = "1.34.1" description = "Microsoft Cognitive Services Speech SDK for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, ] [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, ] [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -332,99 +299,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -434,7 +414,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -444,55 +423,62 @@ files = [ [[package]] name = "cryptography" -version = "41.0.3" +version = "42.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, - {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, - {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, - {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, + {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77"}, + {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa"}, + {file = "cryptography-42.0.1-cp37-abi3-win32.whl", hash = "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453"}, + {file = "cryptography-42.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302"}, + {file = "cryptography-42.0.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49"}, + {file = "cryptography-42.0.1-cp39-abi3-win32.whl", hash = "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881"}, + {file = "cryptography-42.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04"}, + {file = "cryptography-42.0.1.tar.gz", hash = "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" version = "0.5.14" description = "Easily serialize dataclasses to and from JSON." -category = "main" optional = false python-versions = ">=3.7,<3.13" files = [ @@ -508,7 +494,6 @@ typing-inspect = ">=0.4.0,<1" name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -524,14 +509,13 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -539,119 +523,181 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.95.2" +version = "0.100.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, - {file = "fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, ] [package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" [package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, ] +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +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)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "google-api-core" -version = "2.11.1" +version = "2.15.0" description = "Google API client core library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, + {file = "google-api-core-2.15.0.tar.gz", hash = "sha256:abc978a72658f14a2df1e5e12532effe40f94f868f6e23d95133bd6abcca35ca"}, + {file = "google_api_core-2.15.0-py3-none-any.whl", hash = "sha256:2aa56d2be495551e66bbff7f729b790546f87d5c90e74781aa77233bcb395a8a"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] grpcio-status = [ - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -663,22 +709,19 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.22.0" +version = "2.27.0" description = "Google Authentication Library" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, - {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, + {file = "google-auth-2.27.0.tar.gz", hash = "sha256:e863a56ccc2d8efa83df7a80272601e43487fa9a728a376205c86c26aaefa821"}, + {file = "google_auth-2.27.0-py2.py3-none-any.whl", hash = "sha256:8e4bad367015430ff253fe49d500fdc3396c1a434db5740828c728e45bcce245"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -689,34 +732,29 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-texttospeech" -version = "2.14.1" +version = "2.15.1" description = "Google Cloud Texttospeech API client library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.14.1.tar.gz", hash = "sha256:dd716f2a768ad67502cfd99b9925c51ffd6e16be93b410abeeffdaac190bfe81"}, - {file = "google_cloud_texttospeech-2.14.1-py2.py3-none-any.whl", hash = "sha256:883fe35e3c823ff77cc633b30ab9a93d3b5eb38ebce7eaeef6f87e8d03210e54"}, + {file = "google-cloud-texttospeech-2.15.1.tar.gz", hash = "sha256:47845e3ad9cefdabaf358947cb196dddea2faa4cdfcaf864a011db821a4deafb"}, + {file = "google_cloud_texttospeech-2.15.1-py2.py3-none-any.whl", hash = "sha256:9af25742c2fc57e7793dfc831ab40d5f169f6843ba553ca559ab1ec73536076e"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} -proto-plus = [ - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, - {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, -] +google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" [[package]] name = "googleapis-common-protos" -version = "1.60.0" +version = "1.62.0" description = "Common protobufs used in Google APIs" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, - {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, + {file = "googleapis-common-protos-1.62.0.tar.gz", hash = "sha256:83f0ece9f94e5672cced82f592d2a5edf527a96ed1794f0bab36d5735c996277"}, + {file = "googleapis_common_protos-1.62.0-py2.py3-none-any.whl", hash = "sha256:4750113612205514f9f6aa4cb00d523a94f3e8c06c5ad2fee466387dc4875f07"}, ] [package.dependencies] @@ -727,158 +765,161 @@ grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.56.2" +version = "1.60.0" description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, - {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, - {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, - {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, - {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, - {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, - {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, - {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, - {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, - {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, - {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, - {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, - {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, - {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, - {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, - {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, - {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, - {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, - {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, - {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, + {file = "grpcio-1.60.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d020cfa595d1f8f5c6b343530cd3ca16ae5aefdd1e832b777f9f0eb105f5b139"}, + {file = "grpcio-1.60.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b98f43fcdb16172dec5f4b49f2fece4b16a99fd284d81c6bbac1b3b69fcbe0ff"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:20e7a4f7ded59097c84059d28230907cd97130fa74f4a8bfd1d8e5ba18c81491"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452ca5b4afed30e7274445dd9b441a35ece656ec1600b77fff8c216fdf07df43"}, + {file = "grpcio-1.60.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43e636dc2ce9ece583b3e2ca41df5c983f4302eabc6d5f9cd04f0562ee8ec1ae"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e306b97966369b889985a562ede9d99180def39ad42c8014628dd3cc343f508"}, + {file = "grpcio-1.60.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f897c3b127532e6befdcf961c415c97f320d45614daf84deba0a54e64ea2457b"}, + {file = "grpcio-1.60.0-cp310-cp310-win32.whl", hash = "sha256:b87efe4a380887425bb15f220079aa8336276398dc33fce38c64d278164f963d"}, + {file = "grpcio-1.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:a9c7b71211f066908e518a2ef7a5e211670761651039f0d6a80d8d40054047df"}, + {file = "grpcio-1.60.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:fb464479934778d7cc5baf463d959d361954d6533ad34c3a4f1d267e86ee25fd"}, + {file = "grpcio-1.60.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:4b44d7e39964e808b071714666a812049765b26b3ea48c4434a3b317bac82f14"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:90bdd76b3f04bdb21de5398b8a7c629676c81dfac290f5f19883857e9371d28c"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91229d7203f1ef0ab420c9b53fe2ca5c1fbeb34f69b3bc1b5089466237a4a134"}, + {file = "grpcio-1.60.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b36a2c6d4920ba88fa98075fdd58ff94ebeb8acc1215ae07d01a418af4c0253"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:297eef542156d6b15174a1231c2493ea9ea54af8d016b8ca7d5d9cc65cfcc444"}, + {file = "grpcio-1.60.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:87c9224acba0ad8bacddf427a1c2772e17ce50b3042a789547af27099c5f751d"}, + {file = "grpcio-1.60.0-cp311-cp311-win32.whl", hash = "sha256:95ae3e8e2c1b9bf671817f86f155c5da7d49a2289c5cf27a319458c3e025c320"}, + {file = "grpcio-1.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:467a7d31554892eed2aa6c2d47ded1079fc40ea0b9601d9f79204afa8902274b"}, + {file = "grpcio-1.60.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:a7152fa6e597c20cb97923407cf0934e14224af42c2b8d915f48bc3ad2d9ac18"}, + {file = "grpcio-1.60.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:7db16dd4ea1b05ada504f08d0dca1cd9b926bed3770f50e715d087c6f00ad748"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:b0571a5aef36ba9177e262dc88a9240c866d903a62799e44fd4aae3f9a2ec17e"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fd9584bf1bccdfff1512719316efa77be235469e1e3295dce64538c4773840b"}, + {file = "grpcio-1.60.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6a478581b1a1a8fdf3318ecb5f4d0cda41cacdffe2b527c23707c9c1b8fdb55"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:77c8a317f0fd5a0a2be8ed5cbe5341537d5c00bb79b3bb27ba7c5378ba77dbca"}, + {file = "grpcio-1.60.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1c30bb23a41df95109db130a6cc1b974844300ae2e5d68dd4947aacba5985aa5"}, + {file = "grpcio-1.60.0-cp312-cp312-win32.whl", hash = "sha256:2aef56e85901c2397bd557c5ba514f84de1f0ae5dd132f5d5fed042858115951"}, + {file = "grpcio-1.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:e381fe0c2aa6c03b056ad8f52f8efca7be29fb4d9ae2f8873520843b6039612a"}, + {file = "grpcio-1.60.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:92f88ca1b956eb8427a11bb8b4a0c0b2b03377235fc5102cb05e533b8693a415"}, + {file = "grpcio-1.60.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:e278eafb406f7e1b1b637c2cf51d3ad45883bb5bd1ca56bc05e4fc135dfdaa65"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a48edde788b99214613e440fce495bbe2b1e142a7f214cce9e0832146c41e324"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de2ad69c9a094bf37c1102b5744c9aec6cf74d2b635558b779085d0263166454"}, + {file = "grpcio-1.60.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:073f959c6f570797272f4ee9464a9997eaf1e98c27cb680225b82b53390d61e6"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c826f93050c73e7769806f92e601e0efdb83ec8d7c76ddf45d514fee54e8e619"}, + {file = "grpcio-1.60.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e30be89a75ee66aec7f9e60086fadb37ff8c0ba49a022887c28c134341f7179"}, + {file = "grpcio-1.60.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b0fb2d4801546598ac5cd18e3ec79c1a9af8b8f2a86283c55a5337c5aeca4b1b"}, + {file = "grpcio-1.60.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:9073513ec380434eb8d21970e1ab3161041de121f4018bbed3146839451a6d8e"}, + {file = "grpcio-1.60.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:74d7d9fa97809c5b892449b28a65ec2bfa458a4735ddad46074f9f7d9550ad13"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:1434ca77d6fed4ea312901122dc8da6c4389738bf5788f43efb19a838ac03ead"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e61e76020e0c332a98290323ecfec721c9544f5b739fab925b6e8cbe1944cf19"}, + {file = "grpcio-1.60.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675997222f2e2f22928fbba640824aebd43791116034f62006e19730715166c0"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5208a57eae445ae84a219dfd8b56e04313445d146873117b5fa75f3245bc1390"}, + {file = "grpcio-1.60.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:428d699c8553c27e98f4d29fdc0f0edc50e9a8a7590bfd294d2edb0da7be3629"}, + {file = "grpcio-1.60.0-cp38-cp38-win32.whl", hash = "sha256:83f2292ae292ed5a47cdcb9821039ca8e88902923198f2193f13959360c01860"}, + {file = "grpcio-1.60.0-cp38-cp38-win_amd64.whl", hash = "sha256:705a68a973c4c76db5d369ed573fec3367d7d196673fa86614b33d8c8e9ebb08"}, + {file = "grpcio-1.60.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:c193109ca4070cdcaa6eff00fdb5a56233dc7610216d58fb81638f89f02e4968"}, + {file = "grpcio-1.60.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:676e4a44e740deaba0f4d95ba1d8c5c89a2fcc43d02c39f69450b1fa19d39590"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5ff21e000ff2f658430bde5288cb1ac440ff15c0d7d18b5fb222f941b46cb0d2"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c86343cf9ff7b2514dd229bdd88ebba760bd8973dac192ae687ff75e39ebfab"}, + {file = "grpcio-1.60.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fd3b3968ffe7643144580f260f04d39d869fcc2cddb745deef078b09fd2b328"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:30943b9530fe3620e3b195c03130396cd0ee3a0d10a66c1bee715d1819001eaf"}, + {file = "grpcio-1.60.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b10241250cb77657ab315270b064a6c7f1add58af94befa20687e7c8d8603ae6"}, + {file = "grpcio-1.60.0-cp39-cp39-win32.whl", hash = "sha256:79a050889eb8d57a93ed21d9585bb63fca881666fc709f5d9f7f9372f5e7fd03"}, + {file = "grpcio-1.60.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a97a681e82bc11a42d4372fe57898d270a2707f36c45c6676e49ce0d5c41353"}, + {file = "grpcio-1.60.0.tar.gz", hash = "sha256:2199165a1affb666aa24adf0c97436686d0a61bc5fc113c037701fb7c7fceb96"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.56.2)"] +protobuf = ["grpcio-tools (>=1.60.0)"] [[package]] name = "grpcio-status" -version = "1.56.2" +version = "1.60.0" description = "Status proto mapping for gRPC" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.56.2.tar.gz", hash = "sha256:a046b2c0118df4a5687f4585cca9d3c3bae5c498c4dff055dcb43fb06a1180c8"}, - {file = "grpcio_status-1.56.2-py3-none-any.whl", hash = "sha256:63f3842867735f59f5d70e723abffd2e8501a6bcd915612a1119e52f10614782"}, + {file = "grpcio-status-1.60.0.tar.gz", hash = "sha256:f10e0b6db3adc0fdc244b71962814ee982996ef06186446b5695b9fa635aa1ab"}, + {file = "grpcio_status-1.60.0-py3-none-any.whl", hash = "sha256:7d383fa36e59c1e61d380d91350badd4d12ac56e4de2c2b831b050362c3c572e"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.56.2" +grpcio = ">=1.60.0" protobuf = ">=4.21.6" [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -888,79 +929,108 @@ files = [ [[package]] name = "httpcore" -version = "0.17.3" +version = "1.0.2" description = "A minimal low-level HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.26.0" description = "The next generation HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.20.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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, + {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, +] + +[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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +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.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "6.11.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, + {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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"] @@ -968,7 +1038,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "janus" version = "1.0.0" description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -981,14 +1050,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -999,21 +1067,19 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.1" +version = "1.3.2" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, - {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] name = "langchain" version = "0.0.198" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -1051,7 +1117,6 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] name = "langchainplus-sdk" version = "0.0.20" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -1066,90 +1131,97 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "marshmallow" -version = "3.20.1" +version = "3.20.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, - {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "miniaudio" version = "1.59" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" -category = "main" optional = false python-versions = "*" files = [ @@ -1214,7 +1286,6 @@ cffi = ">=1.12.0" name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1298,7 +1369,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1310,7 +1380,6 @@ files = [ name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1334,42 +1403,40 @@ twitter = ["twython"] [[package]] name = "numexpr" -version = "2.8.5" +version = "2.8.8" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, - {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, - {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, - {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, - {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, - {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, - {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, - {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, - {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, - {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, - {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, - {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, - {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, - {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, + {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, + {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, + {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, + {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, + {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, + {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, + {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, + {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, + {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, + {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, + {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, + {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, + {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, ] [package.dependencies] @@ -1377,49 +1444,58 @@ numpy = ">=1.13.3" [[package]] name = "numpy" -version = "1.25.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, - {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, - {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, - {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, - {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, - {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, - {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, - {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, - {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, - {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, - {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, - {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] name = "openai" -version = "0.27.8" +version = "0.27.10" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.8-py3-none-any.whl", hash = "sha256:e0a7c2f7da26bdbe5354b03c6d4b82a2f34bd4458c7a17ae1a7092c3e397e03c"}, - {file = "openai-0.27.8.tar.gz", hash = "sha256:2483095c7db1eee274cebac79e315a986c4e55207bb4fa7b82d185b3a2ed9536"}, + {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, + {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, ] [package.dependencies] @@ -1429,7 +1505,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -1437,7 +1513,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1450,14 +1525,13 @@ pydantic = ">=1.8.2" [[package]] name = "opentelemetry-api" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python API" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.19.0-py3-none-any.whl", hash = "sha256:dcd2a0ad34b691964947e1d50f9e8c415c32827a1d87f0459a72deb9afdf5597"}, - {file = "opentelemetry_api-1.19.0.tar.gz", hash = "sha256:db374fb5bea00f3c7aa290f5d94cea50b659e6ea9343384c5f6c2bb5d5e8db65"}, + {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, + {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, ] [package.dependencies] @@ -1466,55 +1540,51 @@ importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-sdk" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python SDK" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.19.0-py3-none-any.whl", hash = "sha256:bb67ad676b1bc671766a40d7fc9d9563854c186fa11f0dc8fa2284e004bd4263"}, - {file = "opentelemetry_sdk-1.19.0.tar.gz", hash = "sha256:765928956262c7a7766eaba27127b543fb40ef710499cad075f261f52163a87f"}, + {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, + {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, ] [package.dependencies] -opentelemetry-api = "1.19.0" -opentelemetry-semantic-conventions = "0.40b0" +opentelemetry-api = "1.22.0" +opentelemetry-semantic-conventions = "0.43b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.40b0" +version = "0.43b0" description = "OpenTelemetry Semantic Conventions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.40b0-py3-none-any.whl", hash = "sha256:7ebbaf86755a0948902e68637e3ae516c50222c30455e55af154ad3ffe283839"}, - {file = "opentelemetry_semantic_conventions-0.40b0.tar.gz", hash = "sha256:5a7a491873b15ab7c4907bbfd8737645cc87ca55a0a326c1755d1b928d8a0fae"}, + {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, + {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "proto-plus" -version = "1.22.3" +version = "1.23.0" description = "Beautiful, Pythonic protocol buffers." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, - {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, ] [package.dependencies] @@ -1525,44 +1595,39 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.23.4" +version = "4.25.2" description = "" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, - {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, - {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, - {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, - {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, - {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, - {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, - {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, - {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, - {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, - {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, + {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, + {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, + {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, + {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, + {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, + {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, + {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, + {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, + {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, + {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, ] [[package]] name = "pyasn1" -version = "0.5.0" +version = "0.5.1" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, + {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, ] [[package]] name = "pyasn1-modules" version = "0.3.0" description = "A collection of ASN.1-based protocols modules" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ @@ -1577,7 +1642,6 @@ pyasn1 = ">=0.4.6,<0.6.0" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1587,48 +1651,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" +version = "1.10.14" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -1642,7 +1705,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -category = "main" optional = false python-versions = "*" files = [ @@ -1654,7 +1716,6 @@ files = [ name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1673,14 +1734,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -1690,7 +1750,6 @@ cli = ["click (>=5.0)"] name = "python-multipart" version = "0.0.6" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1703,21 +1762,19 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1767,7 +1824,6 @@ files = [ name = "redis" version = "4.6.0" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1784,107 +1840,110 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2023.6.3" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1906,7 +1965,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -1919,46 +1977,50 @@ pyasn1 = ">=0.1.3" [[package]] name = "scipy" -version = "1.11.1" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, - {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, - {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, - {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, - {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, - {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, - {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, - {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, - {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1970,7 +2032,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1982,7 +2043,6 @@ files = [ name = "sounddevice" version = "0.4.6" description = "Play and Record Sound with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2001,80 +2061,88 @@ numpy = ["NumPy"] [[package]] name = "speechrecognition" -version = "3.10.0" +version = "3.10.1" description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "SpeechRecognition-3.10.0-py2.py3-none-any.whl", hash = "sha256:7ae9966887d9909ce3e5a0c27ecc3eacfca16fd0c0829f77f552919418e86306"}, - {file = "SpeechRecognition-3.10.0.tar.gz", hash = "sha256:14131155e8a8ba00ead1b7b9b1a2fa71c845e4db5f9a5f66a33a1bd6c55c6c35"}, + {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, + {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, ] [package.dependencies] requests = ">=2.26.0" +typing-extensions = "*" [package.extras] whisper-api = ["openai"] [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.25" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, + {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, + {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -2084,7 +2152,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -2094,13 +2162,12 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" version = "0.27.0" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2117,14 +2184,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -2132,116 +2198,183 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" -category = "main" +version = "0.15.1" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, + {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, + {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, + {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, + {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, + {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, + {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, + {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, + {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, + {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, + {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, + {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, + {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, + {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, ] +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + [package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "twilio" -version = "8.5.0" +version = "8.12.0" description = "Twilio API client and TwiML generator" -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-8.5.0-py2.py3-none-any.whl", hash = "sha256:a6fdea2252cb7a8a47b5750d58abe1888bba9777482bac8e9bc3be47970facc7"}, - {file = "twilio-8.5.0.tar.gz", hash = "sha256:f55da9b485f9070aef09836e56230d0e6fd83811d2e6668f20d9057dd3668143"}, + {file = "twilio-8.12.0-py2.py3-none-any.whl", hash = "sha256:ccdf78b634dff13fd50b33bafd254a9dc2fb492c6b06839683e73f09ec110ec6"}, + {file = "twilio-8.12.0.tar.gz", hash = "sha256:28e3a743da18d5b298c9b9fb9e922404a60f8091441c5e0aa35bfefc46411370"}, ] [package.dependencies] aiohttp = ">=3.8.4" aiohttp-retry = ">=2.8.3" PyJWT = ">=2.0.0,<3.0.0" -pytz = "*" requests = ">=2.0.0" [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -2255,26 +2388,24 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "1.26.16" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" version = "0.21.1" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2291,21 +2422,20 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "vocode" -version = "0.1.111a3" +version = "0.1.111" description = "The all-in-one voice SDK" -category = "main" optional = false python-versions = ">=3.8.1,<3.12" files = [ - {file = "vocode-0.1.111a3-py3-none-any.whl", hash = "sha256:714dd891d10d702dba85283272fa22771009670aa1d62ad27ba4c26b2bfdfbd3"}, - {file = "vocode-0.1.111a3.tar.gz", hash = "sha256:e1dd95d1bc1881e39167772a08e3bca586db8ae1346d5f6deb0e00b4499f8a49"}, + {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, + {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, ] [package.dependencies] aiohttp = ">=3.8.4,<4.0.0" anthropic = ">=0.2.9,<0.3.0" azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" -fastapi = ">=0.95.1,<0.96.0" +fastapi = ">=0.100.1,<0.101.0" janus = ">=1.0.0,<2.0.0" jinja2 = ">=3.1.2,<4.0.0" langchain = ">=0.0.198,<0.0.199" @@ -2333,33 +2463,31 @@ transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] [[package]] name = "vonage" -version = "3.7.1" +version = "3.12.0" description = "Vonage Server SDK for Python" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vonage-3.7.1-py2.py3-none-any.whl", hash = "sha256:3939cfcfc95519e456a80c583de82d49bbd528cb2315b61f4144d77d7373ae77"}, - {file = "vonage-3.7.1.tar.gz", hash = "sha256:c3665124a24caf36b0239e6720f989dffd1ab843db8dc93660e3f0a33fd73af8"}, + {file = "vonage-3.12.0-py2.py3-none-any.whl", hash = "sha256:5816909ae6ad76b18e4b33addcff6e8156bab0b8c6a6caf4803c60e7585cadf6"}, + {file = "vonage-3.12.0.tar.gz", hash = "sha256:3034df64e482927be4c9c289dee890b4e578b0057a0055af05a8ca471d143e9c"}, ] [package.dependencies] Deprecated = "*" -pydantic = ">=1.10,<2.0.0" +pydantic = ">=1.10,<2.dev0" pytz = ">=2018.5" requests = ">=2.4.2" -vonage-jwt = ">=1.0.0" +vonage-jwt = ">=1.1.0" [[package]] name = "vonage-jwt" -version = "1.0.0" +version = "1.1.0" description = "A JWT Generator for Python. Creates JWTs for use with Vonage APIs." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "vonage_jwt-1.0.0-py3-none-any.whl", hash = "sha256:967df0ea98e149cbba2f12dfaee1ba37fcbc7cf6f512523909b71feba1e1ff6c"}, - {file = "vonage_jwt-1.0.0.tar.gz", hash = "sha256:71cb82ea436743dcb26b6934279997314eb041152f07dff654733e6b28efbfd5"}, + {file = "vonage_jwt-1.1.0-py3-none-any.whl", hash = "sha256:f41d2fc51f80cebddff1d65ec2146527ee83ca95f3e8a8fe9cda2263a435e2ed"}, + {file = "vonage_jwt-1.1.0.tar.gz", hash = "sha256:ed6af2bf82dc7cffe42ad453295472b86e02852baaaa3f2b97cd49fcb4e9019d"}, ] [package.dependencies] @@ -2369,7 +2497,6 @@ pyjwt = {version = ">=1.6.4", extras = ["crypto"]} name = "websockets" version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2447,171 +2574,180 @@ files = [ [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +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 = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -2620,21 +2756,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "2a2e8e66123682eb4aea4385f4b19b294d24cf99708bca75311052d8d1171eed" +content-hash = "2aedce8bfb57f01f943251e7ea5d3c82cdd06f29115a81ec8596881ae0c43396" diff --git a/apps/langchain_agent/pyproject.toml b/apps/langchain_agent/pyproject.toml index cde5b7ad2c..b1e3f8b1c3 100644 --- a/apps/langchain_agent/pyproject.toml +++ b/apps/langchain_agent/pyproject.toml @@ -11,7 +11,7 @@ redis = "^4.5.4" twilio = "^8.1.0" vonage = "^3.5.1" python-dotenv = "^1.0.0" -vocode = "0.1.111a3" +vocode = "0.1.111" google-cloud-texttospeech = "^2.14.1" diff --git a/apps/telegram_bot/Dockerfile b/apps/telegram_bot/Dockerfile index 4d63119eb6..afc3fc334b 100644 --- a/apps/telegram_bot/Dockerfile +++ b/apps/telegram_bot/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11 +FROM python:3.9-bullseye # get portaudio and ffmpeg RUN apt-get update \ diff --git a/apps/telegram_bot/main.py b/apps/telegram_bot/main.py index c6090615a7..673c417dcf 100644 --- a/apps/telegram_bot/main.py +++ b/apps/telegram_bot/main.py @@ -28,6 +28,10 @@ BaseSynthesizer, ) +from dotenv import load_dotenv + +load_dotenv() + logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO ) @@ -46,7 +50,7 @@ # Required environment variables containing API key: OPENAI_API_KEY, TELEGRAM_BOT_KEY, and your Vocode synthesizers classes corresponding API key variable # Your chosen synthesizer provider's corresponding Vocode turn_based class instance -SYNTH = CoquiSynthesizer(use_xtts=True) +SYNTH = AzureSynthesizer(voice_name="en-US-SteffanNeural") # Instructions to the language model responsible for generating response transcript. SYSTEM_PROMPT = "You are having a voice-to-voice conversation with a user. Always pretend you are a real human. Do not avoid or decline to answer questions because you are not human." @@ -153,7 +157,8 @@ async def get_response( setattr(self.synthesizer, voice_attr_of[type(self.synthesizer)], voice_id) # Synthesize response - synth_response = await self.synthesizer.async_synthesize(agent_response) + # TODO make async + synth_response = self.synthesizer.synthesize(agent_response) # Save conversation to DB self.db[chat_id].current_conversation = pickle.dumps(agent.memory) diff --git a/apps/telegram_bot/poetry.lock b/apps/telegram_bot/poetry.lock index 8bdbbb870f..1fe44c91c5 100644 --- a/apps/telegram_bot/poetry.lock +++ b/apps/telegram_bot/poetry.lock @@ -1,134 +1,105 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.4" +version = "3.9.1" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, - {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, - {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, - {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, - {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, - {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, - {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, - {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, - {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, - {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, - {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, - {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, - {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, - {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, - {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, - {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, - {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, - {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, - {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, - {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, - {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, - {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, - {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, - {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, - {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, - {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, - {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, - {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, - {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, - {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiohttp-retry" -version = "2.8.3" -description = "Simple retry client for aiohttp" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiohttp_retry-2.8.3-py3-none-any.whl", hash = "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45"}, - {file = "aiohttp_retry-2.8.3.tar.gz", hash = "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9"}, -] - -[package.dependencies] -aiohttp = "*" +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -141,14 +112,13 @@ frozenlist = ">=1.1.0" [[package]] name = "anthropic" -version = "0.2.9" +version = "0.2.10" description = "Library for accessing the anthropic API" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "anthropic-0.2.9-py3-none-any.whl", hash = "sha256:e7cce215cf6c446de29280deb31b07b5587993d48e84850eaad3fc69bd1fec0a"}, - {file = "anthropic-0.2.9.tar.gz", hash = "sha256:2d44564d362cced6e8e662366e4de7f94dcdc6cb61346a5e528359b0afc1f2f3"}, + {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, + {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, ] [package.dependencies] @@ -162,147 +132,100 @@ dev = ["black (>=22.3.0)", "pytest"] [[package]] name = "anyio" -version = "3.7.0" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - -[[package]] -name = "asttokens" -version = "2.2.1" -description = "Annotate AST trees with source code positions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -test = ["astroid", "pytest"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "azure-cognitiveservices-speech" -version = "1.28.0" +version = "1.34.1" description = "Microsoft Cognitive Services Speech SDK for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:a6c277ec9c93f586dcc74d3a56a6aa0259f4cf371f5e03afcf169c691e2c4d0c"}, - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a412c6c5bc528548e0ee5fc5fe89fb8351307d0c5ef7ac4d506fab3d58efcb4a"}, - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:ceb5a8862da4ab861bd06653074a4e5dc2d66a54f03dd4dd9356da7672febbce"}, - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d5cba32e9d8eaffc9d8f482c00950bc471f9dc4d7659c741c083e5e9d831b802"}, - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-win32.whl", hash = "sha256:ac52c4549062771db5694346c1547334cf1bb0d08573a193c8dcec8386aa491d"}, - {file = "azure_cognitiveservices_speech-1.28.0-py3-none-win_amd64.whl", hash = "sha256:5ff042d81d7ff4e50be196419fcd2042e41a97cebb229e0940026e1314ff7751"}, -] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, ] [[package]] name = "black" -version = "23.3.0" +version = "23.12.1" description = "The uncompromising code formatter." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, + {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, + {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, + {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, + {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, ] [package.dependencies] @@ -311,109 +234,85 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "cachetools" -version = "5.3.1" -description = "Extensible memoizing collections and decorators" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, -] - [[package]] name = "certifi" -version = "2023.5.7" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -421,99 +320,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.1.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -523,7 +435,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -533,41 +444,23 @@ files = [ [[package]] name = "dataclasses-json" -version = "0.5.7" -description = "Easily serialize dataclasses to and from JSON" -category = "main" +version = "0.5.14" +description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7,<3.13" files = [ - {file = "dataclasses-json-0.5.7.tar.gz", hash = "sha256:c2c11bc8214fbf709ffc369d11446ff6945254a7f09128154a7620613d8fda90"}, - {file = "dataclasses_json-0.5.7-py3-none-any.whl", hash = "sha256:bc285b5f892094c3a53d558858a88553dd6a61a11ab1a8128a0e554385dcc5dd"}, + {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, + {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, ] [package.dependencies] -marshmallow = ">=3.3.0,<4.0.0" -marshmallow-enum = ">=1.5.1,<2.0.0" -typing-inspect = ">=0.4.0" - -[package.extras] -dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=6.2.3)", "simplejson", "types-dataclasses"] - -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" [[package]] name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -582,426 +475,250 @@ wrapt = ">=1.10,<2" dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] -name = "elevenlabs" -version = "0.2.16" -description = "The official elevenlabs python package." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "elevenlabs-0.2.16-py3-none-any.whl", hash = "sha256:88862cd66d3aac805c3c55d15bd1c0f7b54a7407a677db5acf88417f9d7eaa2c"}, - {file = "elevenlabs-0.2.16.tar.gz", hash = "sha256:6c8967e0c95e5ade579a8c69c034811fcbbe479bced22dbbc32e215c0a74e188"}, -] - -[package.dependencies] -ipython = ">=7.0" -pydantic = ">=1.10" -requests = ">=2.20" - -[[package]] -name = "executing" +name = "exceptiongroup" version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -category = "main" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.95.2" +version = "0.100.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, - {file = "fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, ] [package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" [package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] [[package]] -name = "frozenlist" -version = "1.3.3" -description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, -] - -[[package]] -name = "google-api-core" -version = "2.11.0" -description = "Google API client core library" -category = "main" +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.11.0.tar.gz", hash = "sha256:4b9bb5d5a380a0befa0573b302651b8a9a89262c1730e37bf423cec511804c22"}, - {file = "google_api_core-2.11.0-py3-none-any.whl", hash = "sha256:ce222e27b0de0d7bc63eb043b956996d6dccab14cc3b690aaea91c9cc99dc16e"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0dev" -googleapis-common-protos = ">=1.56.2,<2.0dev" -grpcio = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -grpcio-status = [ - {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0dev)", "grpcio-status (>=1.49.1,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] - -[[package]] -name = "google-auth" -version = "2.19.0" -description = "Google Authentication Library" -category = "main" -optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "google-auth-2.19.0.tar.gz", hash = "sha256:f39d528077ac540793dd3c22a8706178f157642a67d874db25c640b7fead277e"}, - {file = "google_auth-2.19.0-py2.py3-none-any.whl", hash = "sha256:be617bfaf77774008e9d177573f782e109188c8a64ae6e744285df5cea3e7df6"}, + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, ] -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" - [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-speech" -version = "2.19.0" -description = "Google Cloud Speech API client library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-speech-2.19.0.tar.gz", hash = "sha256:fa4e5ec478c9b7d6d275b7955a04d6c7e21a625279e49ad3574c287e85560a95"}, - {file = "google_cloud_speech-2.19.0-py2.py3-none-any.whl", hash = "sha256:deb43b6a56512daf2cdcbd525fbe836540b58cbb1e1d0cd4b126ef19a802b114"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} -proto-plus = {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] -name = "google-cloud-texttospeech" -version = "2.14.1" -description = "Google Cloud Texttospeech API client library" -category = "main" +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "google-cloud-texttospeech-2.14.1.tar.gz", hash = "sha256:dd716f2a768ad67502cfd99b9925c51ffd6e16be93b410abeeffdaac190bfe81"}, - {file = "google_cloud_texttospeech-2.14.1-py2.py3-none-any.whl", hash = "sha256:883fe35e3c823ff77cc633b30ab9a93d3b5eb38ebce7eaeef6f87e8d03210e54"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.0 || >=2.11.0,<3.0.0dev", extras = ["grpc"]} -proto-plus = {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - -[[package]] -name = "googleapis-common-protos" -version = "1.59.0" -description = "Common protobufs used in Google APIs" -category = "main" + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "googleapis-common-protos-1.59.0.tar.gz", hash = "sha256:4168fcb568a826a52f23510412da405abd93f4d23ba544bb68d943b14ba3cb44"}, - {file = "googleapis_common_protos-1.59.0-py2.py3-none-any.whl", hash = "sha256:b287dc48449d1d41af0c69f4ea26242b5ae4c3d7249a38b0984c86a4caffff1f"}, + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, ] -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0dev" - [package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +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)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "grpcio" -version = "1.54.2" -description = "HTTP/2-based RPC framework" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.54.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:40e1cbf69d6741b40f750f3cccc64326f927ac6145a9914d33879e586002350c"}, - {file = "grpcio-1.54.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2288d76e4d4aa7ef3fe7a73c1c470b66ea68e7969930e746a8cd8eca6ef2a2ea"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c0e3155fc5335ec7b3b70f15230234e529ca3607b20a562b6c75fb1b1218874c"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bf88004fe086c786dc56ef8dd6cb49c026833fdd6f42cb853008bce3f907148"}, - {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be88c081e33f20630ac3343d8ad9f1125f32987968e9c8c75c051c9800896e8"}, - {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:33d40954199bddbb6a78f8f6f2b2082660f381cd2583ec860a6c2fa7c8400c08"}, - {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b52d00d1793d290c81ad6a27058f5224a7d5f527867e5b580742e1bd211afeee"}, - {file = "grpcio-1.54.2-cp310-cp310-win32.whl", hash = "sha256:881d058c5ccbea7cc2c92085a11947b572498a27ef37d3eef4887f499054dca8"}, - {file = "grpcio-1.54.2-cp310-cp310-win_amd64.whl", hash = "sha256:0212e2f7fdf7592e4b9d365087da30cb4d71e16a6f213120c89b4f8fb35a3ab3"}, - {file = "grpcio-1.54.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:1e623e0cf99a0ac114f091b3083a1848dbc64b0b99e181473b5a4a68d4f6f821"}, - {file = "grpcio-1.54.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:66233ccd2a9371158d96e05d082043d47dadb18cbb294dc5accfdafc2e6b02a7"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4cb283f630624ebb16c834e5ac3d7880831b07cbe76cb08ab7a271eeaeb8943e"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a1e601ee31ef30a9e2c601d0867e236ac54c922d32ed9f727b70dd5d82600d5"}, - {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8da84bbc61a4e92af54dc96344f328e5822d574f767e9b08e1602bb5ddc254a"}, - {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5008964885e8d23313c8e5ea0d44433be9bfd7e24482574e8cc43c02c02fc796"}, - {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2f5a1f1080ccdc7cbaf1171b2cf384d852496fe81ddedeb882d42b85727f610"}, - {file = "grpcio-1.54.2-cp311-cp311-win32.whl", hash = "sha256:b74ae837368cfffeb3f6b498688a123e6b960951be4dec0e869de77e7fa0439e"}, - {file = "grpcio-1.54.2-cp311-cp311-win_amd64.whl", hash = "sha256:8cdbcbd687e576d48f7886157c95052825ca9948c0ed2afdc0134305067be88b"}, - {file = "grpcio-1.54.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:782f4f8662a2157c4190d0f99eaaebc602899e84fb1e562a944e5025929e351c"}, - {file = "grpcio-1.54.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:714242ad0afa63a2e6dabd522ae22e1d76e07060b5af2ddda5474ba4f14c2c94"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f900ed4ad7a0f1f05d35f955e0943944d5a75f607a836958c6b8ab2a81730ef2"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96a41817d2c763b1d0b32675abeb9179aa2371c72aefdf74b2d2b99a1b92417b"}, - {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70fcac7b94f4c904152809a050164650ac81c08e62c27aa9f156ac518029ebbe"}, - {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fd6c6c29717724acf9fc1847c4515d57e4dc12762452457b9cb37461f30a81bb"}, - {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c2392f5b5d84b71d853918687d806c1aa4308109e5ca158a16e16a6be71041eb"}, - {file = "grpcio-1.54.2-cp37-cp37m-win_amd64.whl", hash = "sha256:51630c92591d6d3fe488a7c706bd30a61594d144bac7dee20c8e1ce78294f474"}, - {file = "grpcio-1.54.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:b04202453941a63b36876a7172b45366dc0cde10d5fd7855c0f4a4e673c0357a"}, - {file = "grpcio-1.54.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:89dde0ac72a858a44a2feb8e43dc68c0c66f7857a23f806e81e1b7cc7044c9cf"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:09d4bfd84686cd36fd11fd45a0732c7628308d094b14d28ea74a81db0bce2ed3"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fc2b4edb938c8faa4b3c3ea90ca0dd89b7565a049e8e4e11b77e60e4ed2cc05"}, - {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f7203e2767800edee7a1e1040aaaf124a35ce0c7fe0883965c6b762defe598"}, - {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e416c8baf925b5a1aff31f7f5aecc0060b25d50cce3a5a7255dc5cf2f1d4e5eb"}, - {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dc80c9c6b608bf98066a038e0172013a49cfa9a08d53335aefefda2c64fc68f4"}, - {file = "grpcio-1.54.2-cp38-cp38-win32.whl", hash = "sha256:8d6192c37a30a115f4663592861f50e130caed33efc4eec24d92ec881c92d771"}, - {file = "grpcio-1.54.2-cp38-cp38-win_amd64.whl", hash = "sha256:46a057329938b08e5f0e12ea3d7aed3ecb20a0c34c4a324ef34e00cecdb88a12"}, - {file = "grpcio-1.54.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:2296356b5c9605b73ed6a52660b538787094dae13786ba53080595d52df13a98"}, - {file = "grpcio-1.54.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:c72956972e4b508dd39fdc7646637a791a9665b478e768ffa5f4fe42123d5de1"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:9bdbb7624d65dc0ed2ed8e954e79ab1724526f09b1efa88dcd9a1815bf28be5f"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c44e1a765b31e175c391f22e8fc73b2a2ece0e5e6ff042743d8109b5d2eff9f"}, - {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cc928cfe6c360c1df636cf7991ab96f059666ac7b40b75a769410cc6217df9c"}, - {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a08920fa1a97d4b8ee5db2f31195de4a9def1a91bc003544eb3c9e6b8977960a"}, - {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4864f99aac207e3e45c5e26c6cbb0ad82917869abc2f156283be86c05286485c"}, - {file = "grpcio-1.54.2-cp39-cp39-win32.whl", hash = "sha256:b38b3de8cff5bc70f8f9c615f51b48eff7313fc9aca354f09f81b73036e7ddfa"}, - {file = "grpcio-1.54.2-cp39-cp39-win_amd64.whl", hash = "sha256:be48496b0e00460717225e7680de57c38be1d8629dc09dadcd1b3389d70d942b"}, - {file = "grpcio-1.54.2.tar.gz", hash = "sha256:50a9f075eeda5097aa9a182bb3877fe1272875e45370368ac0ee16ab9e22d019"}, + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.54.2)"] - -[[package]] -name = "grpcio-status" -version = "1.54.2" -description = "Status proto mapping for gRPC" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.54.2.tar.gz", hash = "sha256:3255cbec5b7c706caa3d4dd584606c080e6415e15631bb2f6215e2b70055836d"}, - {file = "grpcio_status-1.54.2-py3-none-any.whl", hash = "sha256:2a7cb4838225f1b53bd0448a3008c5b5837941e1f3a0b13fa38768f08a7b68c2"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.54.2" -protobuf = ">=4.21.6" - -[[package]] -name = "gtts" -version = "2.3.2" -description = "gTTS (Google Text-to-Speech), a Python library and CLI tool to interface with Google Translate text-to-speech API" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "gTTS-2.3.2-py3-none-any.whl", hash = "sha256:9132e409603f34d5023458e3e10ce2f5df55498d7a2ee781c9adbe616fbd4152"}, - {file = "gTTS-2.3.2.tar.gz", hash = "sha256:5314f7dedb4230889ff4773edd37e101408497e166982027b8d9582a4585eb4f"}, -] - -[package.dependencies] -click = ">=7.1,<8.2" -requests = ">=2.27,<3" - -[package.extras] -docs = ["sphinx", "sphinx-autobuild", "sphinx-click", "sphinx-mdinclude", "sphinx-rtd-theme"] -tests = ["pytest (>=7.1.3,<7.2.0)", "pytest-cov", "testfixtures"] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1011,126 +728,115 @@ files = [ [[package]] name = "httpcore" -version = "0.17.2" +version = "1.0.2" description = "A minimal low-level HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.2-py3-none-any.whl", hash = "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36"}, - {file = "httpcore-0.17.2.tar.gz", hash = "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af"}, + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.25.2" description = "The next generation HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"}, + {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.20.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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, + {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, +] + +[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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +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.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.0.1" +version = "6.11.0" description = "Read metadata from Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.0.1-py3-none-any.whl", hash = "sha256:1543daade821c89b1c4a55986c326f36e54f2e6ca3bad96be4563d0acb74dcd4"}, - {file = "importlib_metadata-6.0.1.tar.gz", hash = "sha256:950127d57e35a806d520817d3e92eec3f19fdae9f0cd99da77a407c5aabefba3"}, + {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, + {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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 = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "ipython" -version = "8.13.2" -description = "IPython: Productive Interactive Computing" -category = "main" -optional = false -python-versions = ">=3.9" -files = [ - {file = "ipython-8.13.2-py3-none-any.whl", hash = "sha256:ffca270240fbd21b06b2974e14a86494d6d29290184e788275f55e0b55914926"}, - {file = "ipython-8.13.2.tar.gz", hash = "sha256:7dff3fad32b97f6488e02f87b970f309d082f758d7b7fc252e3b19ee0e432dbb"}, -] - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +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 = "janus" version = "1.0.0" description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1141,36 +847,15 @@ files = [ [package.dependencies] typing-extensions = ">=3.7.4.3" -[[package]] -name = "jedi" -version = "0.18.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, -] - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -1181,166 +866,225 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.2.0" +version = "1.3.2" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] name = "langchain" -version = "0.0.149" +version = "0.0.198" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ - {file = "langchain-0.0.149-py3-none-any.whl", hash = "sha256:32ee8c37365ac6a2a109181a9f56d603ba03fa1f711a450a0996e654b82ae0dc"}, - {file = "langchain-0.0.149.tar.gz", hash = "sha256:81d609d452bb56273cd4dab5abb62c268f4d4102daffcac4a3fb8ac5b8f9a2da"}, + {file = "langchain-0.0.198-py3-none-any.whl", hash = "sha256:9d8e57ec25901989339ffac2ea7e759333d084100c90526e8ad57fb61b2003c9"}, + {file = "langchain-0.0.198.tar.gz", hash = "sha256:656385c23aeec1f8f4efbce598f729c817c60eb3f7c9fd77c03a8d28e7d0fa81"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} dataclasses-json = ">=0.5.7,<0.6.0" +langchainplus-sdk = ">=0.0.7" numexpr = ">=2.8.4,<3.0.0" numpy = ">=1,<2" openapi-schema-pydantic = ">=1.2,<2.0" pydantic = ">=1,<2" PyYAML = ">=5.4.1" requests = ">=2,<3" -SQLAlchemy = ">1.3,<3" +SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -tqdm = ">=4.48.0" [package.extras] -all = ["aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "manifest-ml (>=0.0.1,<0.0.2)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "opensearch-py (>=2.0.0,<3.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "sentence-transformers (>=2,<3)", "spacy (>=3,<4)", "tensorflow-text (>=2.11.0,<3.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] -azure = ["azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "openai (>=0,<1)"] +all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.2,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.6.1,<0.7.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] cohere = ["cohere (>=3,<4)"] +docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (>=0,<1)"] +extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] +llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchainplus-sdk" +version = "0.0.20" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchainplus_sdk-0.0.20-py3-none-any.whl", hash = "sha256:07a869d476755803aa04c4986ce78d00c2fe4ff584c0eaa57d7570c9664188db"}, + {file = "langchainplus_sdk-0.0.20.tar.gz", hash = "sha256:3d300e2e3290f68cc9d842c059f9458deba60e776c9e790309688cad1bfbb219"}, +] + +[package.dependencies] +pydantic = ">=1,<2" +requests = ">=2,<3" +tenacity = ">=8.1.0,<9.0.0" [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "marshmallow" -version = "3.19.0" +version = "3.20.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, - {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] -name = "marshmallow-enum" -version = "1.5.1" -description = "Enum field for Marshmallow" -category = "main" +name = "miniaudio" +version = "1.59" +description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" optional = false python-versions = "*" files = [ - {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, - {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, -] - -[package.dependencies] -marshmallow = ">=2.0.0" - -[[package]] -name = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, + {file = "miniaudio-1.59-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba6f802376f49977e9698740411db46092ea005894ff86d805aeddde7e505c1e"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f24b44bd28ca631b830bc91bd910cb0209fba005401effa64cee9a8ba580992"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8980dda51e92ea750ca8bcfb1d2c198eca7e4c844ab857faac12e20245322aa6"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e21f56d51c627cef612d1a7bbc73fc7c5e03908f5ebc22c98494951ab8ccd3c8"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f6f1665ce8ed46caac48beec64c70e248a0b4e001590c698695cd22c1f634a0"}, + {file = "miniaudio-1.59-cp310-cp310-win32.whl", hash = "sha256:799b393adce56c8df1df16e7dc692a83125888df9ecf8ec0242c4905df6275ef"}, + {file = "miniaudio-1.59-cp310-cp310-win_amd64.whl", hash = "sha256:44c6b48f01d934784da282f7a17c40be9110ee6bc723f5f90916d2b2e729c9cc"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a9387e85e6a63d66a873f4208fbaba93179d11423da08dc83c78dd1b68ba504"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12fbbe3934856ab54fa8889ab6ec6b62a97faa2f85a8830e286fe5a4e9584ca4"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4a9a1dc4352af4198f6ca0c20bac8b5b6a89d0d67e3535149ef08420a1ab3c9"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eb9eac3f23fd4c94925830fa9c172e98aebfb12cec1dbfa6a7693b9e4c1e555"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:52882c36126c3a97fcdd8d753e4b1b07934bba9d4d3c431aa7f4914849090cac"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6bb6deee6d5969292d22730d31ee85ed0edc2997ca79978db0cca269ab73761"}, + {file = "miniaudio-1.59-cp311-cp311-win32.whl", hash = "sha256:6afe7449d7d593ba3f8bd91085a392d0c6ca3be4c03b62af37cb46f6c0c0d9f4"}, + {file = "miniaudio-1.59-cp311-cp311-win_amd64.whl", hash = "sha256:a22832e449a31620317ae657f7fd20a42466e5768c48373f8f28c53f2b36f5cd"}, + {file = "miniaudio-1.59-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbfb3c853641c8bd835e0654f49fe0c09b4018b1ecc7e4c2436e02fbaf748c4b"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45ce3596c693053a578db725848a90ba0dfcc03d1d94124b9fddaa9e50a7533e"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d07228047352b655a82711704a635eee41eb3977ceaaf672ee17d64a3ba261b7"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:586f95f1d10f5d4f58b272c15c601c3ba13128bd34a839bce5bd28a839d5cf3c"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7644f19b1dc00bca3ec9e6066eb8879c0e638091955092a1d7085a38d7de6e0f"}, + {file = "miniaudio-1.59-cp37-cp37m-win32.whl", hash = "sha256:055fb3a2e00ddcce2a2809cd2a3d5e68234588a00c70533fa4b68f0178829dce"}, + {file = "miniaudio-1.59-cp37-cp37m-win_amd64.whl", hash = "sha256:e1acea13830a53c026e58d44856ba4951a26eb0d0a2fda2ce6dc7280b6f57f81"}, + {file = "miniaudio-1.59-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8b6f1d4a2551061721cc7b22fb0eb3839aad9137553e01b4dde1a31c91ca45"}, + {file = "miniaudio-1.59-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:011b2b8d5c57a485a6b86476e24c1c6be4a61ec8c33c456e3052929269857d0d"}, + {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b270e9e1df5ec05d03659febffaa704709d7c9cb0b3597cb0a993875d73be84"}, + {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab9d0468790109bafc88ce9d1c93454b2d384af0c14a6657620315115390c8d"}, + {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0f0ffa87bef0b3bf932eff60aec97ac90e2adf7373e9170969c6f98ba1c5635"}, + {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1a03e514b12ba5d93fe48470ddc6a7f4025cd8de5f604233fc899507e5a054c1"}, + {file = "miniaudio-1.59-cp38-cp38-win32.whl", hash = "sha256:19c6406342989a6774305cd214314028553cbb9fcbc5ed43ab17a7f6b43aa46b"}, + {file = "miniaudio-1.59-cp38-cp38-win_amd64.whl", hash = "sha256:239bd4ff17aa7eede52b30a2153a28fe0bf2891aa43617a10348dd90f20d727e"}, + {file = "miniaudio-1.59-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88930514e6a9a6258d3536638da5ceb3aaa1d6643122e0704db7fd08ff924368"}, + {file = "miniaudio-1.59-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6d195800a6162464731ba484580cdab3be5bcc47a366c8440be6015f16d059b1"}, + {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fcd4484eea26629eb9602ebcab0181f515881e736deccb235c2c0d99d7b4215"}, + {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa0ff716a9eb79799ed623f619ed6b0bc1669046cd1f2070de20d3dc6737a822"}, + {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:878623ffa77c366c76c4202d3095835943bd8f8f604bbdc1872030d646817e4a"}, + {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aca5d9e9774ddbad5c4a5c65dfb1e7fba9e4570092ba6891f439f7c849d21ed"}, + {file = "miniaudio-1.59-cp39-cp39-win32.whl", hash = "sha256:0e05f09d58ed32e7cdc1bad9342155b81e378ff2101242cf8a8f06cd56dae043"}, + {file = "miniaudio-1.59-cp39-cp39-win_amd64.whl", hash = "sha256:0e51899a148b393e84ee3a201a72c8fa4d19413f5b1b705ff5ae9f8eee956a7a"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:07de990f047e693681f15736be2e169e3f53064d1e6a7d0c37837297fa18929c"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03beea7dabeb2be1a0a4718458e0b85e3c23692563b0f8841164d71ef2c2eef"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c2cb1fdc92ace828bceabb602b4d2f52040a361632d71b810144656b8334738"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5597384fa7dda1691adca46568ffaabcf39c0a224bf5b9548665a255b86a4f35"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d253c994a27062788f60a8fb1f8571320b72ddc44fd4128fdd85634cf38717a4"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb71fb5d5491335fc565c157a01a8c6907180e113c3c0d9a6c22e28458be5919"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21569111381b877d5445c917b00dfe038b434cb9dacaa4c548ca8c6b5e6d5b55"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8686712f90189eaa6f9fc3eb503eb3487b09ca52417690fd14ac53306d55a125"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4674c49ee2489595f65a8cdc1c48a3e8bc0f577b1eb957d918a942b88480e5a8"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa69c55197215dabf85bc8f9f9d7128af08db402f12aea962e16bad1ac4dca8"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2668b03594612dacea4521483e38da56b51ce8a92d06106643f520ce092a82"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6117c09da1944a59b7af3009d37c8eb6e0219174f5e00501b797687ddbe9c5a3"}, + {file = "miniaudio-1.59.tar.gz", hash = "sha256:2b68f496a8655497cde827c77aba3c3557f0f2bb7c38a6ecab34090ab4556277"}, ] [package.dependencies] -traitlets = "*" +cffi = ">=1.12.0" [[package]] name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1422,55 +1166,55 @@ files = [ [[package]] name = "mypy" -version = "1.3.0" +version = "1.8.0" description = "Optional static typing for Python" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"}, - {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"}, - {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"}, - {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"}, - {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"}, - {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"}, - {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"}, - {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"}, - {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"}, - {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"}, - {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"}, - {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"}, - {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"}, - {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"}, - {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"}, - {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"}, - {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"}, - {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"}, - {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"}, - {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"}, - {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"}, - {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"}, - {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"}, - {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"}, - {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"}, - {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" -typing-extensions = ">=3.10" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] -python2 = ["typed-ast (>=1.4.0,<2)"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1482,7 +1226,6 @@ files = [ name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1506,42 +1249,40 @@ twitter = ["twython"] [[package]] name = "numexpr" -version = "2.8.4" +version = "2.8.8" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "numexpr-2.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a75967d46b6bd56455dd32da6285e5ffabe155d0ee61eef685bbfb8dafb2e484"}, - {file = "numexpr-2.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db93cf1842f068247de631bfc8af20118bf1f9447cd929b531595a5e0efc9346"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bca95f4473b444428061d4cda8e59ac564dc7dc6a1dea3015af9805c6bc2946"}, - {file = "numexpr-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e34931089a6bafc77aaae21f37ad6594b98aa1085bb8b45d5b3cd038c3c17d9"}, - {file = "numexpr-2.8.4-cp310-cp310-win32.whl", hash = "sha256:f3a920bfac2645017110b87ddbe364c9c7a742870a4d2f6120b8786c25dc6db3"}, - {file = "numexpr-2.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:6931b1e9d4f629f43c14b21d44f3f77997298bea43790cfcdb4dd98804f90783"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9400781553541f414f82eac056f2b4c965373650df9694286b9bd7e8d413f8d8"}, - {file = "numexpr-2.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ee9db7598dd4001138b482342b96d78110dd77cefc051ec75af3295604dde6a"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff5835e8af9a212e8480003d731aad1727aaea909926fd009e8ae6a1cba7f141"}, - {file = "numexpr-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655d84eb09adfee3c09ecf4a89a512225da153fdb7de13c447404b7d0523a9a7"}, - {file = "numexpr-2.8.4-cp311-cp311-win32.whl", hash = "sha256:5538b30199bfc68886d2be18fcef3abd11d9271767a7a69ff3688defe782800a"}, - {file = "numexpr-2.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:3f039321d1c17962c33079987b675fb251b273dbec0f51aac0934e932446ccc3"}, - {file = "numexpr-2.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c867cc36cf815a3ec9122029874e00d8fbcef65035c4a5901e9b120dd5d626a2"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:059546e8f6283ccdb47c683101a890844f667fa6d56258d48ae2ecf1b3875957"}, - {file = "numexpr-2.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:845a6aa0ed3e2a53239b89c1ebfa8cf052d3cc6e053c72805e8153300078c0b1"}, - {file = "numexpr-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:a38664e699526cb1687aefd9069e2b5b9387da7feac4545de446141f1ef86f46"}, - {file = "numexpr-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaec59e9bf70ff05615c34a8b8d6c7bd042bd9f55465d7b495ea5436f45319d0"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b318541bf3d8326682ebada087ba0050549a16d8b3fa260dd2585d73a83d20a7"}, - {file = "numexpr-2.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b076db98ca65eeaf9bd224576e3ac84c05e451c0bd85b13664b7e5f7b62e2c70"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f12cc851240f7911a47c91aaf223dba753e98e46dff3017282e633602e76a7"}, - {file = "numexpr-2.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c368aa35ae9b18840e78b05f929d3a7b3abccdba9630a878c7db74ca2368339"}, - {file = "numexpr-2.8.4-cp38-cp38-win32.whl", hash = "sha256:b96334fc1748e9ec4f93d5fadb1044089d73fb08208fdb8382ed77c893f0be01"}, - {file = "numexpr-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:a6d2d7740ae83ba5f3531e83afc4b626daa71df1ef903970947903345c37bd03"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:77898fdf3da6bb96aa8a4759a8231d763a75d848b2f2e5c5279dad0b243c8dfe"}, - {file = "numexpr-2.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df35324666b693f13a016bc7957de7cc4d8801b746b81060b671bf78a52b9037"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ac9cfe6d0078c5fc06ba1c1bbd20b8783f28c6f475bbabd3cad53683075cab"}, - {file = "numexpr-2.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3a1f6b24214a1ab826e9c1c99edf1686c8e307547a9aef33910d586f626d01"}, - {file = "numexpr-2.8.4-cp39-cp39-win32.whl", hash = "sha256:7d71add384adc9119568d7e9ffa8a35b195decae81e0abf54a2b7779852f0637"}, - {file = "numexpr-2.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:9f096d707290a6a00b6ffdaf581ee37331109fb7b6c8744e9ded7c779a48e517"}, - {file = "numexpr-2.8.4.tar.gz", hash = "sha256:d5432537418d18691b9115d615d6daa17ee8275baef3edf1afbbf8bc69806147"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, + {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, + {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, + {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, + {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, + {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, + {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, + {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, + {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, + {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, + {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, + {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, + {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, + {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, ] [package.dependencies] @@ -1549,52 +1290,58 @@ numpy = ">=1.13.3" [[package]] name = "numpy" -version = "1.24.3" +version = "1.26.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] name = "openai" -version = "0.27.7" +version = "0.27.10" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.7-py3-none-any.whl", hash = "sha256:788fb7fa85bf7caac6c1ed7eea5984254a1bdaf09ef485acf0e5718c8b2dc25a"}, - {file = "openai-0.27.7.tar.gz", hash = "sha256:bca95fd4c3054ef38924def096396122130454442ec52005915ecf8269626b1d"}, + {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, + {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, ] [package.dependencies] @@ -1604,7 +1351,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -1612,7 +1359,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1625,249 +1371,87 @@ pydantic = ">=1.8.2" [[package]] name = "opentelemetry-api" -version = "1.18.0" +version = "1.22.0" description = "OpenTelemetry Python API" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.18.0-py3-none-any.whl", hash = "sha256:d05bcc94ec239fd76fd90d784c5e3ad081a8a1ac2ffc8a2c83a49ace052d1492"}, - {file = "opentelemetry_api-1.18.0.tar.gz", hash = "sha256:2bbf29739fcef268c419e3bf1735566c2e7f81026c14bcc78b62a0b97f8ecf2f"}, + {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, + {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0.0,<6.1.0" -setuptools = ">=16.0" +importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-sdk" -version = "1.18.0" +version = "1.22.0" description = "OpenTelemetry Python SDK" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.18.0-py3-none-any.whl", hash = "sha256:a097cc1e0db6ff33b4d250a9350dc17975d24a22aa667fca2866e60c51306723"}, - {file = "opentelemetry_sdk-1.18.0.tar.gz", hash = "sha256:cd3230930a2ab288b1df149d261e9cd2bd48dee54ad18465a777831cb6779e90"}, + {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, + {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, ] [package.dependencies] -opentelemetry-api = "1.18.0" -opentelemetry-semantic-conventions = "0.39b0" -setuptools = ">=16.0" +opentelemetry-api = "1.22.0" +opentelemetry-semantic-conventions = "0.43b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.39b0" +version = "0.43b0" description = "OpenTelemetry Semantic Conventions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.39b0-py3-none-any.whl", hash = "sha256:0dd7a9dc0dfde2335f643705bba8f7c44182c797bc208b7601f0b8e8211cfd5c"}, - {file = "opentelemetry_semantic_conventions-0.39b0.tar.gz", hash = "sha256:06a9f198574e0dab6ebc072b59d89092cf9f115638a8a02157586769b6b7a69a"}, + {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, + {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - [[package]] name = "pathspec" -version = "0.11.1" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "main" optional = false -python-versions = "*" -files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "main" -optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "platformdirs" -version = "3.5.1" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, - {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, -] - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.38" -description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, - {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, -] - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "proto-plus" -version = "1.22.2" -description = "Beautiful, Pythonic protocol buffers." -category = "main" optional = false -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.22.2.tar.gz", hash = "sha256:0e8cda3d5a634d9895b75c573c9352c16486cb75deb0e078b5fda34db4243165"}, - {file = "proto_plus-1.22.2-py3-none-any.whl", hash = "sha256:de34e52d6c9c6fcd704192f09767cb561bb4ee64e70eede20b0834d841f0be4d"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "4.23.2" -description = "" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "protobuf-4.23.2-cp310-abi3-win32.whl", hash = "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3"}, - {file = "protobuf-4.23.2-cp310-abi3-win_amd64.whl", hash = "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a"}, - {file = "protobuf-4.23.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e"}, - {file = "protobuf-4.23.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa"}, - {file = "protobuf-4.23.2-cp37-cp37m-win32.whl", hash = "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f"}, - {file = "protobuf-4.23.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea"}, - {file = "protobuf-4.23.2-cp38-cp38-win32.whl", hash = "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e"}, - {file = "protobuf-4.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511"}, - {file = "protobuf-4.23.2-cp39-cp39-win32.whl", hash = "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91"}, - {file = "protobuf-4.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f"}, - {file = "protobuf-4.23.2-py3-none-any.whl", hash = "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f"}, - {file = "protobuf-4.23.2.tar.gz", hash = "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7"}, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -category = "main" -optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] -tests = ["pytest"] - -[[package]] -name = "pyasn1" -version = "0.5.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.3.0" -description = "A collection of ASN.1-based protocols modules" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1877,48 +1461,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.8" +version = "1.10.14" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"}, - {file = "pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"}, - {file = "pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"}, - {file = "pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"}, - {file = "pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"}, - {file = "pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"}, - {file = "pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"}, - {file = "pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"}, - {file = "pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"}, - {file = "pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -1932,7 +1515,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -category = "main" optional = false python-versions = "*" files = [ @@ -1940,44 +1522,10 @@ files = [ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, ] -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pyjwt" -version = "2.7.0" -description = "JSON Web Token implementation in Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.7.0-py3-none-any.whl", hash = "sha256:ba2b425b15ad5ef12f200dc67dd56af4e26de2331f965c5439994dad075876e1"}, - {file = "PyJWT-2.7.0.tar.gz", hash = "sha256:bd6ca4a3c4285c1a2d4349e5a035fdf8fb94e04ccd0fcbe6ba289dae9cc3e074"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "python-multipart" version = "0.0.6" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1990,214 +1538,184 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc [[package]] name = "python-telegram-bot" -version = "20.3" +version = "20.7" description = "We have made you a wrapper you can't refuse" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python-telegram-bot-20.3.tar.gz", hash = "sha256:73e46a534be9d1c790ce8b494765cca18a5c2f3f5b4932d83bcb06bb0051eb4a"}, - {file = "python_telegram_bot-20.3-py3-none-any.whl", hash = "sha256:1185edee387db7b08027e87b67fa9a3cc3263ae5ab5bb55513acd1bca5c3cf4b"}, + {file = "python-telegram-bot-20.7.tar.gz", hash = "sha256:4f146c39de5f5e0b3723c2abedaf78046ebd30a6a49d2281ee4b3af5eb116b68"}, + {file = "python_telegram_bot-20.7-py3-none-any.whl", hash = "sha256:462326c65671c8c39e76c8c96756ee918be6797d225f8db84d2ec0f883383b8c"}, ] [package.dependencies] -httpx = ">=0.24.0,<0.25.0" +httpx = ">=0.25.2,<0.26.0" [package.extras] -all = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.0.0,<1.1.0)", "cachetools (>=5.3.0,<5.4.0)", "cryptography (>=39.0.1)", "httpx[http2]", "httpx[socks]", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] -callback-data = ["cachetools (>=5.3.0,<5.4.0)"] -ext = ["APScheduler (>=3.10.1,<3.11.0)", "aiolimiter (>=1.0.0,<1.1.0)", "cachetools (>=5.3.0,<5.4.0)", "pytz (>=2018.6)", "tornado (>=6.2,<7.0)"] +all = ["APScheduler (>=3.10.4,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.2,<5.4.0)", "cryptography (>=39.0.1)", "httpx[http2]", "httpx[socks]", "pytz (>=2018.6)", "tornado (>=6.3.3,<6.4.0)"] +callback-data = ["cachetools (>=5.3.2,<5.4.0)"] +ext = ["APScheduler (>=3.10.4,<3.11.0)", "aiolimiter (>=1.1.0,<1.2.0)", "cachetools (>=5.3.2,<5.4.0)", "pytz (>=2018.6)", "tornado (>=6.3.3,<6.4.0)"] http2 = ["httpx[http2]"] -job-queue = ["APScheduler (>=3.10.1,<3.11.0)", "pytz (>=2018.6)"] +job-queue = ["APScheduler (>=3.10.4,<3.11.0)", "pytz (>=2018.6)"] passport = ["cryptography (>=39.0.1)"] -rate-limiter = ["aiolimiter (>=1.0.0,<1.1.0)"] +rate-limiter = ["aiolimiter (>=1.1.0,<1.2.0)"] socks = ["httpx[socks]"] -webhooks = ["tornado (>=6.2,<7.0)"] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] +webhooks = ["tornado (>=6.3.3,<6.4.0)"] [[package]] name = "pyyaml" -version = "6.0" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "redis" -version = "4.5.5" -description = "Python client for Redis database and key-value store" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "redis-4.5.5-py3-none-any.whl", hash = "sha256:77929bc7f5dab9adf3acba2d3bb7d7658f1e0c2f1cafe7eb36434e751c471119"}, - {file = "redis-4.5.5.tar.gz", hash = "sha256:dc87a0bdef6c8bfe1ef1e1c40be7034390c2ae02d92dcd0c7ca1729443899880"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] -[package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} - -[package.extras] -hiredis = ["hiredis (>=1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] - [[package]] name = "regex" -version = "2023.5.5" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48c9ec56579d4ba1c88f42302194b8ae2350265cb60c64b7b9a88dcb7fbde309"}, - {file = "regex-2023.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f4541550459c08fdd6f97aa4e24c6f1932eec780d58a2faa2068253df7d6ff"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e22e4460f0245b468ee645156a4f84d0fc35a12d9ba79bd7d79bdcd2f9629d"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b870b6f632fc74941cadc2a0f3064ed8409e6f8ee226cdfd2a85ae50473aa94"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:171c52e320fe29260da550d81c6b99f6f8402450dc7777ef5ced2e848f3b6f8f"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad5524c2aedaf9aa14ef1bc9327f8abd915699dea457d339bebbe2f0d218f86"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a0f874ee8c0bc820e649c900243c6d1e6dc435b81da1492046716f14f1a2a96"}, - {file = "regex-2023.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e645c757183ee0e13f0bbe56508598e2d9cd42b8abc6c0599d53b0d0b8dd1479"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a4c5da39bca4f7979eefcbb36efea04471cd68db2d38fcbb4ee2c6d440699833"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5e3f4468b8c6fd2fd33c218bbd0a1559e6a6fcf185af8bb0cc43f3b5bfb7d636"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:59e4b729eae1a0919f9e4c0fc635fbcc9db59c74ad98d684f4877be3d2607dd6"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ba73a14e9c8f9ac409863543cde3290dba39098fc261f717dc337ea72d3ebad2"}, - {file = "regex-2023.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0bbd5dcb19603ab8d2781fac60114fb89aee8494f4505ae7ad141a3314abb1f9"}, - {file = "regex-2023.5.5-cp310-cp310-win32.whl", hash = "sha256:40005cbd383438aecf715a7b47fe1e3dcbc889a36461ed416bdec07e0ef1db66"}, - {file = "regex-2023.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:59597cd6315d3439ed4b074febe84a439c33928dd34396941b4d377692eca810"}, - {file = "regex-2023.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f08276466fedb9e36e5193a96cb944928301152879ec20c2d723d1031cd4ddd"}, - {file = "regex-2023.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cd46f30e758629c3ee91713529cfbe107ac50d27110fdcc326a42ce2acf4dafc"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2910502f718828cecc8beff004917dcf577fc5f8f5dd40ffb1ea7612124547b"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:445d6f4fc3bd9fc2bf0416164454f90acab8858cd5a041403d7a11e3356980e8"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18196c16a584619c7c1d843497c069955d7629ad4a3fdee240eb347f4a2c9dbe"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33d430a23b661629661f1fe8395be2004006bc792bb9fc7c53911d661b69dd7e"}, - {file = "regex-2023.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a28979cc667e5f82ef433db009184e7ac277844eea0f7f4d254b789517941d"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f764e4dfafa288e2eba21231f455d209f4709436baeebb05bdecfb5d8ddc3d35"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23d86ad2121b3c4fc78c58f95e19173790e22ac05996df69b84e12da5816cb17"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:690a17db524ee6ac4a27efc5406530dd90e7a7a69d8360235323d0e5dafb8f5b"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:1ecf3dcff71f0c0fe3e555201cbe749fa66aae8d18f80d2cc4de8e66df37390a"}, - {file = "regex-2023.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:811040d7f3dd9c55eb0d8b00b5dcb7fd9ae1761c454f444fd9f37fe5ec57143a"}, - {file = "regex-2023.5.5-cp311-cp311-win32.whl", hash = "sha256:c8c143a65ce3ca42e54d8e6fcaf465b6b672ed1c6c90022794a802fb93105d22"}, - {file = "regex-2023.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:586a011f77f8a2da4b888774174cd266e69e917a67ba072c7fc0e91878178a80"}, - {file = "regex-2023.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b6365703e8cf1644b82104cdd05270d1a9f043119a168d66c55684b1b557d008"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a56c18f21ac98209da9c54ae3ebb3b6f6e772038681d6cb43b8d53da3b09ee81"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8b942d8b3ce765dbc3b1dad0a944712a89b5de290ce8f72681e22b3c55f3cc8"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:844671c9c1150fcdac46d43198364034b961bd520f2c4fdaabfc7c7d7138a2dd"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2ce65bdeaf0a386bb3b533a28de3994e8e13b464ac15e1e67e4603dd88787fa"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fee0016cc35a8a91e8cc9312ab26a6fe638d484131a7afa79e1ce6165328a135"}, - {file = "regex-2023.5.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:18f05d14f14a812fe9723f13afafefe6b74ca042d99f8884e62dbd34dcccf3e2"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:941b3f1b2392f0bcd6abf1bc7a322787d6db4e7457be6d1ffd3a693426a755f2"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:921473a93bcea4d00295799ab929522fc650e85c6b9f27ae1e6bb32a790ea7d3"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:e2205a81f815b5bb17e46e74cc946c575b484e5f0acfcb805fb252d67e22938d"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:385992d5ecf1a93cb85adff2f73e0402dd9ac29b71b7006d342cc920816e6f32"}, - {file = "regex-2023.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:890a09cb0a62198bff92eda98b2b507305dd3abf974778bae3287f98b48907d3"}, - {file = "regex-2023.5.5-cp36-cp36m-win32.whl", hash = "sha256:821a88b878b6589c5068f4cc2cfeb2c64e343a196bc9d7ac68ea8c2a776acd46"}, - {file = "regex-2023.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:7918a1b83dd70dc04ab5ed24c78ae833ae8ea228cef84e08597c408286edc926"}, - {file = "regex-2023.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:338994d3d4ca4cf12f09822e025731a5bdd3a37aaa571fa52659e85ca793fb67"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a69cf0c00c4d4a929c6c7717fd918414cab0d6132a49a6d8fc3ded1988ed2ea"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f5e06df94fff8c4c85f98c6487f6636848e1dc85ce17ab7d1931df4a081f657"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8906669b03c63266b6a7693d1f487b02647beb12adea20f8840c1a087e2dfb5"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fda3e50abad8d0f48df621cf75adc73c63f7243cbe0e3b2171392b445401550"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ac2b7d341dc1bd102be849d6dd33b09701223a851105b2754339e390be0627a"}, - {file = "regex-2023.5.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fb2b495dd94b02de8215625948132cc2ea360ae84fe6634cd19b6567709c8ae2"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aa7d032c1d84726aa9edeb6accf079b4caa87151ca9fabacef31fa028186c66d"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d45864693351c15531f7e76f545ec35000d50848daa833cead96edae1665559"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21e90a288e6ba4bf44c25c6a946cb9b0f00b73044d74308b5e0afd190338297c"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:10250a093741ec7bf74bcd2039e697f519b028518f605ff2aa7ac1e9c9f97423"}, - {file = "regex-2023.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6b8d0c153f07a953636b9cdb3011b733cadd4178123ef728ccc4d5969e67f3c2"}, - {file = "regex-2023.5.5-cp37-cp37m-win32.whl", hash = "sha256:10374c84ee58c44575b667310d5bbfa89fb2e64e52349720a0182c0017512f6c"}, - {file = "regex-2023.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9b320677521aabf666cdd6e99baee4fb5ac3996349c3b7f8e7c4eee1c00dfe3a"}, - {file = "regex-2023.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:afb1c70ec1e594a547f38ad6bf5e3d60304ce7539e677c1429eebab115bce56e"}, - {file = "regex-2023.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf123225945aa58b3057d0fba67e8061c62d14cc8a4202630f8057df70189051"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99757ad7fe5c8a2bb44829fc57ced11253e10f462233c1255fe03888e06bc19"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a623564d810e7a953ff1357f7799c14bc9beeab699aacc8b7ab7822da1e952b8"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ced02e3bd55e16e89c08bbc8128cff0884d96e7f7a5633d3dc366b6d95fcd1d6"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cbe6b5be3b9b698d8cc4ee4dee7e017ad655e83361cd0ea8e653d65e469468"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a6e4b0e0531223f53bad07ddf733af490ba2b8367f62342b92b39b29f72735a"}, - {file = "regex-2023.5.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e9c4f778514a560a9c9aa8e5538bee759b55f6c1dcd35613ad72523fd9175b8"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:256f7f4c6ba145f62f7a441a003c94b8b1af78cee2cccacfc1e835f93bc09426"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd7b68fd2e79d59d86dcbc1ccd6e2ca09c505343445daaa4e07f43c8a9cc34da"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4a5059bd585e9e9504ef9c07e4bc15b0a621ba20504388875d66b8b30a5c4d18"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:6893544e06bae009916a5658ce7207e26ed17385149f35a3125f5259951f1bbe"}, - {file = "regex-2023.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c64d5abe91a3dfe5ff250c6bb267ef00dbc01501518225b45a5f9def458f31fb"}, - {file = "regex-2023.5.5-cp38-cp38-win32.whl", hash = "sha256:7923470d6056a9590247ff729c05e8e0f06bbd4efa6569c916943cb2d9b68b91"}, - {file = "regex-2023.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:4035d6945cb961c90c3e1c1ca2feb526175bcfed44dfb1cc77db4fdced060d3e"}, - {file = "regex-2023.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:50fd2d9b36938d4dcecbd684777dd12a407add4f9f934f235c66372e630772b0"}, - {file = "regex-2023.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d19e57f888b00cd04fc38f5e18d0efbd91ccba2d45039453ab2236e6eec48d4d"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd966475e963122ee0a7118ec9024388c602d12ac72860f6eea119a3928be053"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db09e6c18977a33fea26fe67b7a842f706c67cf8bda1450974d0ae0dd63570df"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6164d4e2a82f9ebd7752a06bd6c504791bedc6418c0196cd0a23afb7f3e12b2d"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84397d3f750d153ebd7f958efaa92b45fea170200e2df5e0e1fd4d85b7e3f58a"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c3efee9bb53cbe7b285760c81f28ac80dc15fa48b5fe7e58b52752e642553f1"}, - {file = "regex-2023.5.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:144b5b017646b5a9392a5554a1e5db0000ae637be4971c9747566775fc96e1b2"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1189fbbb21e2c117fda5303653b61905aeeeea23de4a94d400b0487eb16d2d60"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f83fe9e10f9d0b6cf580564d4d23845b9d692e4c91bd8be57733958e4c602956"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:72aa4746993a28c841e05889f3f1b1e5d14df8d3daa157d6001a34c98102b393"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:de2f780c3242ea114dd01f84848655356af4dd561501896c751d7b885ea6d3a1"}, - {file = "regex-2023.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:290fd35219486dfbc00b0de72f455ecdd63e59b528991a6aec9fdfc0ce85672e"}, - {file = "regex-2023.5.5-cp39-cp39-win32.whl", hash = "sha256:732176f5427e72fa2325b05c58ad0b45af341c459910d766f814b0584ac1f9ac"}, - {file = "regex-2023.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:1307aa4daa1cbb23823d8238e1f61292fd07e4e5d8d38a6efff00b67a7cdb764"}, - {file = "regex-2023.5.5.tar.gz", hash = "sha256:7d76a8a1fc9da08296462a18f16620ba73bcbf5909e42383b253ef34d9d5141e"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2215,82 +1733,52 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "scipy" -version = "1.10.1" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.12,>=3.8" -files = [ - {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, - {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, - {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, - {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, - {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, - {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, - {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, -] - -[package.dependencies] -numpy = ">=1.19.5,<1.27.0" - -[package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "setuptools" -version = "67.8.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, - {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] +[package.dependencies] +numpy = ">=1.22.4,<1.29.0" + [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2302,7 +1790,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2314,7 +1801,6 @@ files = [ name = "sounddevice" version = "0.4.6" description = "Play and Record Sound with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2333,80 +1819,88 @@ numpy = ["NumPy"] [[package]] name = "speechrecognition" -version = "3.10.0" +version = "3.10.1" description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "SpeechRecognition-3.10.0-py2.py3-none-any.whl", hash = "sha256:7ae9966887d9909ce3e5a0c27ecc3eacfca16fd0c0829f77f552919418e86306"}, - {file = "SpeechRecognition-3.10.0.tar.gz", hash = "sha256:14131155e8a8ba00ead1b7b9b1a2fa71c845e4db5f9a5f66a33a1bd6c55c6c35"}, + {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, + {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, ] [package.dependencies] requests = ">=2.26.0" +typing-extensions = "*" [package.extras] whisper-api = ["openai"] [[package]] name = "sqlalchemy" -version = "2.0.15" +version = "2.0.25" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78303719c6f72af97814b0072ad18bee72e70adca8d95cf8fecd59c5e1ddb040"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9d810b4aacd5ef4e293aa4ea01f19fca53999e9edcfc4a8ef1146238b30bdc28"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fb5d09f1d51480f711b69fe28ad42e4f8b08600a85ab2473baee669e1257800"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b19887c96d405599880da6a7cbdf8545a7e78ec5683e46a43bac8885e32d0f"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6b17cb86908e7f88be14007d6afe7d2ab11966e373044137f96a6a4d83eb21c"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df25052b92bd514357a9b370d74f240db890ea79aaa428fb893520e10ee5bc18"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-win32.whl", hash = "sha256:55ec62ddc0200b4fee94d11abbec7aa25948d5d21cb8df8807f4bdd3c51ba44b"}, - {file = "SQLAlchemy-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:ae1d8deb391ab39cc8f0d5844e588a115ae3717e607d91482023917f920f777f"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4670ce853cb25f72115a1bbe366ae13cf3f28fc5c87222df14f8d3d55d51816e"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cea7c4a3dfc2ca61f88a2b1ddd6b0bfbd116c9b1a361b3b66fd826034b833142"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f5784dfb2d45c19cde03c45c04a54bf47428610106197ed6e6fa79f33bc63d3"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b31ebde27575b3b0708673ec14f0c305c4564d995b545148ab7ac0f4d9b847a"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b42913a0259267e9ee335da0c36498077799e59c5e332d506e72b4f32de781d"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a3f8020e013e9b3b7941dcf20b0fc8f7429daaf7158760846731cbd8caa5e45"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-win32.whl", hash = "sha256:88ab245ed2c96265441ed2818977be28c840cfa5204ba167425d6c26eb67b7e7"}, - {file = "SQLAlchemy-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:5cc48a7fda2b5c5b8860494d6c575db3a101a68416492105fed6591dc8a2728a"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f6fd3c88ea4b170d13527e93be1945e69facd917661d3725a63470eb683fbffe"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e885dacb167077df15af2f9ccdacbd7f5dd0d538a6d74b94074f2cefc7bb589"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:201a99f922ac8c780b3929128fbd9df901418877c70e160e19adb05665e51c31"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e17fdcb8971e77c439113642ca8861f9465e21fc693bd3916654ceef3ac26883"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db269f67ed17b07e80aaa8fba1f650c0d84aa0bdd9d5352e4ac38d5bf47ac568"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-win32.whl", hash = "sha256:994a75b197662e0608b6a76935d7c345f7fd874eac0b7093d561033db61b0e8c"}, - {file = "SQLAlchemy-2.0.15-cp37-cp37m-win_amd64.whl", hash = "sha256:4d61731a35eddb0f667774fe15e5a4831e444d066081d1e809e1b8a0e3f97cae"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7f994a53c0e6b44a2966fd6bfc53e37d34b7dca34e75b6be295de6db598255e"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:79bfe728219239bdc493950ea4a4d15b02138ecb304771f9024d0d6f5f4e3706"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d6320a1d175447dce63618ec997a53836de48ed3b44bbe952f0b4b399b19941"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f80a9c9a9af0e4bd5080cc0955ce70274c28e9b931ad7e0fb07021afcd32af6"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a75fdb9a84072521bb2ebd31eefe1165d4dccea3039dda701a864f4b5daa17f"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:21c89044fc48a25c2184eba332edeffbbf9367913bb065cd31538235d828f06f"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-win32.whl", hash = "sha256:1a0754c2d9f0c7982bec0a31138e495ed1f6b8435d7e677c45be60ec18370acf"}, - {file = "SQLAlchemy-2.0.15-cp38-cp38-win_amd64.whl", hash = "sha256:bc5c2b0da46c26c5f73f700834f871d0723e1e882641932468d56833bab09775"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:670ecf74ee2e70b917028a06446ad26ff9b1195e84b09c3139c215123d57dc30"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d14282bf5b4de87f922db3c70858953fd081ef4f05dba6cca3dd705daffe1cc9"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:256b2b9660e51ad7055a9835b12717416cf7288afcf465107413917b6bb2316f"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810199d1c5b43603a9e815ae9487aef3ab1ade7ed9c0c485e12519358929fbfe"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:536c86ec81ca89291d533ff41a3a05f9e4e88e01906dcee0751fc7082f3e8d6c"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:435f6807fa6a0597d84741470f19db204a7d34625ea121abd63e8d95f673f0c4"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-win32.whl", hash = "sha256:da7381a883aee20b7d2ffda17d909b38134b6a625920e65239a1c681881df800"}, - {file = "SQLAlchemy-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:788d1772fb8dcd12091ca82809eef504ce0f2c423e45284bc351b872966ff554"}, - {file = "SQLAlchemy-2.0.15-py3-none-any.whl", hash = "sha256:933d30273861fe61f014ce2a7e3c364915f5efe9ed250ec1066ca6ea5942c0bd"}, - {file = "SQLAlchemy-2.0.15.tar.gz", hash = "sha256:2e940a8659ef870ae10e0d9e2a6d5aaddf0ff6e91f7d0d7732afc9e8c4be9bbc"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, + {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, + {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -2416,7 +1910,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -2424,34 +1918,14 @@ postgresql-pg8000 = ["pg8000 (>=1.29.1)"] postgresql-psycopg = ["psycopg (>=3.0.7)"] postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" version = "0.27.0" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2461,20 +1935,20 @@ files = [ [package.dependencies] anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -2482,132 +1956,177 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" -category = "main" +version = "0.15.1" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, + {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, + {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, + {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, + {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, + {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, + {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, + {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, + {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, + {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, + {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, + {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, + {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, + {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, ] +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + [package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.9.0" -description = "Traitlets Python configuration system" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - -[[package]] -name = "twilio" -version = "8.2.1" -description = "Twilio API client and TwiML generator" -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "twilio-8.2.1-py2.py3-none-any.whl", hash = "sha256:9c6bbfda1f3196c64258b6661e372c23e2e6a9630c9986f725d16bb4bfe3275f"}, - {file = "twilio-8.2.1.tar.gz", hash = "sha256:66fe6a18199955b8abce2699e533b56f605a22d585c3f0b1820113ec068a0b51"}, -] - -[package.dependencies] -aiohttp = ">=3.8.4" -aiohttp-retry = ">=2.8.3" -PyJWT = ">=2.0.0,<3.0.0" -pytz = "*" -requests = ">=2.0.0" - [[package]] name = "typing-extensions" -version = "4.6.2" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.6.2-py3-none-any.whl", hash = "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98"}, - {file = "typing_extensions-4.6.2.tar.gz", hash = "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -2621,26 +2140,24 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "1.26.16" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" version = "0.21.1" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2657,70 +2174,49 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "vocode" -version = "0.1.110" +version = "0.1.111" description = "The all-in-one voice SDK" -category = "main" optional = false python-versions = ">=3.8.1,<3.12" -files = [] -develop = false +files = [ + {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, + {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, +] [package.dependencies] -aiohttp = "^3.8.4" -anthropic = "^0.2.9" -azure-cognitiveservices-speech = "^1.27.0" -elevenlabs = {version = "^0.2.6", optional = true} -fastapi = "^0.95.1" -google-cloud-speech = {version = "^2.19.0", optional = true} -google-cloud-texttospeech = {version = "^2.14.1", optional = true} -gtts = {version = "^2.3.1", optional = true} -janus = "^1.0.0" -jinja2 = "^3.1.2" -langchain = "^0.0.149" -nltk = "^3.8.1" -openai = "^0.27.4" -opentelemetry-sdk = "^1.17.0" -pydub = "^0.25.1" -python-multipart = "^0.0.6" -redis = {version = "^4.5.4", optional = true} -requests = "^2.28.2" -scipy = "^1.10.1" -six = "^1.16.0" -sounddevice = "^0.4.6" -speechrecognition = "^3.10.0" -twilio = {version = "^8.1.0", optional = true} -uvicorn = "^0.21.1" -websockets = "^11.0.2" +aiohttp = ">=3.8.4,<4.0.0" +anthropic = ">=0.2.9,<0.3.0" +azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" +fastapi = ">=0.100.1,<0.101.0" +janus = ">=1.0.0,<2.0.0" +jinja2 = ">=3.1.2,<4.0.0" +langchain = ">=0.0.198,<0.0.199" +miniaudio = ">=1.59,<2.0" +nltk = ">=3.8.1,<4.0.0" +openai = ">=0.27.8,<0.28.0" +opentelemetry-sdk = ">=1.17.0,<2.0.0" +pydub = ">=0.25.1,<0.26.0" +python-multipart = ">=0.0.6,<0.0.7" +requests = ">=2.28.2,<3.0.0" +scipy = ">=1.10.1,<2.0.0" +six = ">=1.16.0,<2.0.0" +sounddevice = ">=0.4.6,<0.5.0" +speechrecognition = ">=3.10.0,<4.0.0" +uvicorn = ">=0.21.1,<0.22.0" +websockets = ">=11.0.2,<12.0.0" [package.extras] -all = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-speech (>=2.19.0,<3.0.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)", "redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)"] +actions = ["nylas (>=5.14.0,<6.0.0)"] +agents = ["google-cloud-aiplatform (>=1.26.0,<2.0.0)"] +all = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-aiplatform (>=1.26.0,<2.0.0)", "google-cloud-speech (>=2.19.0,<3.0.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)", "nylas (>=5.14.0,<6.0.0)", "redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] synthesizers = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)"] -telephony = ["redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)"] +telephony = ["redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] -[package.source] -type = "git" -url = "https://github.com/vocodedev/vocode-python.git" -reference = "zaptrem/turn-based-improvements" -resolved_reference = "bf67bae6381481e241ff5e2a32a1fb417028a0b3" - -[[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, -] - [[package]] name = "websockets" version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2798,171 +2294,180 @@ files = [ [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +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 = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -2971,21 +2476,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.15.0" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" -python-versions = ">=3.11,<3.12" -content-hash = "7a6aa26cb0711a129adf948412dba88bc928d9558a0d511c1595ff8463a79020" +python-versions = ">=3.9,<3.12" +content-hash = "17d1e63c5d96d74bb668a26a1d951072ba74508acb437dcf6014b5cd5a91d069" diff --git a/apps/telegram_bot/pyproject.toml b/apps/telegram_bot/pyproject.toml index d695588195..296e8a3b46 100644 --- a/apps/telegram_bot/pyproject.toml +++ b/apps/telegram_bot/pyproject.toml @@ -6,11 +6,11 @@ authors = ["Your Name "] readme = "README.md" [tool.poetry.dependencies] -python = ">=3.11,<3.12" +python = ">=3.9,<3.12" python-telegram-bot = "^20.3" mypy = "^1.3.0" black = "^23.3.0" -vocode = {git = "https://github.com/vocodedev/vocode-python.git", rev = "zaptrem/turn-based-improvements", extras=["all"]} +vocode = "0.1.111" [build-system] diff --git a/apps/telephony_app/.env.template b/apps/telephony_app/.env.template index b8595b0634..6e8a420c6f 100644 --- a/apps/telephony_app/.env.template +++ b/apps/telephony_app/.env.template @@ -1,7 +1,22 @@ +# The base URL for the application. This is used in the main.py file. +# If BASE_URL is not set, you need to set the NGROK_AUTH_TOKEN for creating a tunnel to the dev server. +# example: +# BASE_URL=telephony-app.ngrok.io BASE_URL= +# The authentication token for ngrok. This is used in the main.py file for creating a tunnel to the dev server. +# This needs to be set if BASE_URL is not set. +# NGROK_AUTH_TOKEN= + +# The API key for Deepgram. This is used for speech recognition. DEEPGRAM_API_KEY= + +# The API key for OpenAI. This is used for natural language processing tasks. OPENAI_API_KEY= + +# The API key and region for Azure Speech Service, used for speech-to-text services. AZURE_SPEECH_KEY= AZURE_SPEECH_REGION= + +# The account SID and authentication token for Twilio. These are used for making API requests to Twilio. TWILIO_ACCOUNT_SID= TWILIO_AUTH_TOKEN= \ No newline at end of file diff --git a/apps/telephony_app/README.md b/apps/telephony_app/README.md index 3b5f451397..da0d4e6aec 100644 --- a/apps/telephony_app/README.md +++ b/apps/telephony_app/README.md @@ -1,3 +1,3 @@ # Self-hosted Telephony Server -See https://docs.vocode.dev/telephony#self-hosted for setup steps! +See https://docs.vocode.dev/open-source/telephony for setup steps! diff --git a/apps/telephony_app/main.py b/apps/telephony_app/main.py index da4974dd26..d44d46f155 100644 --- a/apps/telephony_app/main.py +++ b/apps/telephony_app/main.py @@ -1,5 +1,9 @@ +# Standard library imports import logging import os +import sys + +# Third-party imports from fastapi import FastAPI from vocode.streaming.models.telephony import TwilioConfig from pyngrok import ngrok @@ -12,14 +16,16 @@ TwilioInboundCallConfig, TelephonyServer, ) +from dotenv import load_dotenv -from speller_agent import SpellerAgentFactory -import sys +# Local application/library specific imports +from speller_agent import ( + SpellerAgentFactory, + SpellerAgentConfig, +) # if running from python, this will load the local .env # docker-compose will load the .env file by itself -from dotenv import load_dotenv - load_dotenv() app = FastAPI(docs_url=None) @@ -28,7 +34,9 @@ logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) -config_manager = RedisConfigManager() +config_manager = RedisConfigManager( + logger=logger, +) BASE_URL = os.getenv("BASE_URL") @@ -56,10 +64,16 @@ prompt_preamble="Have a pleasant conversation about life", generate_responses=True, ), + # uncomment this to use the speller agent instead + # agent_config=SpellerAgentConfig( + # initial_message=BaseMessage(text="im a speller agent, say something to me and ill spell it out for you"), + # generate_responses=False, + # ), twilio_config=TwilioConfig( account_sid=os.environ["TWILIO_ACCOUNT_SID"], auth_token=os.environ["TWILIO_AUTH_TOKEN"], ), + logger=logger, ) ], agent_factory=SpellerAgentFactory(), diff --git a/apps/telephony_app/poetry.lock b/apps/telephony_app/poetry.lock index af1f31a95e..b262a12c26 100644 --- a/apps/telephony_app/poetry.lock +++ b/apps/telephony_app/poetry.lock @@ -1,119 +1,105 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.9.1" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiohttp-retry" version = "2.8.3" description = "Simple retry client for aiohttp" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +114,6 @@ aiohttp = "*" name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -143,7 +128,6 @@ frozenlist = ">=1.1.0" name = "anthropic" version = "0.2.10" description = "Library for accessing the anthropic API" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -162,157 +146,141 @@ dev = ["black (>=22.3.0)", "pytest"] [[package]] name = "anyio" -version = "3.7.1" +version = "4.2.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "azure-cognitiveservices-speech" -version = "1.31.0" +version = "1.34.1" description = "Microsoft Cognitive Services Speech SDK for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, + {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, ] [[package]] name = "certifi" -version = "2023.7.22" +version = "2023.11.17" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -320,99 +288,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -422,7 +403,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -432,55 +412,62 @@ files = [ [[package]] name = "cryptography" -version = "41.0.3" +version = "42.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, - {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, - {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, - {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, + {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77"}, + {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009"}, + {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407"}, + {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa"}, + {file = "cryptography-42.0.1-cp37-abi3-win32.whl", hash = "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453"}, + {file = "cryptography-42.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302"}, + {file = "cryptography-42.0.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca"}, + {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323"}, + {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49"}, + {file = "cryptography-42.0.1-cp39-abi3-win32.whl", hash = "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881"}, + {file = "cryptography-42.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6"}, + {file = "cryptography-42.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f"}, + {file = "cryptography-42.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04"}, + {file = "cryptography-42.0.1.tar.gz", hash = "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" version = "0.5.14" description = "Easily serialize dataclasses to and from JSON." -category = "main" optional = false python-versions = ">=3.7,<3.13" files = [ @@ -496,7 +483,6 @@ typing-inspect = ">=0.4.0,<1" name = "deprecated" version = "1.2.14" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -512,14 +498,13 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.0" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, ] [package.extras] @@ -527,176 +512,235 @@ test = ["pytest (>=6)"] [[package]] name = "fastapi" -version = "0.95.2" +version = "0.100.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.2-py3-none-any.whl", hash = "sha256:d374dbc4ef2ad9b803899bd3360d34c534adc574546e25314ab72c0c4411749f"}, - {file = "fastapi-0.95.2.tar.gz", hash = "sha256:4d9d3e8c71c73f11874bcf5e33626258d143252e329a01002f767306c64fb982"}, + {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, + {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, ] [package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] [package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, ] +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +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)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + [[package]] name = "greenlet" -version = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -706,79 +750,108 @@ files = [ [[package]] name = "httpcore" -version = "0.17.3" +version = "1.0.2" description = "A minimal low-level HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = ">=1.0.0,<2.0.0" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.26.0" description = "The next generation HTTP client." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (>=1.0.0,<2.0.0)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.20.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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, + {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, +] + +[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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "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"] +inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +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.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "6.11.0" description = "Read metadata from Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, + {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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"] @@ -786,7 +859,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs name = "janus" version = "1.0.0" description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -799,14 +871,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -817,21 +888,19 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.1" +version = "1.3.2" description = "Lightweight pipelining with Python functions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, - {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, + {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, + {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, ] [[package]] name = "langchain" version = "0.0.198" description = "Building applications with LLMs through composability" -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -869,7 +938,6 @@ text-helpers = ["chardet (>=5.1.0,<6.0.0)"] name = "langchainplus-sdk" version = "0.0.20" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -category = "main" optional = false python-versions = ">=3.8.1,<4.0" files = [ @@ -884,90 +952,97 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.4" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, + {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, + {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, + {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, + {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, + {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, + {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, + {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, ] [[package]] name = "marshmallow" -version = "3.20.1" +version = "3.20.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, - {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, + {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, + {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["pre-commit (>=2.4,<4.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] name = "miniaudio" version = "1.59" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" -category = "main" optional = false python-versions = "*" files = [ @@ -1032,7 +1107,6 @@ cffi = ">=1.12.0" name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1116,7 +1190,6 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1128,7 +1201,6 @@ files = [ name = "nltk" version = "3.8.1" description = "Natural Language Toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1152,42 +1224,40 @@ twitter = ["twython"] [[package]] name = "numexpr" -version = "2.8.5" +version = "2.8.8" description = "Fast numerical expression evaluator for NumPy" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "numexpr-2.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2"}, - {file = "numexpr-2.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7"}, - {file = "numexpr-2.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68"}, - {file = "numexpr-2.8.5-cp310-cp310-win32.whl", hash = "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0"}, - {file = "numexpr-2.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06"}, - {file = "numexpr-2.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438"}, - {file = "numexpr-2.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb"}, - {file = "numexpr-2.8.5-cp311-cp311-win32.whl", hash = "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0"}, - {file = "numexpr-2.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b"}, - {file = "numexpr-2.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48"}, - {file = "numexpr-2.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a"}, - {file = "numexpr-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f"}, - {file = "numexpr-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e"}, - {file = "numexpr-2.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a"}, - {file = "numexpr-2.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8"}, - {file = "numexpr-2.8.5-cp38-cp38-win32.whl", hash = "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1"}, - {file = "numexpr-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01"}, - {file = "numexpr-2.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465"}, - {file = "numexpr-2.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702"}, - {file = "numexpr-2.8.5-cp39-cp39-win32.whl", hash = "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad"}, - {file = "numexpr-2.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872"}, - {file = "numexpr-2.8.5.tar.gz", hash = "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, + {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, + {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, + {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, + {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, + {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, + {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, + {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, + {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, + {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, + {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, + {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, + {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, + {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, + {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, + {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, + {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, + {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, + {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, + {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, + {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, + {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, ] [package.dependencies] @@ -1195,49 +1265,58 @@ numpy = ">=1.13.3" [[package]] name = "numpy" -version = "1.25.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, - {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, - {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, - {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, - {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, - {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, - {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, - {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, - {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, - {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, - {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, - {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, ] [[package]] name = "openai" -version = "0.27.8" +version = "0.27.10" description = "Python client library for the OpenAI API" -category = "main" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.8-py3-none-any.whl", hash = "sha256:e0a7c2f7da26bdbe5354b03c6d4b82a2f34bd4458c7a17ae1a7092c3e397e03c"}, - {file = "openai-0.27.8.tar.gz", hash = "sha256:2483095c7db1eee274cebac79e315a986c4e55207bb4fa7b82d185b3a2ed9536"}, + {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, + {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, ] [package.dependencies] @@ -1247,7 +1326,7 @@ tqdm = "*" [package.extras] datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (>=6.0.0,<7.0.0)", "pytest-asyncio", "pytest-mock"] +dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] @@ -1255,7 +1334,6 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 name = "openapi-schema-pydantic" version = "1.2.4" description = "OpenAPI (v3) specification schema as pydantic class" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -1268,14 +1346,13 @@ pydantic = ">=1.8.2" [[package]] name = "opentelemetry-api" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python API" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_api-1.19.0-py3-none-any.whl", hash = "sha256:dcd2a0ad34b691964947e1d50f9e8c415c32827a1d87f0459a72deb9afdf5597"}, - {file = "opentelemetry_api-1.19.0.tar.gz", hash = "sha256:db374fb5bea00f3c7aa290f5d94cea50b659e6ea9343384c5f6c2bb5d5e8db65"}, + {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, + {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, ] [package.dependencies] @@ -1284,50 +1361,46 @@ importlib-metadata = ">=6.0,<7.0" [[package]] name = "opentelemetry-sdk" -version = "1.19.0" +version = "1.22.0" description = "OpenTelemetry Python SDK" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_sdk-1.19.0-py3-none-any.whl", hash = "sha256:bb67ad676b1bc671766a40d7fc9d9563854c186fa11f0dc8fa2284e004bd4263"}, - {file = "opentelemetry_sdk-1.19.0.tar.gz", hash = "sha256:765928956262c7a7766eaba27127b543fb40ef710499cad075f261f52163a87f"}, + {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, + {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, ] [package.dependencies] -opentelemetry-api = "1.19.0" -opentelemetry-semantic-conventions = "0.40b0" +opentelemetry-api = "1.22.0" +opentelemetry-semantic-conventions = "0.43b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.40b0" +version = "0.43b0" description = "OpenTelemetry Semantic Conventions" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "opentelemetry_semantic_conventions-0.40b0-py3-none-any.whl", hash = "sha256:7ebbaf86755a0948902e68637e3ae516c50222c30455e55af154ad3ffe283839"}, - {file = "opentelemetry_semantic_conventions-0.40b0.tar.gz", hash = "sha256:5a7a491873b15ab7c4907bbfd8737645cc87ca55a0a326c1755d1b928d8a0fae"}, + {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, + {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, ] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1337,48 +1410,47 @@ files = [ [[package]] name = "pydantic" -version = "1.10.12" +version = "1.10.14" description = "Data validation and settings management using python type hints" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1fcb59f2f355ec350073af41d927bf83a63b50e640f4dbaa01053a28b7a7718"}, - {file = "pydantic-1.10.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b7ccf02d7eb340b216ec33e53a3a629856afe1c6e0ef91d84a4e6f2fb2ca70fe"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fb2aa3ab3728d950bcc885a2e9eff6c8fc40bc0b7bb434e555c215491bcf48b"}, - {file = "pydantic-1.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:771735dc43cf8383959dc9b90aa281f0b6092321ca98677c5fb6125a6f56d58d"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca48477862372ac3770969b9d75f1bf66131d386dba79506c46d75e6b48c1e09"}, - {file = "pydantic-1.10.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5e7add47a5b5a40c49b3036d464e3c7802f8ae0d1e66035ea16aa5b7a3923ed"}, - {file = "pydantic-1.10.12-cp310-cp310-win_amd64.whl", hash = "sha256:e4129b528c6baa99a429f97ce733fff478ec955513630e61b49804b6cf9b224a"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0d191db0f92dfcb1dec210ca244fdae5cbe918c6050b342d619c09d31eea0cc"}, - {file = "pydantic-1.10.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:795e34e6cc065f8f498c89b894a3c6da294a936ee71e644e4bd44de048af1405"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69328e15cfda2c392da4e713443c7dbffa1505bc9d566e71e55abe14c97ddc62"}, - {file = "pydantic-1.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2031de0967c279df0d8a1c72b4ffc411ecd06bac607a212892757db7462fc494"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ba5b2e6fe6ca2b7e013398bc7d7b170e21cce322d266ffcd57cca313e54fb246"}, - {file = "pydantic-1.10.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a7bac939fa326db1ab741c9d7f44c565a1d1e80908b3797f7f81a4f86bc8d33"}, - {file = "pydantic-1.10.12-cp311-cp311-win_amd64.whl", hash = "sha256:87afda5539d5140cb8ba9e8b8c8865cb5b1463924d38490d73d3ccfd80896b3f"}, - {file = "pydantic-1.10.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:549a8e3d81df0a85226963611950b12d2d334f214436a19537b2efed61b7639a"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598da88dfa127b666852bef6d0d796573a8cf5009ffd62104094a4fe39599565"}, - {file = "pydantic-1.10.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba5c4a8552bff16c61882db58544116d021d0b31ee7c66958d14cf386a5b5350"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79e6a11a07da7374f46970410b41d5e266f7f38f6a17a9c4823db80dadf4303"}, - {file = "pydantic-1.10.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab26038b8375581dc832a63c948f261ae0aa21f1d34c1293469f135fa92972a5"}, - {file = "pydantic-1.10.12-cp37-cp37m-win_amd64.whl", hash = "sha256:e0a16d274b588767602b7646fa05af2782576a6cf1022f4ba74cbb4db66f6ca8"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a9dfa722316f4acf4460afdf5d41d5246a80e249c7ff475c43a3a1e9d75cf62"}, - {file = "pydantic-1.10.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a73f489aebd0c2121ed974054cb2759af8a9f747de120acd2c3394cf84176ccb"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b30bcb8cbfccfcf02acb8f1a261143fab622831d9c0989707e0e659f77a18e0"}, - {file = "pydantic-1.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fcfb5296d7877af406ba1547dfde9943b1256d8928732267e2653c26938cd9c"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2f9a6fab5f82ada41d56b0602606a5506aab165ca54e52bc4545028382ef1c5d"}, - {file = "pydantic-1.10.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dea7adcc33d5d105896401a1f37d56b47d443a2b2605ff8a969a0ed5543f7e33"}, - {file = "pydantic-1.10.12-cp38-cp38-win_amd64.whl", hash = "sha256:1eb2085c13bce1612da8537b2d90f549c8cbb05c67e8f22854e201bde5d98a47"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ef6c96b2baa2100ec91a4b428f80d8f28a3c9e53568219b6c298c1125572ebc6"}, - {file = "pydantic-1.10.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c076be61cd0177a8433c0adcb03475baf4ee91edf5a4e550161ad57fc90f523"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5a58feb9a39f481eda4d5ca220aa8b9d4f21a41274760b9bc66bfd72595b86"}, - {file = "pydantic-1.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5f805d2d5d0a41633651a73fa4ecdd0b3d7a49de4ec3fadf062fe16501ddbf1"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1289c180abd4bd4555bb927c42ee42abc3aee02b0fb2d1223fb7c6e5bef87dbe"}, - {file = "pydantic-1.10.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d1197e462e0364906cbc19681605cb7c036f2475c899b6f296104ad42b9f5fb"}, - {file = "pydantic-1.10.12-cp39-cp39-win_amd64.whl", hash = "sha256:fdbdd1d630195689f325c9ef1a12900524dceb503b00a987663ff4f58669b93d"}, - {file = "pydantic-1.10.12-py3-none-any.whl", hash = "sha256:b749a43aa51e32839c9d71dc67eb1e4221bb04af1033a32e3923d46f9effa942"}, - {file = "pydantic-1.10.12.tar.gz", hash = "sha256:0fe8a415cea8f340e7a9af9c54fc71a649b43e8ca3cc732986116b3cb135d303"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, + {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, + {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, + {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, + {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, + {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, + {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, + {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, + {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, + {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, + {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, + {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, + {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, + {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, + {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, + {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, + {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, + {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, + {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, + {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, + {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, + {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, + {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, ] [package.dependencies] @@ -1392,7 +1464,6 @@ email = ["email-validator (>=1.0.3)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -category = "main" optional = false python-versions = "*" files = [ @@ -1404,7 +1475,6 @@ files = [ name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1423,13 +1493,12 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyngrok" -version = "6.0.0" +version = "6.1.2" description = "A Python wrapper for ngrok." -category = "main" optional = false python-versions = ">=3.5" files = [ - {file = "pyngrok-6.0.0.tar.gz", hash = "sha256:dd8a87944b8e28572e3d126bfb2c81a2948594575f5237eefd3651ae0b487155"}, + {file = "pyngrok-6.1.2.tar.gz", hash = "sha256:f5f4f67e79ed050ef2f9ce76b6ea8733b89502aa0b83002cea2ce6b994543622"}, ] [package.dependencies] @@ -1437,14 +1506,13 @@ PyYAML = "*" [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -1454,7 +1522,6 @@ cli = ["click (>=5.0)"] name = "python-multipart" version = "0.0.6" description = "A streaming multipart parser for Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1467,21 +1534,19 @@ dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatc [[package]] name = "pytz" -version = "2023.3" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] [[package]] name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1531,7 +1596,6 @@ files = [ name = "redis" version = "4.6.0" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1548,107 +1612,110 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2023.6.3" +version = "2023.12.25" description = "Alternative regular expression module, to replace re." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, ] [[package]] name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1668,46 +1735,50 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "scipy" -version = "1.11.1" +version = "1.12.0" description = "Fundamental algorithms for scientific computing in Python" -category = "main" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aec8c62fbe52914f9cf28d846cf0401dd80ab80788bbab909434eb336ed07c04"}, - {file = "scipy-1.11.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3b9963798df1d8a52db41a6fc0e6fa65b1c60e85d73da27ae8bb754de4792481"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e8eb42db36526b130dfbc417609498a6192381abc1975b91e3eb238e0b41c1a"}, - {file = "scipy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:366a6a937110d80dca4f63b3f5b00cc89d36f678b2d124a01067b154e692bab1"}, - {file = "scipy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:08d957ca82d3535b3b9ba6c8ff355d78fe975271874e2af267cb5add5bd78625"}, - {file = "scipy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:e866514bc2d660608447b6ba95c8900d591f2865c07cca0aa4f7ff3c4ca70f30"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba94eeef3c9caa4cea7b402a35bb02a5714ee1ee77eb98aca1eed4543beb0f4c"}, - {file = "scipy-1.11.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:512fdc18c65f76dadaca139348e525646d440220d8d05f6d21965b8d4466bccd"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cce154372f0ebe88556ed06d7b196e9c2e0c13080ecb58d0f35062dc7cc28b47"}, - {file = "scipy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4bb943010203465ac81efa392e4645265077b4d9e99b66cf3ed33ae12254173"}, - {file = "scipy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:249cfa465c379c9bb2c20123001e151ff5e29b351cbb7f9c91587260602c58d0"}, - {file = "scipy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffb28e3fa31b9c376d0fb1f74c1f13911c8c154a760312fbee87a21eb21efe31"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:39154437654260a52871dfde852adf1b93b1d1bc5dc0ffa70068f16ec0be2624"}, - {file = "scipy-1.11.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b588311875c58d1acd4ef17c983b9f1ab5391755a47c3d70b6bd503a45bfaf71"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d51565560565a0307ed06fa0ec4c6f21ff094947d4844d6068ed04400c72d0c3"}, - {file = "scipy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a0f322b4eb51b078cb3441e950ad661ede490c3aca66edef66f4b37ab1877"}, - {file = "scipy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:396fae3f8c12ad14c5f3eb40499fd06a6fef8393a6baa352a652ecd51e74e029"}, - {file = "scipy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:be8c962a821957fdde8c4044efdab7a140c13294997a407eaee777acf63cbf0c"}, - {file = "scipy-1.11.1.tar.gz", hash = "sha256:fb5b492fa035334fd249f0973cc79ecad8b09c604b42a127a677b45a9a3d4289"}, +optional = false +python-versions = ">=3.9" +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.22.4,<1.29.0" [package.extras] dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1719,7 +1790,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1731,7 +1801,6 @@ files = [ name = "sounddevice" version = "0.4.6" description = "Play and Record Sound with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1750,80 +1819,88 @@ numpy = ["NumPy"] [[package]] name = "speechrecognition" -version = "3.10.0" +version = "3.10.1" description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "SpeechRecognition-3.10.0-py2.py3-none-any.whl", hash = "sha256:7ae9966887d9909ce3e5a0c27ecc3eacfca16fd0c0829f77f552919418e86306"}, - {file = "SpeechRecognition-3.10.0.tar.gz", hash = "sha256:14131155e8a8ba00ead1b7b9b1a2fa71c845e4db5f9a5f66a33a1bd6c55c6c35"}, + {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, + {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, ] [package.dependencies] requests = ">=2.26.0" +typing-extensions = "*" [package.extras] whisper-api = ["openai"] [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.25" description = "Database Abstraction Library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, + {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, + {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, + {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, + {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, + {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, + {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, + {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, + {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -1833,7 +1910,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -1843,13 +1920,12 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" version = "0.27.0" description = "The little ASGI library that shines." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1866,14 +1942,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -1881,116 +1956,183 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" -category = "main" +version = "0.15.1" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, + {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, + {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, + {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, + {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, + {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, + {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, + {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, + {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, + {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, + {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, + {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, + {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, + {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, + {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, + {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, + {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, + {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, + {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, + {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, + {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, + {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, + {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, + {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, + {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, + {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, + {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, + {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, + {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, + {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, + {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, + {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, + {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, + {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, + {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, + {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, + {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, + {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, + {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, ] +[package.dependencies] +huggingface_hub = ">=0.16.4,<1.0" + [package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] -docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "twilio" -version = "8.5.0" +version = "8.12.0" description = "Twilio API client and TwiML generator" -category = "main" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-8.5.0-py2.py3-none-any.whl", hash = "sha256:a6fdea2252cb7a8a47b5750d58abe1888bba9777482bac8e9bc3be47970facc7"}, - {file = "twilio-8.5.0.tar.gz", hash = "sha256:f55da9b485f9070aef09836e56230d0e6fd83811d2e6668f20d9057dd3668143"}, + {file = "twilio-8.12.0-py2.py3-none-any.whl", hash = "sha256:ccdf78b634dff13fd50b33bafd254a9dc2fb492c6b06839683e73f09ec110ec6"}, + {file = "twilio-8.12.0.tar.gz", hash = "sha256:28e3a743da18d5b298c9b9fb9e922404a60f8091441c5e0aa35bfefc46411370"}, ] [package.dependencies] aiohttp = ">=3.8.4" aiohttp-retry = ">=2.8.3" PyJWT = ">=2.0.0,<3.0.0" -pytz = "*" requests = ">=2.0.0" [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -category = "main" optional = false python-versions = "*" files = [ @@ -2004,19 +2146,17 @@ typing-extensions = ">=3.7.4" [[package]] name = "urllib3" -version = "2.0.4" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, - {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -2024,7 +2164,6 @@ zstd = ["zstandard (>=0.18.0)"] name = "uvicorn" version = "0.21.1" description = "The lightning-fast ASGI server." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2041,21 +2180,20 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [[package]] name = "vocode" -version = "0.1.111a3" +version = "0.1.111" description = "The all-in-one voice SDK" -category = "main" optional = false python-versions = ">=3.8.1,<3.12" files = [ - {file = "vocode-0.1.111a3-py3-none-any.whl", hash = "sha256:714dd891d10d702dba85283272fa22771009670aa1d62ad27ba4c26b2bfdfbd3"}, - {file = "vocode-0.1.111a3.tar.gz", hash = "sha256:e1dd95d1bc1881e39167772a08e3bca586db8ae1346d5f6deb0e00b4499f8a49"}, + {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, + {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, ] [package.dependencies] aiohttp = ">=3.8.4,<4.0.0" anthropic = ">=0.2.9,<0.3.0" azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" -fastapi = ">=0.95.1,<0.96.0" +fastapi = ">=0.100.1,<0.101.0" janus = ">=1.0.0,<2.0.0" jinja2 = ">=3.1.2,<4.0.0" langchain = ">=0.0.198,<0.0.199" @@ -2083,33 +2221,31 @@ transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] [[package]] name = "vonage" -version = "3.7.1" +version = "3.12.0" description = "Vonage Server SDK for Python" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vonage-3.7.1-py2.py3-none-any.whl", hash = "sha256:3939cfcfc95519e456a80c583de82d49bbd528cb2315b61f4144d77d7373ae77"}, - {file = "vonage-3.7.1.tar.gz", hash = "sha256:c3665124a24caf36b0239e6720f989dffd1ab843db8dc93660e3f0a33fd73af8"}, + {file = "vonage-3.12.0-py2.py3-none-any.whl", hash = "sha256:5816909ae6ad76b18e4b33addcff6e8156bab0b8c6a6caf4803c60e7585cadf6"}, + {file = "vonage-3.12.0.tar.gz", hash = "sha256:3034df64e482927be4c9c289dee890b4e578b0057a0055af05a8ca471d143e9c"}, ] [package.dependencies] Deprecated = "*" -pydantic = ">=1.10,<2.0.0" +pydantic = ">=1.10,<2.dev0" pytz = ">=2018.5" requests = ">=2.4.2" -vonage-jwt = ">=1.0.0" +vonage-jwt = ">=1.1.0" [[package]] name = "vonage-jwt" -version = "1.0.0" +version = "1.1.0" description = "A JWT Generator for Python. Creates JWTs for use with Vonage APIs." -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "vonage_jwt-1.0.0-py3-none-any.whl", hash = "sha256:967df0ea98e149cbba2f12dfaee1ba37fcbc7cf6f512523909b71feba1e1ff6c"}, - {file = "vonage_jwt-1.0.0.tar.gz", hash = "sha256:71cb82ea436743dcb26b6934279997314eb041152f07dff654733e6b28efbfd5"}, + {file = "vonage_jwt-1.1.0-py3-none-any.whl", hash = "sha256:f41d2fc51f80cebddff1d65ec2146527ee83ca95f3e8a8fe9cda2263a435e2ed"}, + {file = "vonage_jwt-1.1.0.tar.gz", hash = "sha256:ed6af2bf82dc7cffe42ad453295472b86e02852baaaa3f2b97cd49fcb4e9019d"}, ] [package.dependencies] @@ -2119,7 +2255,6 @@ pyjwt = {version = ">=1.6.4", extras = ["crypto"]} name = "websockets" version = "11.0.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2197,171 +2332,180 @@ files = [ [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +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 = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -2370,21 +2514,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.17.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.12" -content-hash = "e3487825745f7c659eec9e956ff9be846febf8ce79c24dc477ea22424608cb21" +content-hash = "1bed2edebca6168ceb42e5c8bdcb8196d30e29498ca7ea4515f7bcf53ceb926a" diff --git a/apps/telephony_app/pyproject.toml b/apps/telephony_app/pyproject.toml index 39bbe199e9..df7b2c7abc 100644 --- a/apps/telephony_app/pyproject.toml +++ b/apps/telephony_app/pyproject.toml @@ -12,7 +12,7 @@ twilio = "^8.1.0" vonage = "^3.5.1" pyngrok = "^6.0.0" python-dotenv = "^1.0.0" -vocode = "0.1.111a3" +vocode = "0.1.111" [build-system] diff --git a/apps/telephony_app/speller_agent.py b/apps/telephony_app/speller_agent.py index 3782663f6a..19f755a94d 100644 --- a/apps/telephony_app/speller_agent.py +++ b/apps/telephony_app/speller_agent.py @@ -8,32 +8,75 @@ class SpellerAgentConfig(AgentConfig, type="agent_speller"): + """Configuration for SpellerAgent. Inherits from AgentConfig.""" pass - class SpellerAgent(RespondAgent[SpellerAgentConfig]): + """SpellerAgent class. Inherits from RespondAgent. + + This agent takes human input and returns it with spaces between each character. + """ + def __init__(self, agent_config: SpellerAgentConfig): + """Initializes SpellerAgent with the given configuration. + + Args: + agent_config (SpellerAgentConfig): The configuration for this agent. + """ super().__init__(agent_config=agent_config) async def respond( self, - human_input, + human_input: str, conversation_id: str, is_interrupt: bool = False, ) -> Tuple[Optional[str], bool]: + """Generates a response from the SpellerAgent. + + The response is generated by joining each character in the human input with a space. + The second element of the tuple indicates whether the agent should stop (False means it should not stop). + + Args: + human_input (str): The input from the human user. + conversation_id (str): The ID of the conversation. + is_interrupt (bool): A flag indicating whether the agent was interrupted. + + Returns: + Tuple[Optional[str], bool]: The generated response and a flag indicating whether to stop. + """ return "".join(c + " " for c in human_input), False + class SpellerAgentFactory(AgentFactory): + """Factory class for creating agents based on the provided agent configuration.""" + def create_agent( self, agent_config: AgentConfig, logger: Optional[logging.Logger] = None ) -> BaseAgent: + """Creates an agent based on the provided agent configuration. + + Args: + agent_config (AgentConfig): The configuration for the agent to be created. + logger (Optional[logging.Logger]): The logger to be used by the agent. + + Returns: + BaseAgent: The created agent. + + Raises: + Exception: If the agent configuration type is not recognized. + """ + # If the agent configuration type is CHAT_GPT, create a ChatGPTAgent. if agent_config.type == AgentType.CHAT_GPT: return ChatGPTAgent( + # Cast the agent configuration to ChatGPTAgentConfig as we are sure about the type here. agent_config=typing.cast(ChatGPTAgentConfig, agent_config) ) + # If the agent configuration type is agent_speller, create a SpellerAgent. elif agent_config.type == "agent_speller": return SpellerAgent( + # Cast the agent configuration to SpellerAgentConfig as we are sure about the type here. agent_config=typing.cast(SpellerAgentConfig, agent_config) ) + # If the agent configuration type is not recognized, raise an exception. raise Exception("Invalid agent config") diff --git a/apps/voice_rag/.env.template b/apps/voice_rag/.env.template index e49e23b063..f4aec7b67d 100644 --- a/apps/voice_rag/.env.template +++ b/apps/voice_rag/.env.template @@ -1,8 +1,19 @@ -OPENAI_API_KEY= +# The API key for Deepgram. This is used for speech recognition. DEEPGRAM_API_KEY= + +# The API key for OpenAI. This is used as LLM Large Lengual Model. +OPENAI_API_KEY= + +# The API key and region for Azure Speech Service, used for speech-to-text services. AZURE_SPEECH_KEY= AZURE_SPEECH_REGION= +# The API key for Pinecone. This is used for vector database operations. PINECONE_API_KEY= + +# The environment for Pinecone. This is used to specify the environment in which Pinecone operates. PINECONE_ENVIRONMENT= + +# The index name for Pinecone. This is used to specify the index that Pinecone will use for vector operations. +# For example, it could be something like 'index-name-3f5w2y4'. PINECONE_INDEX_NAME= \ No newline at end of file diff --git a/apps/voice_rag/Dockerfile b/apps/voice_rag/Dockerfile index 7a7ad834ab..d6ad000e8a 100644 --- a/apps/voice_rag/Dockerfile +++ b/apps/voice_rag/Dockerfile @@ -45,7 +45,7 @@ LABEL org.label-schema.build-date=$BUILD_DATE \ org.label-schema.description="Vocode Docker Image" \ org.label-schema.url="https://vocode.dev/" \ org.label-schema.vcs-url="https://github.com/vocodedev" \ - org.label-schema.maintainer="vocode@arpagon.co" \ + org.label-schema.maintainer="seb@vocode.dev" \ org.label-schema.vcs-ref=$VCS_REF \ org.label-schema.vendor="Vocode" \ org.label-schema.version=$VERSION diff --git a/apps/voice_rag/environment.docker.yml b/apps/voice_rag/environment.docker.yml index 1a09956027..ee8e821c5e 100644 --- a/apps/voice_rag/environment.docker.yml +++ b/apps/voice_rag/environment.docker.yml @@ -11,7 +11,7 @@ dependencies: - pip - pip: # Installing vocode from the git repository - - git+https://github.com/ArtisanLabs/vocode-python/@461-VectorDB-OpenSource-Documentation#egg=vocode + - git+https://github.com/vocodedev/vocode-python.git#egg=vocode - azure-cognitiveservices-speech==1.31.0 - python-dotenv - ipython diff --git a/apps/voice_rag/manual_pinecone_ingestor.ipynb b/apps/voice_rag/manual_pinecone_ingestor.ipynb index a4a0543b30..58814e8b93 100644 --- a/apps/voice_rag/manual_pinecone_ingestor.ipynb +++ b/apps/voice_rag/manual_pinecone_ingestor.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Colab_Link: https://colab.research.google.com/github/ArtisanLabs/vocode-python/blob/main/apps/rag/manual_pinecone_ingestor.ipynb\n" + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/vocodedev/vocode-python/blob/main/apps/voice_rag/manual_pinecone_ingestor.ipynb)" ] }, { From c4eca7f2f66d181290f2f88fc4ee4b00c2d4ae11 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Tue, 5 Mar 2024 22:59:17 -0500 Subject: [PATCH 059/148] Update user authentication logic (#492) fix 491 --- .github/workflows/stale.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..2e1074b8a0 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,28 @@ +name: "Close stale issues" + +on: + schedule: + - cron: "30 1 * * *" + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-stale: 60 + days-before-close: 7 + stale-issue-label: 'stale' + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' + close-issue-message: 'This issue has been automatically closed due to inactivity. Thank you for your contributions.' + stale-pr-label: 'stale' + stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' + close-pr-message: 'This PR has been automatically closed due to inactivity. Thank you for your contributions.' + exempt-all-pr-milestones: true + enable-statistics: true \ No newline at end of file From 9ef8d7576006f455fdf384038cfc8bd5038708d6 Mon Sep 17 00:00:00 2001 From: Martin Schweiger <34636718+m-ods@users.noreply.github.com> Date: Tue, 19 Mar 2024 08:14:43 +0800 Subject: [PATCH 060/148] implement end of utterance detection for AssemblyAI (#512) * implement end of utterance detection * replace threshold_msg with end_utterance_silence_threshold_msg * implement end of utterance detection with endpointing config * standardise end_utterance_silence_threshold to be in milliseconds * fix error * ensure type safety for endpointing_config attribute access * add imports to fix errors --- vocode/streaming/models/transcriber.py | 1 + .../transcriber/assembly_ai_transcriber.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index b4d1249349..d0391e9fd1 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -130,6 +130,7 @@ class AssemblyAITranscriberConfig( ): buffer_size_seconds: float = 0.1 word_boost: Optional[List[str]] = None + end_utterance_silence_threshold_milliseconds: Optional[int] = None class WhisperCPPTranscriberConfig( diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index a5050fee2d..a1ee818adf 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -8,7 +8,7 @@ from urllib.parse import urlencode from vocode import getenv -from vocode.streaming.models.transcriber import AssemblyAITranscriberConfig +from vocode.streaming.models.transcriber import AssemblyAITranscriberConfig, TimeEndpointingConfig, PunctuationEndpointingConfig from vocode.streaming.models.websocket import AudioMessage from vocode.streaming.transcriber.base_transcriber import ( BaseAsyncTranscriber, @@ -54,12 +54,18 @@ def __init__( ) self._ended = False self.logger = logger or logging.getLogger(__name__) - if self.transcriber_config.endpointing_config: - raise Exception("Assembly AI endpointing config not supported yet") - self.buffer = bytearray() self.audio_cursor = 0 - self.terminate_msg = str.encode(json.dumps({"terminate_session": True})) + + if isinstance(self.transcriber_config.endpointing_config, (TimeEndpointingConfig, PunctuationEndpointingConfig)): + self.transcriber_config.end_utterance_silence_threshold_milliseconds = int(self.transcriber_config.endpointing_config.time_cutoff_seconds * 1000) + self.terminate_msg = json.dumps({"terminate_session": True}) + self.end_utterance_silence_threshold_msg = ( + None if self.transcriber_config.end_utterance_silence_threshold_milliseconds is None + else json.dumps( + {"end_utterance_silence_threshold": self.transcriber_config.end_utterance_silence_threshold_milliseconds} + ) + ) async def ready(self): return True @@ -107,6 +113,9 @@ async def process(self): ) as ws: await asyncio.sleep(0.1) + if self.end_utterance_silence_threshold_msg: + await ws.send(self.end_utterance_silence_threshold_msg) + async def sender(ws): # sends audio to websocket while not self._ended: try: From bceb87403a94d407fb2fc32fc5fd5470efdb1fa5 Mon Sep 17 00:00:00 2001 From: Stephen Handley Date: Wed, 20 Mar 2024 15:51:09 -0700 Subject: [PATCH 061/148] Update API docs 3/20/24 (#522) --- docs/openapi.json | 251 ++++++++++++++++++++++++++++++++++- docs/update_open_api_docs.sh | 2 +- 2 files changed, 248 insertions(+), 5 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 6c8ed4cd1d..b53665617a 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -32,6 +32,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -257,6 +273,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -481,6 +513,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -633,6 +681,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -783,6 +847,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -935,6 +1015,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -1085,6 +1181,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -1237,6 +1349,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -1397,6 +1525,22 @@ "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", "in": "query" + }, + { + "required": false, + "schema": { "type": "string", "title": "Sort Column" }, + "name": "sort_column", + "in": "query" + }, + { + "required": false, + "schema": { + "type": "boolean", + "title": "Sort Desc", + "default": false + }, + "name": "sort_desc", + "in": "query" } ], "responses": { @@ -1879,6 +2023,11 @@ "type": "boolean", "title": "Run Do Not Call Detection", "default": false + }, + "llm_temperature": { + "type": "number", + "title": "Llm Temperature", + "default": 0.0 } }, "type": "object", @@ -2017,6 +2166,11 @@ "type": "boolean", "title": "Run Do Not Call Detection", "default": false + }, + "llm_temperature": { + "type": "number", + "title": "Llm Temperature", + "default": 0.0 } }, "type": "object", @@ -2319,6 +2473,7 @@ "type": "string", "enum": [ "human_unanswered", + "call_did_not_connect", "human_disconnected", "bot_disconnected", "transfer_unanswered", @@ -2369,6 +2524,11 @@ }, "telephony_account_connection": { "$ref": "#/components/schemas/TwilioAccountConnection" + }, + "telephony_params": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Telephony Params" } }, "type": "object", @@ -2536,6 +2696,11 @@ "type": "boolean", "title": "Run Do Not Call Detection", "default": false + }, + "llm_temperature": { + "type": "number", + "title": "Llm Temperature", + "default": 0.0 } }, "type": "object", @@ -2572,6 +2737,11 @@ "additionalProperties": { "type": "string" }, "type": "object", "title": "Context" + }, + "telephony_params": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Telephony Params" } }, "type": "object", @@ -2685,7 +2855,12 @@ "type": "integer", "title": "Optimize Streaming Latency" }, - "model_id": { "type": "string", "title": "Model Id" } + "model_id": { "type": "string", "title": "Model Id" }, + "experimental_input_streaming": { + "type": "boolean", + "title": "Experimental Input Streaming", + "default": false + } }, "type": "object", "required": ["id", "user_id", "type", "voice_id"], @@ -2706,7 +2881,12 @@ "type": "integer", "title": "Optimize Streaming Latency" }, - "model_id": { "type": "string", "title": "Model Id" } + "model_id": { "type": "string", "title": "Model Id" }, + "experimental_input_streaming": { + "type": "boolean", + "title": "Experimental Input Streaming", + "default": false + } }, "type": "object", "required": ["type", "voice_id"], @@ -2760,6 +2940,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Model Id" + }, + "experimental_input_streaming": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Experimental Input Streaming" } }, "type": "object", @@ -2868,6 +3055,7 @@ "event_action", "event_phone_call_connected", "event_phone_call_ended", + "event_phone_call_did_not_connect", "event_transcript", "event_recording", "event_human_detection" @@ -3036,6 +3224,11 @@ "type": "boolean", "title": "Run Do Not Call Detection", "default": false + }, + "llm_temperature": { + "type": "number", + "title": "Llm Temperature", + "default": 0.0 } }, "type": "object", @@ -3081,6 +3274,7 @@ "type": "string", "enum": [ "human_unanswered", + "call_did_not_connect", "human_disconnected", "bot_disconnected", "transfer_unanswered", @@ -3135,6 +3329,11 @@ { "$ref": "#/components/schemas/TwilioAccountConnection" } ], "title": "Telephony Account Connection" + }, + "telephony_params": { + "additionalProperties": { "type": "string" }, + "type": "object", + "title": "Telephony Params" } }, "type": "object", @@ -3462,7 +3661,15 @@ "enum": ["faster", "draft", "low", "medium", "high", "premium"], "title": "Quality" }, - "temperature": { "type": "number", "title": "Temperature" } + "temperature": { "type": "number", "title": "Temperature" }, + "top_p": { "type": "number", "title": "Top P" }, + "text_guidance": { "type": "number", "title": "Text Guidance" }, + "voice_guidance": { "type": "number", "title": "Voice Guidance" }, + "experimental_remove_silence": { + "type": "boolean", + "title": "Experimental Remove Silence", + "default": false + } }, "type": "object", "required": ["id", "user_id", "type", "voice_id"], @@ -3490,7 +3697,15 @@ "enum": ["faster", "draft", "low", "medium", "high", "premium"], "title": "Quality" }, - "temperature": { "type": "number", "title": "Temperature" } + "temperature": { "type": "number", "title": "Temperature" }, + "top_p": { "type": "number", "title": "Top P" }, + "text_guidance": { "type": "number", "title": "Text Guidance" }, + "voice_guidance": { "type": "number", "title": "Voice Guidance" }, + "experimental_remove_silence": { + "type": "boolean", + "title": "Experimental Remove Silence", + "default": false + } }, "type": "object", "required": ["type", "voice_id"], @@ -3554,6 +3769,34 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Temperature" + }, + "top_p": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Top P" + }, + "text_guidance": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Text Guidance" + }, + "voice_guidance": { + "anyOf": [ + { "type": "number" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Voice Guidance" + }, + "experimental_remove_silence": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Experimental Remove Silence" } }, "type": "object", diff --git a/docs/update_open_api_docs.sh b/docs/update_open_api_docs.sh index 9d1c7fc8f3..3f4ea1f28a 100755 --- a/docs/update_open_api_docs.sh +++ b/docs/update_open_api_docs.sh @@ -1,4 +1,4 @@ FILE=./openapi.json curl https://api.vocode.dev/openapi.json -o $FILE npx prettier $FILE --write -npx mintlify dev \ No newline at end of file +npx mintlify dev From 19f97fa39749a40e32164a80092c25de7b3753c7 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 2 Apr 2024 21:21:32 +0000 Subject: [PATCH 062/148] Update whisper params to match the struct in whisper.h (#517) Co-authored-by: Christian --- vocode/utils/whisper_cpp/whisper_params.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vocode/utils/whisper_cpp/whisper_params.py b/vocode/utils/whisper_cpp/whisper_params.py index 1b5e7e76c7..0777dbb58b 100644 --- a/vocode/utils/whisper_cpp/whisper_params.py +++ b/vocode/utils/whisper_cpp/whisper_params.py @@ -5,13 +5,14 @@ class WhisperFullParams(ctypes.Structure): _fields_ = [ ("strategy", ctypes.c_int), # - ("n_max_text_ctx", ctypes.c_int), ("n_threads", ctypes.c_int), + ("n_max_text_ctx", ctypes.c_int), ("offset_ms", ctypes.c_int), ("duration_ms", ctypes.c_int), # ("translate", ctypes.c_bool), ("no_context", ctypes.c_bool), + ("no_timestamps", ctypes.c_bool), ("single_segment", ctypes.c_bool), ("print_special", ctypes.c_bool), ("print_progress", ctypes.c_bool), @@ -26,13 +27,17 @@ class WhisperFullParams(ctypes.Structure): ("max_tokens", ctypes.c_int), # ("speed_up", ctypes.c_bool), + ("debug_mode", ctypes.c_bool), ("audio_ctx", ctypes.c_int), # + ("tdrz_enable", ctypes.c_bool), + # ("initial_prompt", ctypes.c_char_p), ("prompt_tokens", ctypes.c_void_p), ("prompt_n_tokens", ctypes.c_int), # ("language", ctypes.c_char_p), + ("detect_language", ctypes.c_bool), # ("suppress_blank", ctypes.c_bool), ("suppress_non_speech_tokens", ctypes.c_bool), @@ -47,7 +52,7 @@ class WhisperFullParams(ctypes.Structure): ("no_speech_thold", ctypes.c_float), # ("greedy", ctypes.c_int * 1), - ("beam_search", ctypes.c_int * 3), + ("beam_search", ctypes.c_int * 2), # ("new_segment_callback", ctypes.c_void_p), ("new_segment_callback_user_data", ctypes.c_void_p), @@ -60,4 +65,9 @@ class WhisperFullParams(ctypes.Structure): # ("logits_filter_callback", ctypes.c_void_p), ("logits_filter_callback_user_data", ctypes.c_void_p), + # + ("grammar_rules", ctypes.POINTER(ctypes.c_void_p)), + ("n_grammar_rules", ctypes.c_size_t), + ("i_start_rule", ctypes.c_size_t), + ("grammar_penalty", ctypes.c_float), ] From 7d92e691756c9badc99e5aff12fafd317a59c6a5 Mon Sep 17 00:00:00 2001 From: Vlad Cuciureanu Date: Tue, 9 Apr 2024 21:04:44 +0300 Subject: [PATCH 063/148] chore: Updated docs favicon (#529) --- docs/favicon.png | Bin 3709 -> 0 bytes docs/favicon.svg | 1 + docs/mint.json | 20 +++++++++++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) delete mode 100644 docs/favicon.png create mode 100644 docs/favicon.svg diff --git a/docs/favicon.png b/docs/favicon.png deleted file mode 100644 index b8b1c682084a07438e0a691a77e15dbb04670f25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3709 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 \ No newline at end of file diff --git a/docs/mint.json b/docs/mint.json index a6c70a0914..e1e192c3f4 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -5,7 +5,7 @@ "dark": "/logo/dark.png", "light": "/logo/dark.png" }, - "favicon": "/favicon.png", + "favicon": "/favicon.svg", "modeToggle": { "default": "dark", "isHidden": true @@ -49,11 +49,19 @@ "navigation": [ { "group": "Getting Started", - "pages": ["welcome", "hosted-quickstart", "open-source-quickstart"] + "pages": [ + "welcome", + "hosted-quickstart", + "open-source-quickstart" + ] }, { "group": "Vocode 101", - "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] + "pages": [ + "what-is-vocode", + "how-it-works", + "how-to-use-it" + ] }, { "group": "Guides", @@ -105,7 +113,9 @@ }, { "group": "Usage", - "pages": ["api-reference/usage/get-usage"] + "pages": [ + "api-reference/usage/get-usage" + ] }, { "group": "Actions", @@ -200,4 +210,4 @@ "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" } -} +} \ No newline at end of file From c31958284ace331d993ebb86e846a4a3c4d1ca50 Mon Sep 17 00:00:00 2001 From: Vlad Cuciureanu Date: Wed, 10 Apr 2024 16:25:36 +0300 Subject: [PATCH 064/148] chore: Removed favicon transparency by making it square (#530) --- docs/favicon.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/favicon.svg b/docs/favicon.svg index 9dc8c8a2e0..3c74a1dcf6 100644 --- a/docs/favicon.svg +++ b/docs/favicon.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 5eb89f166709f43a1e014b026cfd60482cae7ede Mon Sep 17 00:00:00 2001 From: Vlad Cuciureanu Date: Wed, 10 Apr 2024 20:24:43 +0300 Subject: [PATCH 065/148] fix: Mintlify wont load SVG favicon and will use cached PNG favicon instead (#532) --- docs/favicon.png | Bin 0 -> 4229 bytes docs/favicon.svg | 1 - docs/mint.json | 20 +++++--------------- 3 files changed, 5 insertions(+), 16 deletions(-) create mode 100644 docs/favicon.png delete mode 100644 docs/favicon.svg diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..95b327540921a792c3c22199e4b43dc72f16543e GIT binary patch literal 4229 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 Unc#NlY^NAVva}@@nft{47xP^FK>z>% literal 0 HcmV?d00001 diff --git a/docs/favicon.svg b/docs/favicon.svg deleted file mode 100644 index 3c74a1dcf6..0000000000 --- a/docs/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/mint.json b/docs/mint.json index e1e192c3f4..a6c70a0914 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -5,7 +5,7 @@ "dark": "/logo/dark.png", "light": "/logo/dark.png" }, - "favicon": "/favicon.svg", + "favicon": "/favicon.png", "modeToggle": { "default": "dark", "isHidden": true @@ -49,19 +49,11 @@ "navigation": [ { "group": "Getting Started", - "pages": [ - "welcome", - "hosted-quickstart", - "open-source-quickstart" - ] + "pages": ["welcome", "hosted-quickstart", "open-source-quickstart"] }, { "group": "Vocode 101", - "pages": [ - "what-is-vocode", - "how-it-works", - "how-to-use-it" - ] + "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] }, { "group": "Guides", @@ -113,9 +105,7 @@ }, { "group": "Usage", - "pages": [ - "api-reference/usage/get-usage" - ] + "pages": ["api-reference/usage/get-usage"] }, { "group": "Actions", @@ -210,4 +200,4 @@ "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" } -} \ No newline at end of file +} From abecce0bee4ac9009e91ffa61b632defb683aa13 Mon Sep 17 00:00:00 2001 From: Mac Wilkinson Date: Wed, 10 Apr 2024 15:42:08 -0400 Subject: [PATCH 066/148] Add External Actions Front Facing Docs (#531) * Add External Actions Front Facing Docs * Fix Python Formatting * Change Some Wording + Elaborate Further * Remove Duplicated Code Example and Just Redirect Instead * Update docs/external-actions.mdx --------- Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> Co-authored-by: Ajay Raj --- docs/external-actions.mdx | 326 ++++++++++++++++++++++++++++++++++++++ docs/mint.json | 1 + docs/using-actions.mdx | 20 ++- 3 files changed, 343 insertions(+), 4 deletions(-) create mode 100644 docs/external-actions.mdx diff --git a/docs/external-actions.mdx b/docs/external-actions.mdx new file mode 100644 index 0000000000..2131b3455a --- /dev/null +++ b/docs/external-actions.mdx @@ -0,0 +1,326 @@ +--- +title: "[Beta] External Actions" +description: "Have your agent communicate with an External API" +--- + +External Actions allow Vocode agents to take actions outside the realm of a phone call. In particular, Vocode agents can decide to _push_ information to external systems via an API request, and _pull_ information from the API response in order to: + +1. change the agent’s behavior based on the pulled information +2. give the agent context to inform the rest of the phone call + +## How it Works + +### Configuring the External Action + +The Vocode Agent will determine after each turn of conversation if its the ideal time to interact with the External API based primarily on the configured External Action's `description` and `input_schema`! + +#### `input_schema` Field + +The `input_schema` field is a [JSON Schema](https://json-schema.org/) object that instructs how to properly form a payload to send to the External API. + +For example, in the [Meeting Assistant Example](/external-actions#meeting-assistant-example) below we formed the following JSON payload: + +```json +{ + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"] + }, + "time": { + "type": "string", + "pattern": "^d{2}:d0[ap]m$" + } + } +} +``` + +This is stating the External API is expecting: + +- Two fields + - `length` (string): either "30m" or "1hr" + - `time` (string): a regex pattern defining a time ending in a zero with `am`/`pm` on the end ie: `10:30am` + + + If you’re noticing that this looks very familiar to OpenAI function calling, it is! The Vocode API treats OpenAI LLMs as first-class and uses the function calling API when the agent uses an OpenAI LLM. + + The lone difference is that the top level `input_schema` JSON schema must be an `object` - this is so we can use JSON to send over parameters to the user’s API. + + + +#### `description` Field + +The `description` is best used to descibe your External Action's purpose. As its passed through directly to the LLM, its the best way to convey instructions to the underlying Vocode Agent. + +For example, in the [Meeting Assistant Example](/external-actions#meeting-assistant-example) below we want to book a meeting for 30 minutes to an hour so we set the description as `Book a meeting for a 30 minute or 1 hour call.` + + + The `description` field is passed through and heavily affects how we do our + function decisioning so we recommend treating it in the same way you would a + prompt to an LLM! + + +#### Other Fields to Determine Agent Behavior + +- `speak_on_send`: if `True`, then the underlying LLM will generate a message to be spoken into the phone call as the + API request is being sent. - `url`: The API request is sent to this URL in the format + defined below in [Responding to External Action API Requests](/external-actions#responding-to-external-action-api-requests) + +- `speak_on_receive`: if `True`, then the Vocode Agent will invoke the underlying + LLM to respond based on the result from the API Response or the Error encountered. + +### Responding to External Action API Requests + +Once an External Action has been created, the Vocode Agent will issue API requests to the defined `url` during the course of a phone call based on the [configuration noted above](/external-actions#configuring-the-external-action) +The Vocode API will wait a maximum of _10 seconds_ before timing out the request. + +In particular, Vocode will issue a POST request to `url` with a JSON payload that matches `input_schema` , specifically (using the [Meeting Assistant Example](/external-actions#meeting-assistant-example) below): + +```bash +POST url HTTP/1.1 +Accept: application/json +Content-Type: application/json +x-vocode-signature: + +{ + "call_id": , + "payload": { + "length": "30m", + "time": "10:30am" + } +} +``` + +#### Signature Validation + +A cryptographically signed signature of the request body and a randomly generated byte hash in included as a header (under `x-vocode-signature`) in the outbound request so that the user’s API can validate the identity of the incoming request. + +The signature secret is contained in the External Action's API object and can be found when creating an object (as noted below in the [Meeting Assistant Example](/external-actions#meeting-assistant-example)), or by getting the API object via the `/v1/actions?id=ACTION_ID` endpoint: + + +```bash Example cURL Request +curl --request GET \ + --url https://api.vocode.dev/v1/actions?id=\ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' +``` + +```json Response +{ + "id": "", + "user_id": "ecd792cf-18a2-420b-91f5-cdaf22f5f562", + "type": "action_external", + "config": { + "processing_mode": "muted", + "name": "Meeting_Booking_Assistant", + "description": "Book a meeting for a 30 minute or 1 hour call.", + "url": "http://example.com/booking", + "input_schema": { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"] + }, + "time": { + "type": "string", + "pattern": "^\\d{2}:\\d0[ap]m$" + } + } + }, + "speak_on_send": true, + "speak_on_receive": true, + "signature_secret": "MX/9/+iblnUoAAM2Jft8sgeY1bevJvuih2nr7XKPHIY=" + }, + "action_trigger": { + "type": "action_trigger_function_call", + "config": {} + } +} +``` + + +Use the following code snippet to check the signature in an inbound request: + + +```python Python +import base64 +import hashlib +import hmac + +async def test_requester_encodes_signature( +request_signature_value: str, signature_secret: str, payload: dict +): +""" +Asynchronous function to check if the request signature is encoded correctly. + + Args: + request_signature_value (str): The request signature to be decoded. + signature_secret (str): The signature to be decoded and used for comparison. + payload (dict): The payload to be used for digest calculation. + + Returns: + None + """ + signature_secret_as_bytes = base64.b64decode(signature_secret) + decoded_digest = base64.b64decode(request_signature_value) + calculated_digest = hmac.new(signature_secret_as_bytes, payload, hashlib.sha256).digest() + assert hmac.compare_digest(decoded_digest, calculated_digest) is True + +```` + +```typescript TypeScript +import * as crypto from 'crypto'; + +async function testRequesterEncodesSignature( + requestSignatureValue: string, + signatureSecret: string, + payload: Record +): Promise { + /** + * Asynchronous function to check if the request signature is encoded correctly. + * + * @param requestSignatureValue - The request signature to be decoded. + * @param signatureSecret - The signature to be decoded and used for comparison. + * @param payload - The payload to be used for digest calculation. + */ + const signatureAsBytes = Buffer.from(signatureSecret, 'base64'); + const decodedDigest = Buffer.from(requestSignatureValue, 'base64'); + const payloadString = JSON.stringify(payload); + const calculatedDigest = crypto + .createHmac('sha256', signatureAsBytes) + .update(payloadString) + .digest(); + + if (!crypto.timingSafeEqual(decodedDigest, calculatedDigest)) { + throw new Error('Signature mismatch'); + } +} +```` + + + +#### Response Formatting + +Vocode expects responses from the user’s API in JSON in the following format: + +```python +Response { + result: Any + agent_message: Optional[str] = None +} +``` + +- `result` is a payload containing the result of the action on the user’s side, and can be in any format +- `agent_message` optionally contains a message that will be synthesized into audio and sent back to the phone call (see [Configuring the External Action](/external-actions#configuring-the-external-action) above for more info) + +In the [Meeting Assistant Example](/external-actions#meeting-assistant-example) below, the user’s API could return back a JSON response that looks like: + +```json +{ + "result": { + "success": true + }, + "agent_message": "I've set up a calendar appointment at 10:30am tomorrow for 30 minutes" +} +``` + +## Meeting Assistant Example: + +This is an example of a Meeting Assistant which will attempt to book a meeting for 30 minutes or an hour at any time ending in a zero (ie 10:30am is okay but 10:35am is not) + + + +```python Python +vocode_client.actions.create_action( + request={ + "type": "action_external", + "config": { + "name": "Meeting_Booking_Assistant", + "description": ("Book a meeting for a 30 minute or 1 hour call."), + "url": "http://example.com/booking", + "speak_on_send": True, + "speak_on_receive": True, + "input_schema": { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"], + }, + "time": { + "type": "string", + "pattern": "^\d{2}:\d0[ap]m$", + }, + }, + }, + }, + }, +) +``` + +```typescript TypeScript +const action = await vocode.actions.createAction({ + type: "action_external", + config: { + name: "Meeting_Booking_Assistant", + description: "Book a meeting for a 30 minute or 1 hour call.", + url: "http://example.com/booking", + speak_on_send: true, + speak_on_receive: true, + input_schema: { + type: "object", + properties: { + length: { + type: "string", + enum: ["30m", "1hr"], + }, + time: { + type: "string", + pattern: "^\\d{2}:\\d0[ap]m$", + }, + }, + }, + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' \ + --data '{ + "type": "action_external", + "config": { + "name": "Meeting_Booking_Assistant", + "description": "Book a meeting for a 30 minute or 1 hour call.", + "url": "http://example.com/booking", + "speak_on_send": true, + "speak_on_receive": true, + "input_schema": { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"] + }, + "time": { + "type": "string", + "pattern": "^\\d{2}:\\d0[ap]m$" + } + } + } + } +}' +``` + + + + + If you're looking to attach the created External Action to your agent after + creating it in the example below, theres an example of how to do this on the + [Using Actions](/using-actions#transfercall) page under the TransferCall + section! + diff --git a/docs/mint.json b/docs/mint.json index a6c70a0914..6a61fbbcf7 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -179,6 +179,7 @@ "conversational-dials", "setting-up-webhook", "using-actions", + "external-actions", "vectordb", "multilingual", "injecting-context", diff --git a/docs/using-actions.mdx b/docs/using-actions.mdx index 050620bddd..887573e0fb 100644 --- a/docs/using-actions.mdx +++ b/docs/using-actions.mdx @@ -3,9 +3,11 @@ title: "Using actions" description: "Make agents on your phone calls take actions" --- -Agents on phone calls can take three actions: +Agents on phone calls can take four actions: -`EndConversation`: allows the agent to end the call, e.g. if the user says "Goodbye!" +#### EndConversation + +`EndConversation` allows the agent to end the call, e.g. if the user says "Goodbye!" @@ -35,7 +37,9 @@ curl --request POST \ -`DTMF`: allows the agent to hit dial tones during a call, e.g. navigating a phone tree +#### DTMF + +`DTMF` allows the agent to hit dial tones during a call, e.g. navigating a phone tree @@ -65,7 +69,9 @@ curl --request POST \ -`TransferCall`: allows the agent to transfer the call to another phone number +#### TransferCall + +`TransferCall` allows the agent to transfer the call to another phone number @@ -196,3 +202,9 @@ curl --request POST \ ``` + +#### [Beta] ExternalAction + +`ExternalAction` allows your agent communicate with an External API and include the response as context in the conversation. + +See the dedicated [External Action's](/external-actions) page for more info! From 886d3d840590a988ddb8f67539854f67848ad201 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 15 Apr 2024 13:42:33 -0700 Subject: [PATCH 067/148] prerelease (#533) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9117e5da4b..e367dfe4cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.111" +version = "0.1.112a0" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From 890728c187f7e4af13cbe1920fce9e3d53dc46e6 Mon Sep 17 00:00:00 2001 From: Mac Wilkinson Date: Mon, 15 Apr 2024 18:08:06 -0400 Subject: [PATCH 068/148] Add External Actions + Steering Pool Documentation (#534) Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> --- docs/openapi.json | 258 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 244 insertions(+), 14 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index b53665617a..fef5e1f5c3 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1649,6 +1649,46 @@ }, "security": [{ "HTTPBearer": [] }] } + }, + "/v1/account_connections/add_to_steering_pool": { + "post": { + "tags": ["account_connections"], + "summary": "Add To Steering Pool", + "operationId": "add_to_steering_pool", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddToSteeringPoolRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } } }, "components": { @@ -1733,7 +1773,8 @@ { "$ref": "#/components/schemas/EndConversationAction" }, { "$ref": "#/components/schemas/DTMFAction" }, { "$ref": "#/components/schemas/AddToConferenceAction" }, - { "$ref": "#/components/schemas/SetHoldAction" } + { "$ref": "#/components/schemas/SetHoldAction" }, + { "$ref": "#/components/schemas/ExternalAction" } ], "discriminator": { "propertyName": "type", @@ -1742,7 +1783,8 @@ "action_end_conversation": "#/components/schemas/EndConversationAction", "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", - "action_set_hold": "#/components/schemas/SetHoldAction" + "action_set_hold": "#/components/schemas/SetHoldAction", + "action_external": "#/components/schemas/ExternalAction" } } }, @@ -1763,7 +1805,8 @@ { "$ref": "#/components/schemas/EndConversationActionParams" }, { "$ref": "#/components/schemas/DTMFActionParams" }, { "$ref": "#/components/schemas/AddToConferenceActionParams" }, - { "$ref": "#/components/schemas/SetHoldActionParams" } + { "$ref": "#/components/schemas/SetHoldActionParams" }, + { "$ref": "#/components/schemas/ExternalActionParams" } ], "title": "ActionParamsRequest", "discriminator": { @@ -1773,7 +1816,8 @@ "action_end_conversation": "#/components/schemas/EndConversationActionParams", "action_dtmf": "#/components/schemas/DTMFActionParams", "action_add_to_conference": "#/components/schemas/AddToConferenceActionParams", - "action_set_hold": "#/components/schemas/SetHoldActionParams" + "action_set_hold": "#/components/schemas/SetHoldActionParams", + "action_external": "#/components/schemas/ExternalActionParams" } } }, @@ -1783,7 +1827,8 @@ { "$ref": "#/components/schemas/EndConversationAction" }, { "$ref": "#/components/schemas/DTMFAction" }, { "$ref": "#/components/schemas/AddToConferenceAction" }, - { "$ref": "#/components/schemas/SetHoldAction" } + { "$ref": "#/components/schemas/SetHoldAction" }, + { "$ref": "#/components/schemas/ExternalAction" } ], "title": "ActionResponseModel", "discriminator": { @@ -1793,7 +1838,8 @@ "action_end_conversation": "#/components/schemas/EndConversationAction", "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", - "action_set_hold": "#/components/schemas/SetHoldAction" + "action_set_hold": "#/components/schemas/SetHoldAction", + "action_external": "#/components/schemas/ExternalAction" } } }, @@ -1803,7 +1849,8 @@ { "$ref": "#/components/schemas/EndConversationActionUpdateParams" }, { "$ref": "#/components/schemas/DTMFActionUpdateParams" }, { "$ref": "#/components/schemas/AddToConferenceActionUpdateParams" }, - { "$ref": "#/components/schemas/SetHoldActionUpdateParams" } + { "$ref": "#/components/schemas/SetHoldActionUpdateParams" }, + { "$ref": "#/components/schemas/ExternalActionUpdateParams" } ], "title": "ActionUpdateParamsRequest", "discriminator": { @@ -1813,7 +1860,8 @@ "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", "action_dtmf": "#/components/schemas/DTMFActionUpdateParams", "action_add_to_conference": "#/components/schemas/AddToConferenceActionUpdateParams", - "action_set_hold": "#/components/schemas/SetHoldActionUpdateParams" + "action_set_hold": "#/components/schemas/SetHoldActionUpdateParams", + "action_external": "#/components/schemas/ExternalActionUpdateParams" } } }, @@ -1920,10 +1968,18 @@ "required": ["phone_number"], "title": "AddToConferenceConfig" }, + "AddToSteeringPoolRequest": { + "properties": { + "phone_number": { "type": "string", "title": "Phone Number" } + }, + "type": "object", + "title": "AddToSteeringPoolRequest" + }, "Agent": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "name": { "type": "string", "title": "Name" }, "prompt": { "$ref": "#/components/schemas/Prompt" }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], @@ -1936,7 +1992,8 @@ { "$ref": "#/components/schemas/EndConversationAction" }, { "$ref": "#/components/schemas/DTMFAction" }, { "$ref": "#/components/schemas/AddToConferenceAction" }, - { "$ref": "#/components/schemas/SetHoldAction" } + { "$ref": "#/components/schemas/SetHoldAction" }, + { "$ref": "#/components/schemas/ExternalAction" } ], "discriminator": { "propertyName": "type", @@ -1945,7 +2002,8 @@ "action_end_conversation": "#/components/schemas/EndConversationAction", "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", - "action_set_hold": "#/components/schemas/SetHoldAction" + "action_set_hold": "#/components/schemas/SetHoldAction", + "action_external": "#/components/schemas/ExternalAction" } } }, @@ -2051,6 +2109,7 @@ }, "AgentParams": { "properties": { + "name": { "type": "string", "title": "Name" }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -2076,7 +2135,8 @@ { "$ref": "#/components/schemas/AddToConferenceActionParams" }, - { "$ref": "#/components/schemas/SetHoldActionParams" } + { "$ref": "#/components/schemas/SetHoldActionParams" }, + { "$ref": "#/components/schemas/ExternalActionParams" } ] } ] @@ -2179,6 +2239,13 @@ }, "AgentUpdateParams": { "properties": { + "name": { + "anyOf": [ + { "type": "string" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Name" + }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -2216,6 +2283,9 @@ }, { "$ref": "#/components/schemas/SetHoldActionUpdateParams" + }, + { + "$ref": "#/components/schemas/ExternalActionUpdateParams" } ] } @@ -2581,6 +2651,7 @@ }, "CreateCallAgentParams": { "properties": { + "name": { "type": "string", "title": "Name" }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -2606,7 +2677,8 @@ { "$ref": "#/components/schemas/AddToConferenceActionParams" }, - { "$ref": "#/components/schemas/SetHoldActionParams" } + { "$ref": "#/components/schemas/SetHoldActionParams" }, + { "$ref": "#/components/schemas/ExternalActionParams" } ] } ] @@ -3063,6 +3135,122 @@ "title": "EventType", "description": "An enumeration." }, + "ExternalAction": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["action_external"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/ExternalActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["id", "user_id", "type", "config"], + "title": "ExternalAction" + }, + "ExternalActionConfig": { + "properties": { + "processing_mode": { + "type": "string", + "enum": ["muted"], + "title": "Processing Mode", + "default": "muted" + }, + "name": { "type": "string", "title": "Name" }, + "description": { "type": "string", "title": "Description" }, + "url": { "type": "string", "title": "Url" }, + "input_schema": { "type": "object", "title": "Input Schema" }, + "speak_on_send": { "type": "boolean", "title": "Speak On Send" }, + "speak_on_receive": { "type": "boolean", "title": "Speak On Receive" } + }, + "type": "object", + "required": [ + "name", + "description", + "url", + "input_schema", + "speak_on_send", + "speak_on_receive" + ], + "title": "ExternalActionConfig" + }, + "ExternalActionParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_external"], + "title": "Type" + }, + "config": { "$ref": "#/components/schemas/ExternalActionConfig" }, + "action_trigger": { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ], + "title": "Action Trigger", + "default": { "type": "action_trigger_function_call", "config": {} }, + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + } + } + } + }, + "type": "object", + "required": ["type", "config"], + "title": "ExternalActionParams" + }, + "ExternalActionUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["action_external"], + "title": "Type" + }, + "config": { + "anyOf": [ + { "$ref": "#/components/schemas/ExternalActionConfig" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Config" + }, + "action_trigger": { + "anyOf": [ + { + "oneOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, + { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + ] + }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Action Trigger", + "default": {} + } + }, + "type": "object", + "required": ["type"], + "title": "ExternalActionUpdateParams" + }, "FunctionCallActionTrigger": { "properties": { "type": { @@ -3146,6 +3334,7 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "name": { "type": "string", "title": "Name" }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -3914,7 +4103,14 @@ "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, "speaker": { "type": "string", "title": "Speaker" }, - "speed_alpha": { "type": "number", "title": "Speed Alpha" } + "speed_alpha": { "type": "number", "title": "Speed Alpha" }, + "model_id": { + "anyOf": [ + { "type": "string", "enum": ["mist", "v1"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Model Id" + } }, "type": "object", "required": ["id", "user_id", "type", "speaker"], @@ -3924,7 +4120,14 @@ "properties": { "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, "speaker": { "type": "string", "title": "Speaker" }, - "speed_alpha": { "type": "number", "title": "Speed Alpha" } + "speed_alpha": { "type": "number", "title": "Speed Alpha" }, + "model_id": { + "anyOf": [ + { "type": "string", "enum": ["mist", "v1"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Model Id" + } }, "type": "object", "required": ["type", "speaker"], @@ -3946,6 +4149,13 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Speed Alpha" + }, + "model_id": { + "anyOf": [ + { "type": "string", "enum": ["mist", "v1"] }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Model Id" } }, "type": "object", @@ -4149,6 +4359,16 @@ "type": "string", "enum": ["account_connection_twilio"], "title": "Type" + }, + "steering_pool": { + "items": { "type": "string" }, + "type": "array", + "title": "Steering Pool" + }, + "account_supports_any_caller_id": { + "type": "boolean", + "title": "Account Supports Any Caller Id", + "default": false } }, "type": "object", @@ -4162,6 +4382,16 @@ "type": "string", "enum": ["account_connection_twilio"], "title": "Type" + }, + "steering_pool": { + "items": { "type": "string" }, + "type": "array", + "title": "Steering Pool" + }, + "account_supports_any_caller_id": { + "type": "boolean", + "title": "Account Supports Any Caller Id", + "default": false } }, "type": "object", From abfcd9db1ce5fd3b14ca7a3e5b7d4a380ccfee09 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 19 Apr 2024 14:54:36 -0700 Subject: [PATCH 069/148] update openapi spec + add docs for warm transfer, phrase triggers (#535) --- docs/mint.json | 2 + docs/openapi.json | 241 ++++++++++++++++++++++++++++++++++++--- docs/phrase-triggers.mdx | 77 +++++++++++++ docs/using-actions.mdx | 10 +- docs/warm-transfer.mdx | 81 +++++++++++++ 5 files changed, 391 insertions(+), 20 deletions(-) create mode 100644 docs/phrase-triggers.mdx create mode 100644 docs/warm-transfer.mdx diff --git a/docs/mint.json b/docs/mint.json index 6a61fbbcf7..2ed84ddbe3 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -179,7 +179,9 @@ "conversational-dials", "setting-up-webhook", "using-actions", + "phrase-triggers", "external-actions", + "warm-transfer", "vectordb", "multilingual", "injecting-context", diff --git a/docs/openapi.json b/docs/openapi.json index fef5e1f5c3..8704e7b822 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1670,6 +1670,45 @@ "$ref": "#/components/schemas/AddToSteeringPoolRequest" } } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + }, + "security": [{ "HTTPBearer": [] }] + } + }, + "/v1/account_connections/remove_from_steering_pool": { + "post": { + "tags": ["account_connections"], + "summary": "Remove From Steering Pool", + "operationId": "remove_from_steering_pool", + "parameters": [ + { + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" }, + "name": "id", + "in": "query" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveFromSteeringPoolRequest" + } + } }, "required": true }, @@ -1714,10 +1753,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "AccountConnectionPage" }, "AccountConnectionParamsRequest": { @@ -1793,10 +1844,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "ActionPage" }, "ActionParamsRequest": { @@ -1973,6 +2036,7 @@ "phone_number": { "type": "string", "title": "Phone Number" } }, "type": "object", + "required": ["phone_number"], "title": "AddToSteeringPoolRequest" }, "Agent": { @@ -2101,10 +2165,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "AgentPage" }, "AgentParams": { @@ -2551,6 +2627,13 @@ ], "title": "Stage Outcome" }, + "telephony_metadata": { + "anyOf": [ + { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, + { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + ], + "title": "Telephony Metadata" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, @@ -2622,10 +2705,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "CallPage" }, "CallStatus": { @@ -3471,6 +3566,13 @@ ], "title": "Stage Outcome" }, + "telephony_metadata": { + "anyOf": [ + { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, + { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + ], + "title": "Telephony Metadata" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, @@ -3694,10 +3796,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "PhoneNumberPage" }, "PhraseBasedActionTrigger": { @@ -4018,10 +4132,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "PromptPage" }, "PromptParams": { @@ -4097,6 +4223,14 @@ "type": "object", "title": "PromptUpdateParams" }, + "RemoveFromSteeringPoolRequest": { + "properties": { + "phone_number": { "type": "string", "title": "Phone Number" } + }, + "type": "object", + "required": ["phone_number"], + "title": "RemoveFromSteeringPoolRequest" + }, "RimeVoice": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -4432,6 +4566,29 @@ "required": ["twilio_account_sid", "twilio_auth_token"], "title": "TwilioCredentials" }, + "TwilioTelephonyMetadata": { + "properties": { + "type": { + "type": "string", + "enum": ["telephony_metadata_twilio"], + "title": "Type", + "default": "telephony_metadata_twilio" + }, + "call_sid": { "type": "string", "title": "Call Sid" }, + "call_status": { "type": "string", "title": "Call Status" }, + "transfer_call_sid": { + "type": "string", + "title": "Transfer Call Sid" + }, + "transfer_call_status": { + "type": "string", + "title": "Transfer Call Status" + }, + "conference_sid": { "type": "string", "title": "Conference Sid" } + }, + "type": "object", + "title": "TwilioTelephonyMetadata" + }, "Undefined": { "properties": {}, "additionalProperties": false, @@ -4516,10 +4673,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "VectorDatabasePage" }, "VoicePage": { @@ -4547,10 +4716,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "VoicePage" }, "VoiceParamsRequest": { @@ -4607,6 +4788,18 @@ } } }, + "VonageTelephonyMetadata": { + "properties": { + "type": { + "type": "string", + "enum": ["telephony_metadata_vonage"], + "title": "Type", + "default": "telephony_metadata_vonage" + } + }, + "type": "object", + "title": "VonageTelephonyMetadata" + }, "Webhook": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, @@ -4634,10 +4827,22 @@ }, "page": { "type": "integer", "title": "Page" }, "size": { "type": "integer", "title": "Size" }, - "has_more": { "type": "boolean", "title": "Has More" } + "has_more": { "type": "boolean", "title": "Has More" }, + "total": { "type": "integer", "title": "Total" }, + "total_is_estimated": { + "type": "boolean", + "title": "Total Is Estimated" + } }, "type": "object", - "required": ["items", "page", "size", "has_more"], + "required": [ + "items", + "page", + "size", + "has_more", + "total", + "total_is_estimated" + ], "title": "WebhookPage" }, "WebhookParams": { diff --git a/docs/phrase-triggers.mdx b/docs/phrase-triggers.mdx new file mode 100644 index 0000000000..4fe434ffa9 --- /dev/null +++ b/docs/phrase-triggers.mdx @@ -0,0 +1,77 @@ +--- +title: "[Beta] Phrase Triggers" +description: "Configure Vocode actions to run based on spoken phrases by the agent" +--- + +Phrase triggers allow users to more explicitly control the behavior of their agents by configuring actions to run only once a bot has spoken a particular phrase. For example, you can configure an agent to transfer a call to a human agent only after the bot has said "I will transfer now". + +# Creating a phrase trigger + +You can create a phrase trigger as follows: + +```python +from vocode import ( + PhraseBasedActionTrigger, + PhraseBasedActionTriggerConfig, + PhraseTrigger, +) + +phrase_trigger = PhraseBasedActionTrigger( + config=PhraseBasedActionTriggerConfig( + phrase_triggers=[ + PhraseTrigger( + phrase="I will transfer now", + conditions=["phrase_condition_type_contains"], + ), + PhraseTrigger( + phrase="You can speak to a human now", + conditions=["phrase_condition_type_contains"], + ) + ] + ) +) +``` + +In this example, the action that this phrase trigger is attached to will fire only after the bot has spoken a turn that contains "I will transfer now" or "You can speak to a human now". + +`"phrase_condition_type_contains"` is the only condition type supported at this time, and does not match case, so in the above example, if the bot said "Okay, you can speak to a human now", the phrase trigger would still fire. + +# Configuring your action + +```python +from vocode import ( + TransferCallActionParams, + TransferCallConfig, +) + +vocode_client.agents.update_agent( + actions=[ + TransferCallActionParams( + type="action_transfer_call", + config=TransferCallConfig( + transfer_phone_number="", + ), + action_trigger=phrase_trigger # from the previous code block + ) + ] +) +``` + +To switch back to the default behavior, use a `FunctionCallActionTrigger`. + +```python +from vocode import FunctionCallActionTrigger + +function_trigger = FunctionCallActionTrigger(config={}) +vocode_client.agents.update_agent( + actions=[ + TransferCallActionParams( + type="action_transfer_call", + config=TransferCallConfig( + transfer_phone_number="", + ), + action_trigger=function_trigger + ) + ] +) +``` diff --git a/docs/using-actions.mdx b/docs/using-actions.mdx index 887573e0fb..cb063495d0 100644 --- a/docs/using-actions.mdx +++ b/docs/using-actions.mdx @@ -3,7 +3,7 @@ title: "Using actions" description: "Make agents on your phone calls take actions" --- -Agents on phone calls can take four actions: +Vocode agents can decide to take actions synchronously during calls. See [Phrase Triggers](/phrase-triggers) for information on how to configure how these actions are triggered. Below is the list of actions that an agent can perform: #### EndConversation @@ -207,4 +207,10 @@ curl --request POST \ `ExternalAction` allows your agent communicate with an External API and include the response as context in the conversation. -See the dedicated [External Action's](/external-actions) page for more info! +See [External Actions](/external-actions). + +#### [Beta] Warm Transfer + +Allows your agent to conference in another party into the call. + +See [Warm Transfer](/warm-transfer). diff --git a/docs/warm-transfer.mdx b/docs/warm-transfer.mdx new file mode 100644 index 0000000000..15c7eed1cf --- /dev/null +++ b/docs/warm-transfer.mdx @@ -0,0 +1,81 @@ +--- +title: "[Beta] Warm Transfer" +description: "Conference another party into an outbound call" +--- + +This guide will walk you through how to configure a Vocode agent to perform the following on an outbound call: + +1. Place the primary participant of the call on hold +2. Dial another party into the same call and interact with the agent while the primary participant is on hold +3. Remove the primary participant from hold to speak with the other party + +Note: the warm transfer feature is not yet available for inbound calls, and is only available with Twilio phone numbers. + +# BYOT Setup + +In order to use this feature on [your Twilio account](/bring-your-own-telephony), extra setup is required. In particular, you'll have to allocate some phone numbers on your account to a **steering pool**. To conduct warm transfers, numbers from this pool are momentarily used to set up the conference call. As such, the size of the pool affects the number of concurrent warm transfers you can perform. When all of the numbers in the pool are in use, the Vocode API will throw a 429 error. + +Note: setting up the pool will cause inflight calls to fail — make sure to configure this when calls aren't running. + +Using your Twilio account connection (see the guide on [BYOT](/bring-your-own-telephony)), you can configure the steering pool as follows: + +```python +vocode_client.account_connections.add_to_steering_pool( + id="", +) +``` + +This operation will buy a phone number on your Twilio account and set it up to be used for warm transfers. You can also link an existing phone number on your Twilio account to the steering pool: + +```python +vocode_client.account_connections.add_to_steering_pool( + id="", + phone_number="", +) +``` + +# Configuring your agent to execute warm transfers + +To use warm transfers, you'll need to add the `SetHold` and `AddToConference` actions to your agent - this allows the agent to: + +- Conference in another party and place the original participant on hold +- Bring the original participant off of hold back into the call + +Here's an example agent configuration, which uses [phrase triggers](/phrase-triggers): + +```python +vocode_client.agents.update_agent( + actions=[ + { + "type": "action_set_hold", + "config": {}, + "action_trigger": { + "type": "action_trigger_phrase_based", + "config": { + "phrase_triggers": [ + { + "phrase": "Removing participant from hold", + "conditions": ["phrase_condition_type_contains"], + } + ] + }, + }, + }, + { + "type": "action_add_to_conference", + "config": {"phone_number": "{transfer_phone_number}"}, + "action_trigger": { + "type": "action_trigger_phrase_based", + "config": { + "phrase_triggers": [ + { + "phrase": "I connect you now please hold", + "conditions": ["phrase_condition_type_contains"], + } + ] + }, + }, + }, + ] +) +``` From 8999c93d6d781925d1dcd9c0bb20dc66108d4234 Mon Sep 17 00:00:00 2001 From: Kian Date: Fri, 19 Apr 2024 18:14:54 -0700 Subject: [PATCH 070/148] undo --- docs/actions.mdx | 6 + docs/agents.mdx | 32 ++- docs/configuring-number.mdx | 230 +++++++++------------- docs/do-not-call-detection.mdx | 2 +- docs/getting-number.mdx | 38 ---- docs/hipaa-compliance.mdx | 2 +- docs/machine-detection.mdx | 2 +- docs/mint.json | 42 ++-- docs/{ => open-source}/how-it-works.mdx | 0 docs/{ => open-source}/how-to-use-it.mdx | 0 docs/{ => open-source}/what-is-vocode.mdx | 2 +- docs/prompt-engineering.mdx | 6 + docs/prompts.mdx | 39 ++++ docs/setting-up-number.mdx | 79 ++++++++ docs/setting-up-webhook.mdx | 68 +++---- docs/vectordb.mdx | 2 +- docs/voices.mdx | 44 +++++ docs/walkthrough_intro.mdx | 20 ++ docs/webhooks.mdx | 58 +++++- 19 files changed, 440 insertions(+), 232 deletions(-) create mode 100644 docs/actions.mdx delete mode 100644 docs/getting-number.mdx rename docs/{ => open-source}/how-it-works.mdx (100%) rename docs/{ => open-source}/how-to-use-it.mdx (100%) rename docs/{ => open-source}/what-is-vocode.mdx (90%) create mode 100644 docs/prompt-engineering.mdx create mode 100644 docs/prompts.mdx create mode 100644 docs/setting-up-number.mdx create mode 100644 docs/voices.mdx create mode 100644 docs/walkthrough_intro.mdx diff --git a/docs/actions.mdx b/docs/actions.mdx new file mode 100644 index 0000000000..3887640974 --- /dev/null +++ b/docs/actions.mdx @@ -0,0 +1,6 @@ +--- +title: "Actions" +description: "🚧 Under construction" +--- + +# diff --git a/docs/agents.mdx b/docs/agents.mdx index d2e168e479..347a69da4f 100644 --- a/docs/agents.mdx +++ b/docs/agents.mdx @@ -1,10 +1,38 @@ --- title: "Agents" -description: "🚧 Under construction" +description: "Powerful AI assistants that you can control" --- # What are agents +Vocode Agents are the core component of the Vocode API. Agents can be deployed to receive +phone calls by attaching them to [Numbers](/numbers). Agents can also be used to make outbound calls +via the `calls/create` endpoint. + +At its core, the agent is an amalgamation of everything you need to build powerful AI assistants for +your use cases: + +- [Prompts](/prompts) – instructions given to the agent that control its behavior. +- [Voices](/voices) – the synthetic voice given to your agent. +- [Webhooks](/webhooks) – mechanism by which you can subscribe to agent events. +- [Conversational Dials](/conversational-dials) – controls for how the agent communicates, like its interruption sensitivity. +- [Actions](/actions) – tools available to your agent, like endint the conversation or transferring the call. + # How to configure an agent -# API Schema +Agents can be configured via our [Dashboard](/dashboard) or via API. As with all of our API objects, Agents have +`list`, `get`, `create`, and `update` endpoints that allow you to manipulate them as you see fit. + +In addition to the other API objects enumerated above, agents have other reference fields that can be used to control +agent behavior: + +- `language` sets the agent language (for more context see [Multilingual Agents](/multilingual)) +- `initial_message` controls the agents first utterance. +- `initial_message_delay` adds a delay to the initial message from when the call begins +- `ask_if_human_present_on_idle` allows the agent to speak when there is more than 4s of silence on the call +- `llm_temperature` controls the behavior of the underlying language model. Values can range from X to Y, with higher + values leading to more consistent replies. + +# Example: creating an agent + +# Example: updating an agent diff --git a/docs/configuring-number.mdx b/docs/configuring-number.mdx index d357d70008..15f1844d44 100644 --- a/docs/configuring-number.mdx +++ b/docs/configuring-number.mdx @@ -1,184 +1,138 @@ --- title: "Configuring your number" -description: "Learn how to configure your phone number with an agent." +description: "Setting up our agent to function as a receptionist" --- -# Configuring Numbers +Now that we have a number set up on Vocode, our agent is ready to start accepting calls. Vocode [Agents](/agents) +have several different parameters we can use to control its behavior. We're going to be setting up our receptionist +by modifying: -Once you have purchased a number, you can configure it with an inbound agent to set its prompt, voice, and actions. +1. Voice -> this is the voice of our agent +2. Prompt -> the prompt is the instruction we give our agent that controls its behavior +3. Actions -> actions are things that the agent **_can do_** like end the conversation or + make an API request to an external service (like a calendar booking software) -## Pick your Number +## Setting up our receptionist -First, list your numbers and pick the number you want to configure. +### Voice - +First, let's create a new voice via [ElevenLabs]("https://elevenlabs.io) and grab the voice ID. -```python Python -numbers = vocode_client.numbers.list_numbers() ``` +voice = vocode_client.voices.create_voice( + request={ + "type": "voice_eleven_labs", + "voice_id": "06oPEcZqPWhZ2IeTcOJc", + "stability": ".2", + "similarity_boost": ".75", + "model_id": "eleven_turbo_v2", + "optimize_streaming_latency": "4", + } +) -```javascript TypeScript -const numbers = await vocode.numbers.listNumbers(); +voice_id = voice.id ``` - - -## Changing the Prompt +For other voice options curated by Vocode, check out our page on [Voices](/voices). Voice clones are also available on demand +for enterprise accounts. -All phone numbers come with the default agent configuration. Let's change the -prompt so the AI responds like Yoda. +### Prompt - +The prompt is how our agent will know what instructions to follow on the call. We're going to set up a prompt suitable for a +receptionist agent and create a prompt object in the API: -```python Python -from vocode import AgentUpdateParams, PromptUpdateParams - -yoda_prompt = PromptUpdateParams(content="I want you to act as Yoda. Respond as Yoda would.") -number = vocode_client.numbers.update_number( - phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(prompt=yoda_prompt) -) ``` +PROMPT = """ +sample prompt +""" -```javascript TypeScript -const yoda_prompt = "I want you to act as Yoda. Respond as Yoda would."; -const number = await vocode.numbers.updateNumber({ - phoneNumber: "YOUR_NUMBER", - inboundAgent: { prompt: { content: yoda_prompt } }, -}); +prompt = vocode_client.prompts.create_prompt(request={"content": PROMPT}) +prompt_id = prompt.id ``` - +For more guidance on how prompts work check out our guide on [Prompt Objects](/prompts) and [Prompt Engineering](/prompt-engineering). -## Changing the Voice +### Actions -Our prompt has been updated. Now let's use a voice provided by other API providers. +Finally, for our receptionist to be complete, we're going to want to give it the ability to actually do two things: -### Rime +1. End the conversation +2. Make an API call to our calendar software to book calendar appointments. - +Let's set up both of these actions using the API: -```python Python -from vocode import RimeVoiceParams +```python -rime_voice = RimeVoiceParams( - type="voice_rime", - speaker="RIME_SPEAKER", +# This action ends the conversation +end_conversation_action = vocode_client.actions.create_action( + request=ActionParamsRequest(type="action_end_conversation", config={}) ) -voice = vocode_client.voices.create_voice(request=rime_voice) -``` - -```javascript TypeScript -const rimeVoice = { - type: "voice_rime", - voiceId: "RIME_SPEAKER", -}; -const number = await vocode.voices.createVoice(rimeVoice); -``` - - -### Play.ht - - - -```python Python -from vocode import PlayHtVoiceParams - -play_ht_voice = PlayHtVoiceParams( - type="voice_play_ht", - voice_id="PLAY_HT_VOICE_ID", - api_user_id="PLAY_HT_USER_ID", - api_key="PLAY_HT_API_KEY", +# This action makes an API call to our calendar endpoint +calendar_action = vocode_client.actions.create_action( + request={ + "type": "action_external", + "config": { + "name": "Meeting_Booking_Assistant", + "description": ("Book a meeting for a 30 minute or 1 hour call."), + "url": "http://example.com/booking", + "speak_on_send": True, + "speak_on_receive": True, + "input_schema": { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"], + }, + "time": { + "type": "string", + "pattern": "^\d{2}:\d0[ap]m$", + }, + }, + }, + }, + }, ) -voice = vocode_client.voices.create_voice(request=play_ht_voice) ``` -```javascript TypeScript -const playHtVoice = { - type: "voice_play_ht", - voiceId: "PLAY_HT_VOICE_ID", - apiUserId: "PLAY_HT_USER_ID", - apiKey: "PLAY_HT_API_KEY, -}; -const number = await vocode.voices.createVoice(playHtVoice); -``` +For more information on how to set up actions, check out our [Actions](/actions) guide and our new beta feature +[External Actions](/external-actions) which we are using here to make the calendar API call. - +## Updating our agent -### ElevenLabs +Now that we've created our voice, prompt, and actions, we can run a query to update our agent as follows. We'll +also add an `initial_message` to our agent to greet people who call in. -We will use the `rachel` voice from ElevenLabs. Instead of updating our existing agent directly, -we'll create a new voice config and set the agent to use it. +We'll have to first grab the `agent_id` in order to make the `agent/update` request. Here's how we can grab it from our +phone number: - - -```python Python -from vocode import ElevenLabsVoiceParams - -elevenlabs_voice = ElevenLabsVoiceParams( - type="voice_eleven_labs", - voice_id="ELEVEN_LABS_VOICE_ID", - api_key="ELEVEN_LABS_API_KEY", -) -voice = vocode_client.voices.create_voice(request=elevenlabs_voice) +```python +number = vocode_client.numbers.get(phone_number="1123456789") +agent_id = number.agent_id +print(agent_id) ``` -```javascript TypeScript -const elevenlabsVoice = { - type: "voice_eleven_labs", - voiceId: "ELEVEN_LABS_VOICE_ID", - apiKey: "ELEVEN_LABS_API_KEY", -}; -const number = await vocode.voices.createVoice(elevenlabsVoice); -``` - - - -Now, we have our `voice_id` and can update our agent to use it. - - +Which should output a UUID for our agent. -```python Python -from vocode import AgentUpdateParams - -agent = vocode_client.agents.update_agent( - id="AGENT_ID", - request=AgentUpdateParams(voice="VOICE_ID"), -) ``` - -```javascript TypeScript -const agent = await vocode.agents.updateAgent({ - id: "AGENT_ID", - body: { voice: "VOICE_ID" }, -}); -console.log(agent); +ad1d802e-12ab-41c7-8726-14e119d6c92c ``` - +And now we can use the `agent_id` in our update request as follows: -## Adding an Initial Message +```python +INITIAL_MESSAGE = "Hi, this is a Vocode scheduling agent, how can I help you?" -The initial message will be spoken as soon as the call starts before the user says anything. Let's make our agent say "Hello, I am Yoda" when the call starts. - - - -```python Python -from vocode import AgentUpdateParams - -number = vocode_client.numbers.update_number( - phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams(initial_message="Hello, I am Yoda.") +update_response = vocode_client.agents.update_agent( + id=agent_id, + request=AgentUpdateParams( + initial_message=INITIAL_MESSAGE, + prompt=prompt_id, + voice=voice_id, + actions=[end_conversation_action_id, external_action_id], + ), ) - -``` - -```javascript TypeScript -import { VocodeClient } from "@vocode/vocode-api"; - -const number = await vocode.numbers.updateNumber({ - phoneNumber: "YOUR_NUMBER", - inboundAgent: { initialMessage: "Hello, I am Yoda." }, -}); ``` - +Now our agent is ready to be a receptionist! Check it out by giving it a call. diff --git a/docs/do-not-call-detection.mdx b/docs/do-not-call-detection.mdx index 5045712472..431a2eac11 100644 --- a/docs/do-not-call-detection.mdx +++ b/docs/do-not-call-detection.mdx @@ -1,5 +1,5 @@ --- -title: "[Beta] Do Not Call detection" +title: "Do Not Call Detection" description: "Configure whether or not to run automatic estimated Do Not Call analysis" --- diff --git a/docs/getting-number.mdx b/docs/getting-number.mdx deleted file mode 100644 index dce7c09b67..0000000000 --- a/docs/getting-number.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Getting a number" ---- - -If you're on the Free plan, you'll have to head to the [dashboard](https://app.vocode.dev) to buy numbers. The Developer and -Enterprise plans both come with numbers included in the subscription. For more info, see [Pricing](https://vocode.dev/pricing). - - - -```python Python -phone_number = vocode_client.numbers.buy_number() -``` - -```typescript TypeScript -const phoneNumber = await vocode.numbers.buyNumber(); -``` - -```bash cURL -curl --request POST \ - --url https://api.vocode.dev/v1/numbers/buy \ - --header 'Content-Type: application/json' \ - --header 'Authorization: Bearer ' -``` - - - -You'll get a response that looks like: - -```json -{ - "id": "***", - "user_id": "***", - "number": "11234567890", - "inbound_agent": {...} -} -``` - -Your phone number is now active! Call the phone number and have a conversation with your AI. diff --git a/docs/hipaa-compliance.mdx b/docs/hipaa-compliance.mdx index c48b4065cd..5a8d9f08a6 100644 --- a/docs/hipaa-compliance.mdx +++ b/docs/hipaa-compliance.mdx @@ -1,5 +1,5 @@ --- -title: "HIPAA Compliance" +title: "[Beta] HIPAA Compliance" --- The `hipaa_compliant` flag in the Vocode outbound calls API configures the system to not diff --git a/docs/machine-detection.mdx b/docs/machine-detection.mdx index d3c81aaa59..15dabcc1c5 100644 --- a/docs/machine-detection.mdx +++ b/docs/machine-detection.mdx @@ -1,5 +1,5 @@ --- -title: "Answering machine detection" +title: "Answering Machine Detection" description: "Define the behavior of the bot when no one answers the phone" --- diff --git a/docs/mint.json b/docs/mint.json index 6a61fbbcf7..405ff47654 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -53,7 +53,11 @@ }, { "group": "Vocode 101", - "pages": ["what-is-vocode", "how-it-works", "how-to-use-it"] + "pages": [ + "open-source/what-is-vocode", + "open-source/how-it-works", + "open-source/how-to-use-it" + ] }, { "group": "Guides", @@ -173,23 +177,39 @@ { "group": "Hosted Walkthrough", "pages": [ - "getting-number", + "walkthrough_intro", + "setting-up-number", "configuring-number", - "retrieve-call-data", + "setting-up-webhook" + ] + }, + { + "group": "Guides", + "pages": [ + "agents", + "prompts", + "prompt-engineering", + "voices", + "webhooks", + "actions", "conversational-dials", - "setting-up-webhook", - "using-actions", - "external-actions", - "vectordb", - "multilingual", - "injecting-context", + "retrieve-call-data", "machine-detection", - "ivr-navigation", - "hipaa-compliance", "do-not-call-detection", "bring-your-own-telephony", "bring-your-own-openai" ] + }, + { + "group": "Beta Features", + "pages": [ + "external-actions", + "multilingual", + "injecting-context", + "ivr-navigation", + "vectordb", + "hipaa-compliance" + ] } ], "api": { diff --git a/docs/how-it-works.mdx b/docs/open-source/how-it-works.mdx similarity index 100% rename from docs/how-it-works.mdx rename to docs/open-source/how-it-works.mdx diff --git a/docs/how-to-use-it.mdx b/docs/open-source/how-to-use-it.mdx similarity index 100% rename from docs/how-to-use-it.mdx rename to docs/open-source/how-to-use-it.mdx diff --git a/docs/what-is-vocode.mdx b/docs/open-source/what-is-vocode.mdx similarity index 90% rename from docs/what-is-vocode.mdx rename to docs/open-source/what-is-vocode.mdx index 3f6c46be8b..1540138e80 100644 --- a/docs/what-is-vocode.mdx +++ b/docs/open-source/what-is-vocode.mdx @@ -1,6 +1,6 @@ --- title: "What is Vocode" -description: "The one-stop solution for building voice applications with language models" +description: "The one-stop solution for building voice Agents" --- # 3 core pieces: diff --git a/docs/prompt-engineering.mdx b/docs/prompt-engineering.mdx new file mode 100644 index 0000000000..9003286ebb --- /dev/null +++ b/docs/prompt-engineering.mdx @@ -0,0 +1,6 @@ +--- +title: "Prompt Engineering" +description: "🚧 Under construction" +--- + +# diff --git a/docs/prompts.mdx b/docs/prompts.mdx new file mode 100644 index 0000000000..e0d470b069 --- /dev/null +++ b/docs/prompts.mdx @@ -0,0 +1,39 @@ +--- +title: "Prompts" +description: "How to instruct your agents" +--- + +# Prompt Basics + +Prompts are instructions that you can write in natural language to instruct Vocode Agents how to behave. In this guide, +we'll cover how prompts are represented in the Vocode API. For best practices on prompting, check out our guide on [Prompt Engineering](/prompt-engineering). + +# Vocode Prompts + +Standard prompts can only contain raw text. Here is an example for how to create a standard prompt: + +```python +PROMPT = """ +sample prompt +""" + +prompt = vocode_client.prompts.create_prompt(request=PromptParams(content=PROMPT)) +``` + +We can assign this to an agent via the agent update endpoint like so: + +```python +update_response = vocode_client.agents.update_agent( + id=agent_id, + request=AgentUpdateParams( + prompt=prompt.id, + ), +) +``` + +# Prompt Engineering + +Prompt engineering is a critical part of setting up your agent correctly. Poorly instructing your agent could cause it to +underperform expectations. + +We've compiled some best practices in our guide for [Prompt Engineering](/prompt-engineering). diff --git a/docs/setting-up-number.mdx b/docs/setting-up-number.mdx new file mode 100644 index 0000000000..33cda50723 --- /dev/null +++ b/docs/setting-up-number.mdx @@ -0,0 +1,79 @@ +--- +title: "Setting up your number" +--- + +We're going to start by getting a number that we can use for our receptionist. There are two ways to get numbers compatible +with Vocode: + +1. Linking your own telephony provider via [BYO Telephony](/bring-your-own-telephony). +2. Purchasing a number directly via Vocode telephony. + +If you're on the Free plan, you'll have to upgrade your account in order to either purchase numbers via Vocode telephony or +to link your own Twilio account via [BYO Telephony](/bring-your-own-telephony). + +# Linking your own Twilio numbers + +You can link your own telephony account once you've upgraded your plan by following the +documentation in [BYO Telephony](/bring-your-own-telephony). We'll quickly walk through the steps here for adding your own +Twilio account. + +First, we're going to link our Twilio account via [Account Connections](/account-connections). + +```python +account_connection = vocode_client.account_connections.create_account_connection( + request={ + "type": "account_connection_twilio", + "credentials": { + "twilio_account_sid": os.getenv("TWILIO_ACCOUNT_SID"), + "twilio_auth_token": os.getenv("TWILIO_AUTH_TOKEN"), + }, + } +) +``` + +Now, once we have a phone number from our Twilio account, we can link it to Vocode using the link number functionality. + +```python +number_to_link = "1123456789" +print( + vocode_client.numbers.link_number( + phone_number=number_to_link, + telephony_account_connection=account_connection_id, + ) +) +``` + +# Buying a number + +You can use the `numbers/buy` endpoint to purchase numbers via Vocode telephony or via your own account connection. Here, +we purchase one using Vocode telephony. + + + +```python Python +phone_number = vocode_client.numbers.buy_number(BuyPhoneNumberRequest(area_code="415", telephony_provider="twilio")) +``` + +```typescript TypeScript +const phoneNumber = await vocode.numbers.buyNumber(); +``` + + + +You can specify which telephony provider you want to use, the current supported options are: `twilio` and `vonage`. + +You'll get a response that looks like: + +```json +{ + "id": "***", + "user_id": "***", + "number": "11234567890", + "inbound_agent": {...}, + "telephony_provider": "twilio", + "telephony_account_connection": null, + ... +} +``` + +Your phone number is now active! Let's start configuring the number to work as our receptionist. diff --git a/docs/setting-up-webhook.mdx b/docs/setting-up-webhook.mdx index 4f56f40f92..f3c29a7b7b 100644 --- a/docs/setting-up-webhook.mdx +++ b/docs/setting-up-webhook.mdx @@ -1,17 +1,14 @@ --- -title: "Setting up webhooks" -description: "Listen to events on your phone calls" +title: "Setting up a webhook" --- -You can set up webhooks on agents so that you can -listen to events in realtime or for post-call automation. +Now that we have our receptionist Agent configured, we want to set up an automation so that every time we +receive a call, we can process the results once the call has ended. -## Adding Webhooks +## Setting up our webhook -To get data from the agent during a call, you can add a webhook and assign it to listen for specific events. -Let's send a POST request to "https://example.com" every time a call ends. - - +We'll use the [Webhooks](/webhooks) feature on the Agent to configure our automations. First, let's create a +webhook that posts to `"https://example.com"` every time a call ends. ```python Python from vocode import AgentUpdateParams, EventType, HttpMethod, WebhookUpdateParams @@ -21,40 +18,37 @@ new_webhook = WebhookUpdateParams( url="https://example.com", method=HttpMethod.POST, ) +``` -number = vocode_client.numbers.update_number( - phone_number="YOUR_NUMBER", - inbound_agent=AgentUpdateParams( - webhook=new_webhook, +Now, we can add this to our Agent by using the `agent/update` endpoint like before: + +```python Python +update_response = vocode_client.agents.update_agent( + id=agent_id, + request=AgentUpdateParams( + webhook=new_webhook.id ), ) ``` -```javascript TypeScript -import { EventType, HttpMethod } from "@vocode/vocode-api/api"; - -const number = await vocode.numbers.updateNumber({ - phoneNumber: "YOUR_NUMBER", - inboundAgent: { - webhook: { - subscriptions: [EventType.EventPhoneCallConnected], - url: "https://example.com", - method: HttpMethod.Post, - }, - }, -}); -``` +## Sample webhook server + +In order to process the result of our webhook, we can set up a simple endpoint to receive +webhook messages from Vocode. In this example, our webhook server will listen for `PHONE_CALL_ENDED` +events and send notifications. - +The webhook event body looks like this -## EventTypes +```python +{ + call_id: CALL_ID, + event: +} +``` -The full list of `EventType` is listed here: +```python +def process_webhook(event): + send_notification(event.call_id) +``` -- `EVENT_MESSAGE`: A message in the conversation. -- `EVENT_ACTION`: An action taken during the conversation. -- `EVENT_PHONE_CALL_CONNECTED`: Indicating the phone call has connected. -- `EVENT_PHONE_CALL_ENDED`: Indicating the phone call has ended. -- `EVENT_TRANSCRIPT`: The transcription of the entire conversation. -- `EVENT_RECORDING`: The recording of the conversation has become available. -- `EVENT_HUMAN_DETECTION`: Indicating whether a human or a machine has picked up the phone. +For a full list of webhook events and other capabilities, check out our guide on [Webhooks](/webhooks). diff --git a/docs/vectordb.mdx b/docs/vectordb.mdx index efcc3eb7b3..69d27072e4 100644 --- a/docs/vectordb.mdx +++ b/docs/vectordb.mdx @@ -1,5 +1,5 @@ --- -title: "Vector databases" +title: "[Beta] Vector databases" description: "Give your agents knowledge via embeddings" --- diff --git a/docs/voices.mdx b/docs/voices.mdx new file mode 100644 index 0000000000..02b236a44d --- /dev/null +++ b/docs/voices.mdx @@ -0,0 +1,44 @@ +--- +title: "Voices" +description: "Make your agents sound the way you want them to" +--- + +# Voice Basics + +Vocode supports several different TTS models, giving you maximum flexibility and control +over the voice of your agents. Our current list of supported model providers is: + +- [Play.ht](https://play.ht) +- [ElevenLabs](https://elevenlabs.io) +- [Rime](https://rime.ai) +- [Azure](https://azure.com) + +## Vocode curated voices + +Choosing a voice isn't easy, so the Vocode team has curated a list of voices that we think are the best +across the different providers and use cases. These can be found here: + +[] + +We also are compatible with any stock voice from our provider list. You can reach us on Slack and we can add it to our +voice list. + +## Voice clones + +For enterprise customers, we can add cloned voices on a case-by-case basis. Please reach out to us on Slack if you'd like +to explore custom cloned voices. + +## Setting up your voides + +### Play.ht voice + +### ElevenLabs voice + +### Rime voice + +### Azure voice + +### [Legacy] BYO TTS + +In previous versions of Vocode, we allowed customers to bring their own TTS accounts +but we are no longer supporting this as of April 2024. diff --git a/docs/walkthrough_intro.mdx b/docs/walkthrough_intro.mdx new file mode 100644 index 0000000000..7cb3ab26a0 --- /dev/null +++ b/docs/walkthrough_intro.mdx @@ -0,0 +1,20 @@ +--- +title: "Intro" +description: "Setting up a simple receptionist agent" +--- + +Welcome to the Vocode API! We've got a lot of powerful features that we're going to illustrate +by setting up a receptionist agent that can take calls and book calendar appointments. + +We'll cover how to do it step-by-step entirely via API or you could also follow along usig our +[Dashboard]("https://dashboard.vocode.dev). + +In particular, we'll go through the following steps: + +1. Setting up a phone number +2. Configuring the number with an inbound agent +3. Modifying the agent prompt, voice, and actions +4. Setting up a webhook to listen to call updates +5. Retrieving call data via API + +Let's start with setting up our phone number. diff --git a/docs/webhooks.mdx b/docs/webhooks.mdx index 8a8437ca16..20ce37e07d 100644 --- a/docs/webhooks.mdx +++ b/docs/webhooks.mdx @@ -1,4 +1,60 @@ --- title: "Webhooks" -description: "🚧 Under construction" +description: "Listen to events on your phone calls and set up automations" --- + +You can set up webhooks on agents so that you can +listen to events in realtime or for post-call automation. + +## Adding Webhooks + +To get data from the agent during a call, you can add a webhook and assign it to listen for specific events. +Let's send a POST request to "https://example.com" every time a call ends. + + + +```python Python +from vocode import AgentUpdateParams, EventType, HttpMethod, WebhookUpdateParams + +new_webhook = WebhookUpdateParams( + subscriptions=[EventType.EVENT_PHONE_CALL_ENDED], + url="https://example.com", + method=HttpMethod.POST, +) + +number = vocode_client.numbers.update_number( + phone_number="YOUR_NUMBER", + inbound_agent=AgentUpdateParams( + webhook=new_webhook, + ), +) +``` + +```javascript TypeScript +import { EventType, HttpMethod } from "@vocode/vocode-api/api"; + +const number = await vocode.numbers.updateNumber({ + phoneNumber: "YOUR_NUMBER", + inboundAgent: { + webhook: { + subscriptions: [EventType.EventPhoneCallConnected], + url: "https://example.com", + method: HttpMethod.Post, + }, + }, +}); +``` + + + +## EventTypes + +The full list of `EventType` is listed here: + +- `EVENT_MESSAGE`: A message in the conversation. +- `EVENT_ACTION`: An action taken during the conversation. +- `EVENT_PHONE_CALL_CONNECTED`: Indicating the phone call has connected. +- `EVENT_PHONE_CALL_ENDED`: Indicating the phone call has ended. +- `EVENT_TRANSCRIPT`: The transcription of the entire conversation. +- `EVENT_RECORDING`: The recording of the conversation has become available. +- `EVENT_HUMAN_DETECTION`: Indicating whether a human or a machine has picked up the phone. From 3f97e3982c473874204ee75563baa8ce4cd22b52 Mon Sep 17 00:00:00 2001 From: Kian Date: Fri, 19 Apr 2024 18:46:34 -0700 Subject: [PATCH 071/148] remove unused files --- ...hrase-triggers.mdx => action-triggers.mdx} | 16 +- docs/actions.mdx | 219 +++++++++++++++++- docs/agents.mdx | 8 +- docs/call-object.mdx | 4 - docs/inbound-calls.mdx | 8 - docs/mint.json | 4 +- docs/outbound-calls.mdx | 4 - docs/setting-up-webhook.mdx | 18 +- docs/voices.mdx | 41 +++- docs/welcome.mdx | 2 +- 10 files changed, 270 insertions(+), 54 deletions(-) rename docs/{phrase-triggers.mdx => action-triggers.mdx} (82%) delete mode 100644 docs/call-object.mdx delete mode 100644 docs/inbound-calls.mdx delete mode 100644 docs/outbound-calls.mdx diff --git a/docs/phrase-triggers.mdx b/docs/action-triggers.mdx similarity index 82% rename from docs/phrase-triggers.mdx rename to docs/action-triggers.mdx index 4fe434ffa9..3dd2015239 100644 --- a/docs/phrase-triggers.mdx +++ b/docs/action-triggers.mdx @@ -1,11 +1,13 @@ --- -title: "[Beta] Phrase Triggers" -description: "Configure Vocode actions to run based on spoken phrases by the agent" +title: "Action Triggers" +description: "Configure Vocode actions to run based on different triggers" --- +# Phrase Triggers + Phrase triggers allow users to more explicitly control the behavior of their agents by configuring actions to run only once a bot has spoken a particular phrase. For example, you can configure an agent to transfer a call to a human agent only after the bot has said "I will transfer now". -# Creating a phrase trigger +## Creating a phrase trigger You can create a phrase trigger as follows: @@ -36,7 +38,7 @@ In this example, the action that this phrase trigger is attached to will fire on `"phrase_condition_type_contains"` is the only condition type supported at this time, and does not match case, so in the above example, if the bot said "Okay, you can speak to a human now", the phrase trigger would still fire. -# Configuring your action +## Configuring your action ```python from vocode import ( @@ -57,7 +59,11 @@ vocode_client.agents.update_agent( ) ``` -To switch back to the default behavior, use a `FunctionCallActionTrigger`. +# [Default] Function Call Triggers + +To switch back to the default behavior, use a `FunctionCallActionTrigger`. These are open ended, meaning the +Agent will decide when to use the action based on its prompting. Note that is is primarily achieved via the [Prompt](/prompts) +but for [External Actions](/external-actions), it is also dependent on the description field. ```python from vocode import FunctionCallActionTrigger diff --git a/docs/actions.mdx b/docs/actions.mdx index 3887640974..c58d5c8111 100644 --- a/docs/actions.mdx +++ b/docs/actions.mdx @@ -1,6 +1,221 @@ --- title: "Actions" -description: "🚧 Under construction" +description: "Give your agents the ability to execute actions" --- -# +Vocode agents can decide to take actions synchronously during calls. There are two ways to configure actions: + +1. Phrase Triggers +2. Function Call Triggers (default) + +See [Action Triggers](/action-triggers) for information on how to configure triggers. Below is the list of actions that an agent can perform: + +#### EndConversation + +`EndConversation` allows the agent to end the call, e.g. if the user says "Goodbye!" + + + +```python Python +vocode_client.actions.create_action( + request={ + "type": "action_end_conversation", + } +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_end_conversation", +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_end_conversation" +}' +``` + + + +#### DTMF + +`DTMF` allows the agent to hit dial tones during a call, e.g. navigating a phone tree + + + +```python Python +vocode_client.actions.create_action( + request={ + "type":"action_dtmf", + } +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_dtmf", +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_dtmf" +}' +``` + + + +#### TransferCall + +`TransferCall` allows the agent to transfer the call to another phone number + + + +```python Python +vocode_client.actions.create_action( + request={ + "type":"action_transfer_call", + "config":{ + "phone_number":"11234567890" + } + } +) +``` + +```typescript TypeScript +const number = await vocode.actions.createAction({ + type: "action_transfer_call", + config: { + phoneNumber: "11234567890", + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/actions/create \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "type": "action_transfer_call", + "config": { + "phone_number": "11234567890" + } +}' +``` + + + +You can attach these as IDs to your phone number agent as follows: + + + +```python Python +from vocode import AgentUpdateParams + +vocode_client.numbers.update_number( + phone_number="11234567890", + inbound_agent=AgentUpdateParams( + actions=[""] + ) +) +``` + +```typescript TypeScript +vocode.numbers.updateNumber({ + phoneNumber: "11234567890", + inboundAgent: { + actions: [""], + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/numbers/update?phone_number=11234567890 \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "inbound_agent": { + "actions": [""] + } +}' +``` + + + +You can also add these as actions as raw payloads as follows: + + + +```python Python +from vocode import AgentUpdateParams, TransferCallActionUpdateParams + +vocode_client.numbers.update_number( + phone_number="11234567890", + inbound_agent=AgentUpdateParams( + actions=[TransferCallActionUpdateParams( + type="action_transfer_call", + config={ + "phone_number":"11234567890" + } + )] + ) +) +``` + +```typescript TypeScript +vocode.numbers.updateNumber({ + phoneNumber: "11234567890", + inboundAgent: { + actions: [ + { + type: "action_transfer_call", + config: { + phoneNumber: "11234567890", + }, + }, + ], + }, +}); +``` + +```bash cURL +curl --request POST \ + --url https://api.vocode.dev/v1/numbers/update?phone_number=11234567890 \ + --header 'Content-Type: application/json' \ + --header 'Authorization: Bearer ' + --data '{ + "inbound_agent": { + "actions": [{ + "type": "action_transfer_call", + "config": { + "phone_number": "11234567890" + } + }] + } +}' +``` + + + +#### [Beta] ExternalAction + +`ExternalAction` allows your agent communicate with an External API and include the response as context in the conversation. + +See [External Actions](/external-actions). + +#### [Beta] Warm Transfer + +Allows your agent to conference in another party into the call. + +See [Warm Transfer](/warm-transfer). diff --git a/docs/agents.mdx b/docs/agents.mdx index 347a69da4f..6dc809afae 100644 --- a/docs/agents.mdx +++ b/docs/agents.mdx @@ -30,9 +30,5 @@ agent behavior: - `initial_message` controls the agents first utterance. - `initial_message_delay` adds a delay to the initial message from when the call begins - `ask_if_human_present_on_idle` allows the agent to speak when there is more than 4s of silence on the call -- `llm_temperature` controls the behavior of the underlying language model. Values can range from X to Y, with higher - values leading to more consistent replies. - -# Example: creating an agent - -# Example: updating an agent +- `llm_temperature` controls the behavior of the underlying language model. Values can range from 0 to 1, with higher + values leading to more diverse and creative results. Lower values generate more consistent outputs. diff --git a/docs/call-object.mdx b/docs/call-object.mdx deleted file mode 100644 index 1dd1cab4f9..0000000000 --- a/docs/call-object.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Call Object" -description: "🚧 Under construction" ---- \ No newline at end of file diff --git a/docs/inbound-calls.mdx b/docs/inbound-calls.mdx deleted file mode 100644 index c13b581bf4..0000000000 --- a/docs/inbound-calls.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Inbound Calls" -description: "🚧 Under construction" ---- - -# Buying a number - -# Configuring a number diff --git a/docs/mint.json b/docs/mint.json index 45cd2d123a..bd97c3dbd9 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -192,10 +192,9 @@ "voices", "webhooks", "actions", + "action-triggers", "conversational-dials", "retrieve-call-data", - "phrase-triggers", - "warm-transfer", "machine-detection", "do-not-call-detection", "bring-your-own-telephony", @@ -206,6 +205,7 @@ "group": "Beta Features", "pages": [ "external-actions", + "warm-transfer", "multilingual", "injecting-context", "ivr-navigation", diff --git a/docs/outbound-calls.mdx b/docs/outbound-calls.mdx deleted file mode 100644 index 58b62757d1..0000000000 --- a/docs/outbound-calls.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Outbound Calls" -description: "🚧 Under construction" ---- diff --git a/docs/setting-up-webhook.mdx b/docs/setting-up-webhook.mdx index f3c29a7b7b..2505729c5b 100644 --- a/docs/setting-up-webhook.mdx +++ b/docs/setting-up-webhook.mdx @@ -34,21 +34,7 @@ update_response = vocode_client.agents.update_agent( ## Sample webhook server In order to process the result of our webhook, we can set up a simple endpoint to receive -webhook messages from Vocode. In this example, our webhook server will listen for `PHONE_CALL_ENDED` -events and send notifications. - -The webhook event body looks like this - -```python -{ - call_id: CALL_ID, - event: -} -``` - -```python -def process_webhook(event): - send_notification(event.call_id) -``` +webhook messages from Vocode. [Webhook.site](https://webhook.site) makes it very easy to set up +a sample endpoint. For a full list of webhook events and other capabilities, check out our guide on [Webhooks](/webhooks). diff --git a/docs/voices.mdx b/docs/voices.mdx index 02b236a44d..ea7ecdd2a8 100644 --- a/docs/voices.mdx +++ b/docs/voices.mdx @@ -13,12 +13,10 @@ over the voice of your agents. Our current list of supported model providers is: - [Rime](https://rime.ai) - [Azure](https://azure.com) -## Vocode curated voices +## [Coming Soon] Vocode curated voices Choosing a voice isn't easy, so the Vocode team has curated a list of voices that we think are the best -across the different providers and use cases. These can be found here: - -[] +across the different providers and use cases. We also are compatible with any stock voice from our provider list. You can reach us on Slack and we can add it to our voice list. @@ -28,15 +26,46 @@ voice list. For enterprise customers, we can add cloned voices on a case-by-case basis. Please reach out to us on Slack if you'd like to explore custom cloned voices. -## Setting up your voides +## Setting up new voices ### Play.ht voice +```python +voice = vocode_client.voices.create_voice( + request={ + "type": "voice_play_ht", + "voice_id": "voice_id", + "version": "2", + }, +) +``` + ### ElevenLabs voice +```python +voice = vocode_client.voices.create_voice( + request={ + "type": "voice_eleven_labs", + "voice_id": "06oPEcZqPWhZ2IeTcOJc", + "stability": ".2", + "similarity_boost": ".75", + "model_id": "eleven_turbo_v2", + "optimize_streaming_latency": "4", + } +) +``` + ### Rime voice -### Azure voice +```python +voice = vocode_client.voices.create_voice( + request={ + "type": "voice_rime", + "speaker": "amber", + "model_id": "mist", + }, +) +``` ### [Legacy] BYO TTS diff --git a/docs/welcome.mdx b/docs/welcome.mdx index 33d2bd0117..e3e41f0bca 100644 --- a/docs/welcome.mdx +++ b/docs/welcome.mdx @@ -1,7 +1,7 @@ --- title: "Vocode" sidebarTitle: "Welcome" -description: "Vocode is an open-source library for building voice-based LLM applications." +description: "Vocode is an open-source library for building voice Agents." --- ## Introduction From cfd2eb44308cfe28136b409e22706bd5465b6c46 Mon Sep 17 00:00:00 2001 From: Sebastian Rojo Date: Fri, 3 May 2024 17:27:36 -0500 Subject: [PATCH 072/148] =?UTF-8?q?Update=20Black=20and=20lint=20the=20cod?= =?UTF-8?q?ebase=20to=20improve=20code=20quality=20and=20consis=E2=80=A6?= =?UTF-8?q?=20(#541)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Black and lint the codebase to improve code quality and consistency, closes #450 * Remove logger from telephony_server initialization --- .pre-commit-config.yaml | 24 ++++----- apps/telephony_app/main.py | 1 - contributing.md | 2 +- playground/streaming/tracing_utils.py | 13 ++--- poetry.lock | 54 +++++++++---------- pyproject.toml | 2 +- vocode/helpers.py | 8 +-- vocode/streaming/action/transfer_call.py | 4 +- vocode/streaming/action/worker.py | 16 +++--- vocode/streaming/agent/base_agent.py | 12 ++--- vocode/streaming/agent/factory.py | 2 +- vocode/streaming/agent/gpt4all_agent.py | 8 +-- vocode/streaming/agent/utils.py | 24 +++++---- .../streaming/client_backend/conversation.py | 8 +-- vocode/streaming/models/events.py | 2 +- .../output_device/base_output_device.py | 2 +- .../output_device/websocket_output_device.py | 1 - .../streaming/synthesizer/base_synthesizer.py | 12 ++--- .../transcriber/assembly_ai_transcriber.py | 23 ++++++-- .../transcriber/azure_transcriber.py | 6 +-- .../streaming/transcriber/base_transcriber.py | 1 + vocode/streaming/utils/__init__.py | 4 +- .../utils/conversation_logger_adapter.py | 6 ++- .../synthesizer/base_synthesizer.py | 1 + .../synthesizer/coqui_synthesizer.py | 32 ++++++----- 25 files changed, 151 insertions(+), 117 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 939b311ee2..7b36c0a0bd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ repos: -- repo: https://github.com/psf/black - rev: 23.1.0 - hooks: - - id: black -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.8.0 - hooks: - - id: mypy - args: [--ignore-missing-imports, ./] - language: system - pass_filenames: false - stages: [pre-push] + - repo: https://github.com/psf/black + rev: 24.4.2 + hooks: + - id: black + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy + args: [--ignore-missing-imports, ./] + language: system + pass_filenames: false + stages: [pre-push] diff --git a/apps/telephony_app/main.py b/apps/telephony_app/main.py index d44d46f155..b6ed34cbef 100644 --- a/apps/telephony_app/main.py +++ b/apps/telephony_app/main.py @@ -73,7 +73,6 @@ account_sid=os.environ["TWILIO_ACCOUNT_SID"], auth_token=os.environ["TWILIO_AUTH_TOKEN"], ), - logger=logger, ) ], agent_factory=SpellerAgentFactory(), diff --git a/contributing.md b/contributing.md index ba601c21d9..69cd6a98c7 100644 --- a/contributing.md +++ b/contributing.md @@ -40,7 +40,7 @@ If you submit a PR, we'd love to feature your contribution on Twitter so please ## Linting and Typechecking -We use [`black`](https://black.readthedocs.io/en/stable/) for linting. If you're using VSCode, code should auto-format automatically. Otherwise, run the following script before pushing: +We use [`black`](https://black.readthedocs.io/en/stable/) for linting. If you're using [VSCode](https://code.visualstudio.com/docs/editor/codebasics#_formatting), code should auto-format automatically. Otherwise, run the following script before pushing: ``` make lint_diff diff --git a/playground/streaming/tracing_utils.py b/playground/streaming/tracing_utils.py index c6b543c5ff..a923437842 100644 --- a/playground/streaming/tracing_utils.py +++ b/playground/streaming/tracing_utils.py @@ -51,12 +51,13 @@ def get_final_metrics(scope_metrics, final_spans=None): agent_str = metric_name.split(".", 1)[1].rsplit(".", 1)[0] generate_total_key = f"agent.{agent_str}.generate_total" respond_total_key = f"agent.{agent_str}.respond_total" - final_metrics[ - f"agent.{agent_str}.characters_per_second" - ] = raw_metric.value / ( - sum(final_spans[generate_total_key]) - if generate_total_key in final_spans - else sum(final_spans[respond_total_key]) + final_metrics[f"agent.{agent_str}.characters_per_second"] = ( + raw_metric.value + / ( + sum(final_spans[generate_total_key]) + if generate_total_key in final_spans + else sum(final_spans[respond_total_key]) + ) ) else: try: diff --git a/poetry.lock b/poetry.lock index acdb3a03b0..04b2b07965 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "aiohttp" @@ -289,33 +289,33 @@ files = [ [[package]] name = "black" -version = "23.7.0" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.7.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f"}, - {file = "black-23.7.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be"}, - {file = "black-23.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc"}, - {file = "black-23.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd"}, - {file = "black-23.7.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a"}, - {file = "black-23.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926"}, - {file = "black-23.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3"}, - {file = "black-23.7.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6"}, - {file = "black-23.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a"}, - {file = "black-23.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3"}, - {file = "black-23.7.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087"}, - {file = "black-23.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91"}, - {file = "black-23.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491"}, - {file = "black-23.7.0-py3-none-any.whl", hash = "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96"}, - {file = "black-23.7.0.tar.gz", hash = "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -325,11 +325,11 @@ packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -3796,4 +3796,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "b4f87f3ba43e7fe33f78e8f0e14272167fbb1bb437d73cbfb3cae86e9afb98bd" +content-hash = "69f7c4477423f9ac80c4ad74767eb35a1b001498da8d9b207c3d00f0cab832ff" diff --git a/pyproject.toml b/pyproject.toml index e367dfe4cb..e43119d8bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ langchain-community = "^0.0.16" [tool.poetry.group.lint.dependencies] -black = "^23.1.0" +black = "^24.4.2" [tool.poetry.group.dev.dependencies] diff --git a/vocode/helpers.py b/vocode/helpers.py index 97639bffae..ac95014ffc 100644 --- a/vocode/helpers.py +++ b/vocode/helpers.py @@ -40,9 +40,11 @@ def create_streaming_microphone_input_and_speaker_output( ): return _create_microphone_input_and_speaker_output( microphone_class=StreamingMicrophoneInput, - speaker_class=BlockingStreamingSpeakerOutput - if use_blocking_speaker_output - else StreamingSpeakerOutput, + speaker_class=( + BlockingStreamingSpeakerOutput + if use_blocking_speaker_output + else StreamingSpeakerOutput + ), use_default_devices=use_default_devices, input_device_name=input_device_name, output_device_name=output_device_name, diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index efc6b67068..e9aff02528 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -31,7 +31,9 @@ class TransferCall( TransferCallActionConfig, TransferCallParameters, TransferCallResponse ] ): - description: str = "transfers the call. use when you need to connect the active call to another phone line." + description: str = ( + "transfers the call. use when you need to connect the active call to another phone line." + ) parameters_type: Type[TransferCallParameters] = TransferCallParameters response_type: Type[TransferCallResponse] = TransferCallResponse diff --git a/vocode/streaming/action/worker.py b/vocode/streaming/action/worker.py index 4bc5f309df..6ca876f6b2 100644 --- a/vocode/streaming/action/worker.py +++ b/vocode/streaming/action/worker.py @@ -46,12 +46,16 @@ async def process(self, item: InterruptibleEvent[ActionInput]): conversation_id=action_input.conversation_id, action_input=action_input, action_output=action_output, - vonage_uuid=action_input.vonage_uuid - if isinstance(action_input, VonagePhoneCallActionInput) - else None, - twilio_sid=action_input.twilio_sid - if isinstance(action_input, TwilioPhoneCallActionInput) - else None, + vonage_uuid=( + action_input.vonage_uuid + if isinstance(action_input, VonagePhoneCallActionInput) + else None + ), + twilio_sid=( + action_input.twilio_sid + if isinstance(action_input, TwilioPhoneCallActionInput) + else None + ), is_quiet=action.quiet, ) ) diff --git a/vocode/streaming/agent/base_agent.py b/vocode/streaming/agent/base_agent.py index 8c2b5c2f3a..b39d40013d 100644 --- a/vocode/streaming/agent/base_agent.py +++ b/vocode/streaming/agent/base_agent.py @@ -140,9 +140,9 @@ def __init__( interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), logger: Optional[logging.Logger] = None, ): - self.input_queue: asyncio.Queue[ - InterruptibleEvent[AgentInput] - ] = asyncio.Queue() + self.input_queue: asyncio.Queue[InterruptibleEvent[AgentInput]] = ( + asyncio.Queue() + ) self.output_queue: asyncio.Queue[ InterruptibleAgentResponseEvent[AgentResponse] ] = asyncio.Queue() @@ -154,9 +154,9 @@ def __init__( interruptible_event_factory=interruptible_event_factory, ) self.action_factory = action_factory - self.actions_queue: asyncio.Queue[ - InterruptibleEvent[ActionInput] - ] = asyncio.Queue() + self.actions_queue: asyncio.Queue[InterruptibleEvent[ActionInput]] = ( + asyncio.Queue() + ) self.logger = logger or logging.getLogger(__name__) self.goodbye_model = None if self.agent_config.end_conversation_on_goodbye: diff --git a/vocode/streaming/agent/factory.py b/vocode/streaming/agent/factory.py index 3cd0f162f4..6acd75af10 100644 --- a/vocode/streaming/agent/factory.py +++ b/vocode/streaming/agent/factory.py @@ -20,7 +20,7 @@ InformationRetrievalAgentConfig, LLMAgentConfig, RESTfulUserImplementedAgentConfig, - LlamacppAgentConfig + LlamacppAgentConfig, ) diff --git a/vocode/streaming/agent/gpt4all_agent.py b/vocode/streaming/agent/gpt4all_agent.py index 3847190c69..61087fb8f3 100644 --- a/vocode/streaming/agent/gpt4all_agent.py +++ b/vocode/streaming/agent/gpt4all_agent.py @@ -10,9 +10,11 @@ def __init__(self, agent_config: GPT4AllAgentConfig): self.turn_based_agent = TurnBasedGPT4AllAgent( model_path=agent_config.model_path, system_prompt=agent_config.prompt_preamble, - initial_message=agent_config.initial_message.text - if agent_config.initial_message - else None, + initial_message=( + agent_config.initial_message.text + if agent_config.initial_message + else None + ), ) async def respond( diff --git a/vocode/streaming/agent/utils.py b/vocode/streaming/agent/utils.py index 31b4864fc9..0ce4df77fe 100644 --- a/vocode/streaming/agent/utils.py +++ b/vocode/streaming/agent/utils.py @@ -50,9 +50,11 @@ async def collate_response_async( possible_list_item = bool(re.match(r"^\d+[ .]", buffer)) ends_with_money = bool(re.findall(r"\$\d+.$", buffer)) if re.findall( - list_item_ending_pattern - if possible_list_item - else sentence_endings_pattern, + ( + list_item_ending_pattern + if possible_list_item + else sentence_endings_pattern + ), token, ): if not ends_with_money: @@ -88,12 +90,16 @@ async def openai_get_tokens(gen) -> AsyncGenerator[Union[str, FunctionFragment], yield token elif "function_call" in delta and delta["function_call"] is not None: yield FunctionFragment( - name=delta["function_call"]["name"] - if "name" in delta["function_call"] - else "", - arguments=delta["function_call"]["arguments"] - if "arguments" in delta["function_call"] - else "", + name=( + delta["function_call"]["name"] + if "name" in delta["function_call"] + else "" + ), + arguments=( + delta["function_call"]["arguments"] + if "arguments" in delta["function_call"] + else "" + ), ) diff --git a/vocode/streaming/client_backend/conversation.py b/vocode/streaming/client_backend/conversation.py index 1d7b008739..da3a2be0d0 100644 --- a/vocode/streaming/client_backend/conversation.py +++ b/vocode/streaming/client_backend/conversation.py @@ -78,9 +78,11 @@ def get_conversation( agent=self.agent_thunk(), synthesizer=synthesizer, conversation_id=start_message.conversation_id, - events_manager=TranscriptEventManager(output_device, self.logger) - if start_message.subscribe_transcript - else None, + events_manager=( + TranscriptEventManager(output_device, self.logger) + if start_message.subscribe_transcript + else None + ), logger=self.logger, ) diff --git a/vocode/streaming/models/events.py b/vocode/streaming/models/events.py index aa0c9883d8..9d9a143a92 100644 --- a/vocode/streaming/models/events.py +++ b/vocode/streaming/models/events.py @@ -38,4 +38,4 @@ class RecordingEvent(Event, type=EventType.RECORDING): class ActionEvent(Event, type=EventType.ACTION): action_input: Optional[dict] = None - action_output: Optional[dict] = None \ No newline at end of file + action_output: Optional[dict] = None diff --git a/vocode/streaming/output_device/base_output_device.py b/vocode/streaming/output_device/base_output_device.py index 123ad04f9f..52bb7bcbe1 100644 --- a/vocode/streaming/output_device/base_output_device.py +++ b/vocode/streaming/output_device/base_output_device.py @@ -11,7 +11,7 @@ def start(self): def consume_nonblocking(self, chunk: bytes): raise NotImplemented - + def maybe_send_mark_nonblocking(self, message): pass diff --git a/vocode/streaming/output_device/websocket_output_device.py b/vocode/streaming/output_device/websocket_output_device.py index 3518564df8..53f82f622d 100644 --- a/vocode/streaming/output_device/websocket_output_device.py +++ b/vocode/streaming/output_device/websocket_output_device.py @@ -9,7 +9,6 @@ from vocode.streaming.models.transcript import TranscriptEvent - class WebsocketOutputDevice(BaseOutputDevice): def __init__( self, ws: WebSocket, sampling_rate: int, audio_encoding: AudioEncoding diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 99733fbdc8..0ca78464a8 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -248,12 +248,12 @@ async def experimental_mp3_streaming_output_generator( chunk_size: int, create_speech_span: Optional[Span], ) -> AsyncGenerator[SynthesisResult.ChunkResult, None]: - miniaudio_worker_input_queue: asyncio.Queue[ - Union[bytes, None] - ] = asyncio.Queue() - miniaudio_worker_output_queue: asyncio.Queue[ - Tuple[bytes, bool] - ] = asyncio.Queue() + miniaudio_worker_input_queue: asyncio.Queue[Union[bytes, None]] = ( + asyncio.Queue() + ) + miniaudio_worker_output_queue: asyncio.Queue[Tuple[bytes, bool]] = ( + asyncio.Queue() + ) miniaudio_worker = MiniaudioWorker( self.synthesizer_config, chunk_size, diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index a1ee818adf..9d18e0a26a 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -8,7 +8,11 @@ from urllib.parse import urlencode from vocode import getenv -from vocode.streaming.models.transcriber import AssemblyAITranscriberConfig, TimeEndpointingConfig, PunctuationEndpointingConfig +from vocode.streaming.models.transcriber import ( + AssemblyAITranscriberConfig, + TimeEndpointingConfig, + PunctuationEndpointingConfig, +) from vocode.streaming.models.websocket import AudioMessage from vocode.streaming.transcriber.base_transcriber import ( BaseAsyncTranscriber, @@ -57,13 +61,22 @@ def __init__( self.buffer = bytearray() self.audio_cursor = 0 - if isinstance(self.transcriber_config.endpointing_config, (TimeEndpointingConfig, PunctuationEndpointingConfig)): - self.transcriber_config.end_utterance_silence_threshold_milliseconds = int(self.transcriber_config.endpointing_config.time_cutoff_seconds * 1000) + if isinstance( + self.transcriber_config.endpointing_config, + (TimeEndpointingConfig, PunctuationEndpointingConfig), + ): + self.transcriber_config.end_utterance_silence_threshold_milliseconds = int( + self.transcriber_config.endpointing_config.time_cutoff_seconds * 1000 + ) self.terminate_msg = json.dumps({"terminate_session": True}) self.end_utterance_silence_threshold_msg = ( - None if self.transcriber_config.end_utterance_silence_threshold_milliseconds is None + None + if self.transcriber_config.end_utterance_silence_threshold_milliseconds + is None else json.dumps( - {"end_utterance_silence_threshold": self.transcriber_config.end_utterance_silence_threshold_milliseconds} + { + "end_utterance_silence_threshold": self.transcriber_config.end_utterance_silence_threshold_milliseconds + } ) ) diff --git a/vocode/streaming/transcriber/azure_transcriber.py b/vocode/streaming/transcriber/azure_transcriber.py index 5029bcc40f..cebf5d58f9 100644 --- a/vocode/streaming/transcriber/azure_transcriber.py +++ b/vocode/streaming/transcriber/azure_transcriber.py @@ -67,9 +67,9 @@ def __init__( ) ) - speech_params[ - "auto_detect_source_language_config" - ] = auto_detect_source_language_config + speech_params["auto_detect_source_language_config"] = ( + auto_detect_source_language_config + ) else: speech_params["language"] = self.transcriber_config.language diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index 1e60100956..9142be75bf 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -14,6 +14,7 @@ tracer = trace.get_tracer(__name__) meter = metrics.get_meter(__name__) + class Transcription(BaseModel): message: str confidence: float diff --git a/vocode/streaming/utils/__init__.py b/vocode/streaming/utils/__init__.py index b7e03f1123..44ae3f1e57 100644 --- a/vocode/streaming/utils/__init__.py +++ b/vocode/streaming/utils/__init__.py @@ -9,6 +9,7 @@ custom_alphabet = ascii_letters + digits + ".-_" + def create_loop_in_thread(loop: asyncio.AbstractEventLoop, long_running_task=None): asyncio.set_event_loop(loop) if long_running_task: @@ -64,5 +65,6 @@ def get_chunk_size_per_second(audio_encoding: AudioEncoding, sampling_rate: int) def create_conversation_id() -> str: return secrets.token_urlsafe(16) + def remove_non_letters_digits(text): - return ''.join(i for i in text if i in custom_alphabet) + return "".join(i for i in text if i in custom_alphabet) diff --git a/vocode/streaming/utils/conversation_logger_adapter.py b/vocode/streaming/utils/conversation_logger_adapter.py index fc1efd1a8c..16c4cd1cf0 100644 --- a/vocode/streaming/utils/conversation_logger_adapter.py +++ b/vocode/streaming/utils/conversation_logger_adapter.py @@ -2,12 +2,14 @@ import logging + class ConversationLoggerAdapter(logging.LoggerAdapter): def process(self, msg, kwargs): - return '[%s] %s' % (self.extra['conversation_id'], msg), kwargs + return "[%s] %s" % (self.extra["conversation_id"], msg), kwargs + def wrap_logger(logger, conversation_id): if isinstance(logger, ConversationLoggerAdapter): return logger else: - return ConversationLoggerAdapter(logger, {'conversation_id': conversation_id}) + return ConversationLoggerAdapter(logger, {"conversation_id": conversation_id}) diff --git a/vocode/turn_based/synthesizer/base_synthesizer.py b/vocode/turn_based/synthesizer/base_synthesizer.py index 1646ce255e..d079d11282 100644 --- a/vocode/turn_based/synthesizer/base_synthesizer.py +++ b/vocode/turn_based/synthesizer/base_synthesizer.py @@ -4,5 +4,6 @@ class BaseSynthesizer: def synthesize(self, text) -> AudioSegment: raise NotImplementedError + async def async_synthesize(self, text) -> AudioSegment: raise NotImplementedError diff --git a/vocode/turn_based/synthesizer/coqui_synthesizer.py b/vocode/turn_based/synthesizer/coqui_synthesizer.py index 2eea0a09bb..bc53f8389b 100644 --- a/vocode/turn_based/synthesizer/coqui_synthesizer.py +++ b/vocode/turn_based/synthesizer/coqui_synthesizer.py @@ -42,12 +42,11 @@ def synthesize_chunk(self, text: str) -> AudioSegment: response = requests.get(sample["audio_url"]) return AudioSegment.from_wav(io.BytesIO(response.content)) # type: ignore - def split_text(self, string): # Base case: if the string is less than or equal to MAX_TEXT_LENGTH characters, return it as a single element array if len(string) <= MAX_TEXT_LENGTH: return [string.strip()] - + # Recursive case: find the index of the last sentence ender in the first MAX_TEXT_LENGTH characters of the string sentence_enders = [".", "!", "?"] index = -1 @@ -55,20 +54,20 @@ def split_text(self, string): i = string[:MAX_TEXT_LENGTH].rfind(ender) if i > index: index = i - + # If there is a sentence ender, split the string at that index plus one and strip any spaces from both parts if index != -1: - first_part = string[:index + 1].strip() - second_part = string[index + 1:].strip() - + first_part = string[: index + 1].strip() + second_part = string[index + 1 :].strip() + # If there is no sentence ender, find the index of the last comma in the first MAX_TEXT_LENGTH characters of the string else: index = string[:MAX_TEXT_LENGTH].rfind(",") # If there is a comma, split the string at that index plus one and strip any spaces from both parts if index != -1: - first_part = string[:index + 1].strip() - second_part = string[index + 1:].strip() - + first_part = string[: index + 1].strip() + second_part = string[index + 1 :].strip() + # If there is no comma, find the index of the last space in the first MAX_TEXT_LENGTH characters of the string else: index = string[:MAX_TEXT_LENGTH].rfind(" ") @@ -76,25 +75,22 @@ def split_text(self, string): if index != -1: first_part = string[:index].strip() second_part = string[index:].strip() - + # If there is no space, split the string at MAX_TEXT_LENGTH characters and strip any spaces from both parts else: first_part = string[:MAX_TEXT_LENGTH].strip() second_part = string[MAX_TEXT_LENGTH:].strip() - + # Append the first part to the result array result = [first_part] - + # Call the function recursively on the remaining part of the string and extend the result array with it, unless it is empty if second_part != "": result.extend(self.split_text(second_part)) - + # Return the result array return result - - - async def async_synthesize(self, text: str) -> AudioSegment: # This method is similar to the synthesize method, but it uses async IO to synthesize each chunk in parallel @@ -133,7 +129,9 @@ async def async_synthesize_chunk(self, text: str) -> AudioSegment: # Return an AudioSegment object from the audio data return AudioSegment.from_wav(io.BytesIO(audio_data)) # type: ignore - def get_request(self, text: str) -> typing.Tuple[str, typing.Dict[str, str], typing.Dict[str, object]]: + def get_request( + self, text: str + ) -> typing.Tuple[str, typing.Dict[str, str], typing.Dict[str, object]]: url = COQUI_BASE_URL headers = { "Authorization": f"Bearer {self.api_key}", From 9b24020439d395f54c9a89bb60b8833f68d918e9 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 31 May 2024 16:14:12 -0700 Subject: [PATCH 073/148] Update injecting-context.mdx (#547) --- docs/injecting-context.mdx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/injecting-context.mdx b/docs/injecting-context.mdx index 75341f349d..c147766556 100644 --- a/docs/injecting-context.mdx +++ b/docs/injecting-context.mdx @@ -30,8 +30,10 @@ name_prompt = "You are talking to ${name}" number = vocode_client.numbers.update_number( phone_number="YOUR_NUMBER", inbound_agent=AgentUpdateParams( - prompt=PromptUpdateParams(content=name_prompt), - context_endpoint="YOUR_CONTEXT_URL", + prompt=PromptUpdateParams( + content=name_prompt, + context_endpoint="YOUR_CONTEXT_URL", + ) ), ) ``` From 53b01dab0b59f71961ee83dbcaf3653a6935c2e3 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 13 Jun 2024 11:28:32 -0700 Subject: [PATCH 074/148] code updates for 0.1.112 (#555) * Update Readme with Preview Info (#1) * Update Readme with Preview Info * We're not quite that far along * Update Structure to be more Pleasing to the Eyes * Add changelog to readme --------- Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> Co-authored-by: Adnaan Sachidanandan * The Big Diff (#2) * The Big Diff * remove tests on 3.8 and 3.9 * Update README.md * Update README.md * fix turn based quickstart (#3) * [hotfix] remove unused import (#4) * Update README.md * Update README.md * Remove create_speech() from rime synthesizer (#6) * Fix default factory for elevenlabs WS (#12) * dispatch into elvenlabsws if experimental_websocket is on * fix mypy * Merge In Recent Fixes (#14) * [docs sprint] Updates docs for using transcribers (#9) * [docs sprint] phrase trigger documentation (#16) * [docs sprint] update open source quickstarts (#15) * [docs sprint] Add Documentation on Using Vocode's Loguru Implementation (#19) * [docs sprint] Add Documentation on Using Vocode's Loguru Implementation * Remove Tracing --------- Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> * [docs sprint] Updates docs for using synthesizers (#8) * [docs sprint] using synthesizers docs update * update docs for elevenlabs ws * Apply suggestions from code review Co-authored-by: Adnaan Sachidanandan --------- Co-authored-by: Adnaan Sachidanandan * [docs sprint] Updates docs for react quickstart (#10) * [docs sprint] Updates docs for react quickstart * PR feedback * changes azure to override create_speech_uncached (#21) * [docs sprint] Adds docs for conversation mechanics and moves endpointing docs from transcribers (#11) * [docs sprint] Updates docs for using transcribers * Adds docs for conversation mechanics and moves endpointing docs from transcribers * Update docs/open-source/conversation-mechanics.md Co-authored-by: Adnaan Sachidanandan * use mdx * PR feedback --------- Co-authored-by: Adnaan Sachidanandan * updates docs for events manager (#7) * add cartesia synthesizer (#17) * add cartesia synthesizer * make Cartesia dependency optional, add it to the synthesizers extra group * lazy import cartesia * improved lazy loading, and added api_key as a config parameter * improvements to cartesia synth * use create_speech_uncached * use existing abstractions default encoding and sample rates * Remove redundant api_key assignment Co-authored-by: Ajay Raj * Remove default setting of sampling rate Co-authored-by: Ajay Raj * Remove default setting of audio_encoding Co-authored-by: Ajay Raj * remove default setting of sampling rate Co-authored-by: Ajay Raj * Remove redundant setting of audio enconding the output device handles this Co-authored-by: Ajay Raj * build failed with poetry.lock file. re-updating it --------- Co-authored-by: Ajay Raj * Unset docs / README changes * Unset docs changes (cont.) * unset poetry version change * update poetry.lock --------- Co-authored-by: Mac Wilkinson Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> Co-authored-by: Adnaan Sachidanandan Co-authored-by: rjheeta --- .github/workflows/test.yml | 2 - Makefile | 6 + apps/client_backend/Dockerfile | 2 +- apps/client_backend/main.py | 17 +- apps/client_backend/poetry.lock | 3373 +++++++---- apps/client_backend/pyproject.toml | 8 +- apps/telephony_app/Dockerfile | 2 +- apps/telephony_app/docker-compose.yml | 10 +- apps/telephony_app/main.py | 42 +- apps/telephony_app/outbound_call.py | 25 +- apps/telephony_app/poetry.lock | 3594 ++++++++---- apps/telephony_app/pyproject.toml | 11 +- apps/telephony_app/speller_agent.py | 18 +- playground/streaming/agent/chat.py | 135 +- .../agent/restful_user_implemented_agent.py | 1 + .../agent/websocket_user_implemented_agent.py | 1 + playground/streaming/benchmark.py | 569 -- .../streaming/synthesizer/synthesize.py | 53 +- playground/streaming/tracing_utils.py | 38 +- .../streaming/transcriber/transcribe.py | 31 +- poetry.lock | 5088 +++++++++-------- pyproject.toml | 153 +- quickstarts/streaming_conversation.py | 63 +- quickstarts/turn_based_conversation.py | 41 +- tests/conftest.py | 66 + tests/fakedata/conversation.py | 85 + tests/fakedata/id.py | 5 + tests/streaming/__init__.py | 0 tests/streaming/action/conftest.py | 31 + tests/streaming/action/test_dtmf.py | 77 + .../streaming/action/test_end_conversation.py | 132 + .../streaming/action/test_external_actions.py | 122 + .../action/test_external_actions_requester.py | 82 + tests/streaming/action/test_record_email.py | 77 + tests/streaming/action/test_transfer_call.py | 222 + tests/streaming/action/test_wait.py | 23 + tests/streaming/agent/test_base_agent.py | 179 + tests/streaming/agent/test_openai_utils.py | 303 + ...{test_utils.py => test_streaming_utils.py} | 237 +- tests/streaming/data/__init__.py | 0 tests/streaming/data/fake_audio.mp3 | Bin 11593 -> 0 bytes tests/streaming/data/fake_audio.wav | Bin 63564 -> 0 bytes tests/streaming/data/loader.py | 5 - tests/streaming/fixtures/__init__.py | 0 tests/streaming/fixtures/output_device.py | 6 - tests/streaming/fixtures/synthesizer.py | 36 - tests/streaming/fixtures/transcriber.py | 26 - tests/streaming/models/test_transcript.py | 96 - tests/streaming/synthesizer/conftest.py | 26 + .../streaming/synthesizer/test_audio_cache.py | 61 + tests/streaming/synthesizer/test_factory.py | 87 + .../streaming/test_streaming_conversation.py | 490 +- tests/streaming/utils/test_events_manager.py | 28 +- tests/streaming/utils/test_phone_numbers.py | 49 + tests/streaming/utils/test_utils.py | 54 + tests/synthesizer/conftest.py | 128 - tests/synthesizer/test_eleven_labs.py | 51 - tests/synthesizer/test_play_ht.py | 61 - vocode/__init__.py | 69 + vocode/helpers.py | 51 +- vocode/logging.py | 185 + vocode/meta.py | 15 + vocode/streaming/action/abstract_factory.py | 10 + .../action/{utils.py => action_utils.py} | 0 vocode/streaming/action/base_action.py | 56 +- vocode/streaming/action/default_factory.py | 47 + vocode/streaming/action/dtmf.py | 83 + vocode/streaming/action/end_conversation.py | 89 + .../action/execute_external_action.py | 110 + .../action/external_actions_requester.py | 134 + vocode/streaming/action/factory.py | 17 - vocode/streaming/action/nylas_send_email.py | 62 - vocode/streaming/action/phone_call_action.py | 40 +- vocode/streaming/action/record_email.py | 76 + vocode/streaming/action/transfer_call.py | 172 +- vocode/streaming/action/wait.py | 52 + vocode/streaming/action/worker.py | 21 +- vocode/streaming/agent/__init__.py | 8 - vocode/streaming/agent/abstract_factory.py | 10 + vocode/streaming/agent/anthropic_agent.py | 213 +- vocode/streaming/agent/anthropic_utils.py | 29 + vocode/streaming/agent/base_agent.py | 467 +- .../streaming/agent/bot_sentiment_analyser.py | 58 - vocode/streaming/agent/chat_gpt_agent.py | 316 +- vocode/streaming/agent/default_factory.py | 26 + vocode/streaming/agent/echo_agent.py | 11 +- vocode/streaming/agent/factory.py | 45 - vocode/streaming/agent/goodbye.py | 13 + vocode/streaming/agent/gpt4all_agent.py | 9 +- .../agent/information_retrieval_agent.py | 34 - vocode/streaming/agent/llamacpp_agent.py | 269 +- vocode/streaming/agent/llm_agent.py | 156 - vocode/streaming/agent/openai_utils.py | 179 + vocode/streaming/agent/phrase_trigger.py | 21 + .../streaming/agent/prompts/action_prompt.py | 24 - .../agent/restful_user_implemented_agent.py | 23 +- vocode/streaming/agent/streaming_utils.py | 139 + vocode/streaming/agent/token_utils.py | 252 + vocode/streaming/agent/utils.py | 182 - vocode/streaming/agent/vertex_ai_agent.py | 30 +- .../agent/websocket_user_implemented_agent.py | 71 +- .../streaming/client_backend/conversation.py | 35 +- vocode/streaming/constants.py | 9 +- .../input_device/base_input_device.py | 7 +- .../input_device/file_input_device.py | 10 +- .../input_device/microphone_input.py | 17 +- vocode/streaming/models/actions.py | 89 +- vocode/streaming/models/agent.py | 98 +- vocode/streaming/models/audio.py | 15 + vocode/streaming/models/audio_encoding.py | 6 - vocode/streaming/models/client_backend.py | 3 +- vocode/streaming/models/events.py | 15 +- vocode/streaming/models/message.py | 24 +- vocode/streaming/models/model.py | 13 +- vocode/streaming/models/synthesizer.py | 101 +- vocode/streaming/models/telephony.py | 40 +- vocode/streaming/models/transcriber.py | 59 +- vocode/streaming/models/transcript.py | 163 +- vocode/streaming/models/vector_db.py | 9 +- vocode/streaming/models/websocket.py | 23 +- vocode/streaming/models/websocket_agent.py | 10 +- .../output_device/base_output_device.py | 5 +- .../output_device/blocking_speaker_output.py | 7 +- .../output_device/file_output_device.py | 5 +- .../streaming/output_device/speaker_output.py | 5 +- .../output_device/twilio_output_device.py | 39 +- .../output_device/vonage_output_device.py | 16 +- .../output_device/websocket_output_device.py | 16 +- vocode/streaming/streaming_conversation.py | 794 ++- vocode/streaming/synthesizer/__init__.py | 14 - .../streaming/synthesizer/abstract_factory.py | 15 + vocode/streaming/synthesizer/audio_cache.py | 47 + .../synthesizer/azure_synthesizer.py | 113 +- .../streaming/synthesizer/bark_synthesizer.py | 38 +- .../streaming/synthesizer/base_synthesizer.py | 276 +- .../synthesizer/cartesia_synthesizer.py | 114 + .../synthesizer/coqui_synthesizer.py | 32 +- .../synthesizer/coqui_tts_synthesizer.py | 44 +- .../streaming/synthesizer/default_factory.py | 47 + .../synthesizer/eleven_labs_synthesizer.py | 192 +- .../eleven_labs_websocket_synthesizer.py | 356 ++ vocode/streaming/synthesizer/factory.py | 76 - .../synthesizer/google_synthesizer.py | 54 +- .../streaming/synthesizer/gtts_synthesizer.py | 43 +- .../input_streaming_synthesizer.py | 16 + .../streaming/synthesizer/miniaudio_worker.py | 12 +- .../synthesizer/play_ht_synthesizer.py | 115 +- .../synthesizer/play_ht_synthesizer_v2.py | 300 + .../synthesizer/polly_synthesizer.py | 27 +- .../streaming/synthesizer/rime_synthesizer.py | 159 +- .../stream_elements_synthesizer.py | 36 +- .../synthesizer/synthesizer_utils.py | 50 + .../client/abstract_telephony_client.py | 29 + .../telephony/client/base_telephony_client.py | 32 - .../telephony/client/twilio_client.py | 128 +- .../telephony/client/vonage_client.py | 197 +- .../in_memory_config_manager.py | 5 +- .../config_manager/redis_config_manager.py | 37 +- vocode/streaming/telephony/constants.py | 8 +- .../abstract_phone_conversation.py | 90 + .../streaming/telephony/conversation/call.py | 83 - .../conversation/mark_message_queue.py | 46 + .../telephony/conversation/outbound_call.py | 92 +- .../telephony/conversation/twilio_call.py | 161 - .../conversation/twilio_phone_conversation.py | 274 + .../telephony/conversation/vonage_call.py | 131 - .../conversation/vonage_phone_conversation.py | 139 + .../telephony/conversation/zoom_dial_in.py | 13 +- vocode/streaming/telephony/server/base.py | 88 +- .../telephony/server/router/calls.py | 65 +- vocode/streaming/telephony/templater.py | 37 +- ...nnect_call.xml => twilio_connect_call.xml} | 2 +- vocode/streaming/transcriber/__init__.py | 7 - .../streaming/transcriber/abstract_factory.py | 16 + .../transcriber/assembly_ai_transcriber.py | 82 +- .../transcriber/azure_transcriber.py | 40 +- .../streaming/transcriber/base_transcriber.py | 79 +- .../transcriber/deepgram_transcriber.py | 748 ++- .../{factory.py => default_factory.py} | 24 +- .../transcriber/gladia_transcriber.py | 27 +- .../transcriber/google_transcriber.py | 31 +- .../transcriber/rev_ai_transcriber.py | 37 +- .../transcriber/whisper_cpp_transcriber.py | 28 +- .../user_implemented_agent/base_agent.py | 2 +- .../user_implemented_agent/restful_agent.py | 12 +- vocode/streaming/utils/__init__.py | 77 +- vocode/streaming/utils/async_requester.py | 25 + .../utils/conversation_logger_adapter.py | 15 - vocode/streaming/utils/create_task.py | 30 + vocode/streaming/utils/events_manager.py | 38 +- vocode/streaming/utils/goodbye_model.py | 93 - vocode/streaming/utils/mp3_helper.py | 1 + vocode/streaming/utils/phone_numbers.py | 42 + vocode/streaming/utils/redis.py | 79 + .../utils/redis_conversation_message_queue.py | 35 + vocode/streaming/utils/singleton.py | 14 + vocode/streaming/utils/speed_manager.py | 44 + vocode/streaming/utils/state_manager.py | 158 +- vocode/streaming/utils/worker.py | 55 +- vocode/streaming/vector_db/base_vector_db.py | 37 +- vocode/streaming/vector_db/factory.py | 23 +- vocode/streaming/vector_db/pinecone.py | 20 +- vocode/turn_based/agent/__init__.py | 4 - vocode/turn_based/agent/chat_gpt_agent.py | 65 +- vocode/turn_based/agent/gpt4all_agent.py | 22 +- .../input_device/microphone_input.py | 7 +- .../output_device/speaker_output.py | 3 +- vocode/turn_based/synthesizer/__init__.py | 14 - .../synthesizer/azure_synthesizer.py | 3 +- .../synthesizer/bark_synthesizer.py | 16 +- .../synthesizer/coqui_synthesizer.py | 17 +- .../synthesizer/coqui_tts_synthesizer.py | 5 +- .../synthesizer/eleven_labs_synthesizer.py | 28 +- .../synthesizer/google_synthesizer.py | 8 +- .../synthesizer/gtts_synthesizer.py | 4 +- .../synthesizer/play_ht_synthesizer.py | 13 +- .../synthesizer/polly_synthesizer.py | 5 +- .../synthesizer/rime_synthesizer.py | 5 +- .../stream_elements_synthesizer.py | 6 +- vocode/turn_based/transcriber/__init__.py | 4 - .../turn_based/transcriber/sr_transcriber.py | 22 +- .../transcriber/whisper_cpp_transcriber.py | 1 + .../transcriber/whisper_transcriber.py | 10 +- vocode/turn_based/turn_based_conversation.py | 18 +- vocode/utils/sentry_utils.py | 233 + vocode/utils/whisper_cpp/helpers.py | 11 +- vocode/utils/whisper_cpp/whisper_params.py | 14 +- 227 files changed, 18116 insertions(+), 9809 deletions(-) delete mode 100644 playground/streaming/benchmark.py create mode 100644 tests/conftest.py create mode 100644 tests/fakedata/conversation.py create mode 100644 tests/fakedata/id.py delete mode 100644 tests/streaming/__init__.py create mode 100644 tests/streaming/action/conftest.py create mode 100644 tests/streaming/action/test_dtmf.py create mode 100644 tests/streaming/action/test_end_conversation.py create mode 100644 tests/streaming/action/test_external_actions.py create mode 100644 tests/streaming/action/test_external_actions_requester.py create mode 100644 tests/streaming/action/test_record_email.py create mode 100644 tests/streaming/action/test_transfer_call.py create mode 100644 tests/streaming/action/test_wait.py create mode 100644 tests/streaming/agent/test_base_agent.py create mode 100644 tests/streaming/agent/test_openai_utils.py rename tests/streaming/agent/{test_utils.py => test_streaming_utils.py} (71%) delete mode 100644 tests/streaming/data/__init__.py delete mode 100644 tests/streaming/data/fake_audio.mp3 delete mode 100644 tests/streaming/data/fake_audio.wav delete mode 100644 tests/streaming/data/loader.py delete mode 100644 tests/streaming/fixtures/__init__.py delete mode 100644 tests/streaming/fixtures/output_device.py delete mode 100644 tests/streaming/fixtures/synthesizer.py delete mode 100644 tests/streaming/fixtures/transcriber.py delete mode 100644 tests/streaming/models/test_transcript.py create mode 100644 tests/streaming/synthesizer/conftest.py create mode 100644 tests/streaming/synthesizer/test_audio_cache.py create mode 100644 tests/streaming/synthesizer/test_factory.py create mode 100644 tests/streaming/utils/test_phone_numbers.py create mode 100644 tests/streaming/utils/test_utils.py delete mode 100644 tests/synthesizer/conftest.py delete mode 100644 tests/synthesizer/test_eleven_labs.py delete mode 100644 tests/synthesizer/test_play_ht.py create mode 100644 vocode/logging.py create mode 100644 vocode/meta.py create mode 100644 vocode/streaming/action/abstract_factory.py rename vocode/streaming/action/{utils.py => action_utils.py} (100%) create mode 100644 vocode/streaming/action/default_factory.py create mode 100644 vocode/streaming/action/dtmf.py create mode 100644 vocode/streaming/action/end_conversation.py create mode 100644 vocode/streaming/action/execute_external_action.py create mode 100644 vocode/streaming/action/external_actions_requester.py delete mode 100644 vocode/streaming/action/factory.py delete mode 100644 vocode/streaming/action/nylas_send_email.py create mode 100644 vocode/streaming/action/record_email.py create mode 100644 vocode/streaming/action/wait.py create mode 100644 vocode/streaming/agent/abstract_factory.py create mode 100644 vocode/streaming/agent/anthropic_utils.py delete mode 100644 vocode/streaming/agent/bot_sentiment_analyser.py create mode 100644 vocode/streaming/agent/default_factory.py delete mode 100644 vocode/streaming/agent/factory.py create mode 100644 vocode/streaming/agent/goodbye.py delete mode 100644 vocode/streaming/agent/information_retrieval_agent.py delete mode 100644 vocode/streaming/agent/llm_agent.py create mode 100644 vocode/streaming/agent/openai_utils.py create mode 100644 vocode/streaming/agent/phrase_trigger.py delete mode 100644 vocode/streaming/agent/prompts/action_prompt.py create mode 100644 vocode/streaming/agent/streaming_utils.py create mode 100644 vocode/streaming/agent/token_utils.py delete mode 100644 vocode/streaming/agent/utils.py create mode 100644 vocode/streaming/models/audio.py delete mode 100644 vocode/streaming/models/audio_encoding.py create mode 100644 vocode/streaming/synthesizer/abstract_factory.py create mode 100644 vocode/streaming/synthesizer/audio_cache.py create mode 100644 vocode/streaming/synthesizer/cartesia_synthesizer.py create mode 100644 vocode/streaming/synthesizer/default_factory.py create mode 100644 vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py delete mode 100644 vocode/streaming/synthesizer/factory.py create mode 100644 vocode/streaming/synthesizer/input_streaming_synthesizer.py create mode 100644 vocode/streaming/synthesizer/play_ht_synthesizer_v2.py create mode 100644 vocode/streaming/synthesizer/synthesizer_utils.py create mode 100644 vocode/streaming/telephony/client/abstract_telephony_client.py delete mode 100644 vocode/streaming/telephony/client/base_telephony_client.py create mode 100644 vocode/streaming/telephony/conversation/abstract_phone_conversation.py delete mode 100644 vocode/streaming/telephony/conversation/call.py create mode 100644 vocode/streaming/telephony/conversation/mark_message_queue.py delete mode 100644 vocode/streaming/telephony/conversation/twilio_call.py create mode 100644 vocode/streaming/telephony/conversation/twilio_phone_conversation.py delete mode 100644 vocode/streaming/telephony/conversation/vonage_call.py create mode 100644 vocode/streaming/telephony/conversation/vonage_phone_conversation.py rename vocode/streaming/telephony/templates/{connect_call.xml => twilio_connect_call.xml} (92%) delete mode 100644 vocode/streaming/transcriber/__init__.py create mode 100644 vocode/streaming/transcriber/abstract_factory.py rename vocode/streaming/transcriber/{factory.py => default_factory.py} (63%) create mode 100644 vocode/streaming/utils/async_requester.py delete mode 100644 vocode/streaming/utils/conversation_logger_adapter.py create mode 100644 vocode/streaming/utils/create_task.py delete mode 100644 vocode/streaming/utils/goodbye_model.py create mode 100644 vocode/streaming/utils/phone_numbers.py create mode 100644 vocode/streaming/utils/redis.py create mode 100644 vocode/streaming/utils/redis_conversation_message_queue.py create mode 100644 vocode/streaming/utils/singleton.py create mode 100644 vocode/streaming/utils/speed_manager.py delete mode 100644 vocode/turn_based/agent/__init__.py delete mode 100644 vocode/turn_based/synthesizer/__init__.py delete mode 100644 vocode/turn_based/transcriber/__init__.py create mode 100644 vocode/utils/sentry_utils.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f415eba8de..609b85d673 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,8 +12,6 @@ jobs: fail-fast: false matrix: python-version: - - "3.8" - - "3.9" - "3.10" - "3.11" poetry-version: diff --git a/Makefile b/Makefile index b58788087a..c7dcc8ccfc 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,12 @@ transcribe: synthesize: poetry run python playground/streaming/synthesizer/synthesize.py +turn_based_conversation: + poetry run python quickstarts/turn_based_conversation.py + +streaming_conversation: + poetry run python quickstarts/streaming_conversation.py + PYTHON_FILES=. lint: PYTHON_FILES=vocode/ quickstarts/ playground/ lint_diff typecheck_diff: PYTHON_FILES=$(shell git diff --name-only --diff-filter=d main | grep -E '\.py$$') diff --git a/apps/client_backend/Dockerfile b/apps/client_backend/Dockerfile index acaa62aa76..87c26c8abe 100644 --- a/apps/client_backend/Dockerfile +++ b/apps/client_backend/Dockerfile @@ -15,4 +15,4 @@ RUN poetry config virtualenvs.create false RUN poetry install --no-dev --no-interaction --no-ansi COPY main.py /code/main.py -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000"] \ No newline at end of file +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000"] diff --git a/apps/client_backend/main.py b/apps/client_backend/main.py index c004d4726a..0495705b01 100644 --- a/apps/client_backend/main.py +++ b/apps/client_backend/main.py @@ -1,23 +1,19 @@ -import logging +from dotenv import load_dotenv from fastapi import FastAPI -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.models.synthesizer import AzureSynthesizerConfig -from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer - +from vocode.logging import configure_pretty_logging from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.client_backend.conversation import ConversationRouter +from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.message import BaseMessage - -from dotenv import load_dotenv +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer load_dotenv() app = FastAPI(docs_url=None) -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) +configure_pretty_logging() conversation_router = ConversationRouter( agent_thunk=lambda: ChatGPTAgent( @@ -31,7 +27,6 @@ output_audio_config, voice_name="en-US-SteffanNeural" ) ), - logger=logger, ) app.include_router(conversation_router.get_router()) diff --git a/apps/client_backend/poetry.lock b/apps/client_backend/poetry.lock index ce04d94f45..914efb029a 100644 --- a/apps/client_backend/poetry.lock +++ b/apps/client_backend/poetry.lock @@ -1,93 +1,92 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.9.1" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, - {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, - {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, - {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, - {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, - {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, - {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, - {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, - {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, - {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, - {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, - {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -96,6 +95,20 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns", "brotlicffi"] +[[package]] +name = "aiohttp-retry" +version = "2.8.3" +description = "Simple retry client for aiohttp" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiohttp_retry-2.8.3-py3-none-any.whl", hash = "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45"}, + {file = "aiohttp_retry-2.8.3.tar.gz", hash = "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9"}, +] + +[package.dependencies] +aiohttp = "*" + [[package]] name = "aiosignal" version = "1.3.1" @@ -111,41 +124,54 @@ files = [ frozenlist = ">=1.1.0" [[package]] -name = "anthropic" -version = "0.2.10" -description = "Library for accessing the anthropic API" +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, - {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anthropic" +version = "0.28.0" +description = "The official Python library for the anthropic API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -requests = "*" -tokenizers = "*" +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.7,<5" [package.extras] -dev = ["black (>=22.3.0)", "pytest"] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.2.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] @@ -202,28 +228,39 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "azure-cognitiveservices-speech" -version = "1.34.1" +version = "1.37.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:906d6bf65176e93464e2d763dd074ca00c48cfe1a896371fcdcb155a500910f7"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54ec8dd55d4dbd9058c61909e08485d3761d6d30954da189e1b17d84daf5e2e0"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:685424689725d2d4115485998c0888c8b5b502259037ff533e5a834575f80b66"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:384f66786c2335165035270897b34d0b91736a1fdf38f7696e9a227075cb2489"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win32.whl", hash = "sha256:343d5f449ccd6c9b53cd37dd46a70ece0905243517df7a0c047779e55072254c"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win_amd64.whl", hash = "sha256:a18fb45490cdcd681407ccaad9560fb14dda1c8276de297e219ea1a880467e28"}, +] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -414,15 +451,69 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "cryptography" +version = "42.0.7" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "dataclasses-json" -version = "0.5.14" +version = "0.6.6" description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.7,<3.13" +python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, - {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, + {file = "dataclasses_json-0.6.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, + {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, ] [package.dependencies] @@ -457,32 +548,80 @@ wrapt = ">=1.10,<2" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + [[package]] name = "elevenlabs" -version = "0.2.24" -description = "The official elevenlabs python package." +version = "1.2.2" +description = "" optional = false -python-versions = "*" +python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-0.2.24-py3-none-any.whl", hash = "sha256:f1dc780e50ace7a499717cc67485b87bf5cd806a2711fca7a4fbf1b8b9f3a41c"}, - {file = "elevenlabs-0.2.24.tar.gz", hash = "sha256:7719816f8d74666c0da5567e737b6c0200f2807bed9d9c21ed750f14e8a3669d"}, + {file = "elevenlabs-1.2.2-py3-none-any.whl", hash = "sha256:60b92b0e2aabdfba93a43569f207f8a2ad397492519b8e11a2eebb32807ddefa"}, + {file = "elevenlabs-1.2.2.tar.gz", hash = "sha256:ebd02869b95602b8956874dd727981bb49ad16b9a3c2f5901193d838213694aa"}, ] [package.dependencies] +httpx = ">=0.21.2" ipython = ">=7.0" -pydantic = ">=1.10,<2.0" +pydantic = ">=1.9.2" requests = ">=2.20" +typing_extensions = ">=4.0.0" websockets = ">=11.0" +[[package]] +name = "email-validator" +version = "2.1.1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, + {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -504,37 +643,62 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.100.1" +version = "0.111.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, - {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, + {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, ] [package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, +] + +[package.dependencies] +typer = ">=0.12.3" + +[package.extras] +standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.13.1" +version = "3.14.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +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-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -625,13 +789,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.5.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.extras] @@ -639,7 +803,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +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"] @@ -649,15 +813,117 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +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 = "google-api-core" +version = "2.19.0" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.29.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-cloud-speech" +version = "2.26.0" +description = "Google Cloud Speech API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, + {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" + +[[package]] +name = "google-cloud-texttospeech" +version = "2.16.3" +description = "Google Cloud Texttospeech API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, + {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" + +[[package]] +name = "googleapis-common-protos" +version = "1.63.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, + {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "greenlet" version = "3.0.3" @@ -729,6 +995,80 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "grpcio" +version = "1.64.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, + {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, + {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, + {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, + {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, + {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, + {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, + {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, + {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, + {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, + {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, + {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, + {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, + {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, + {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, + {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, + {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, + {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, + {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, + {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, + {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.0)"] + +[[package]] +name = "grpcio-status" +version = "1.62.2" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.62.2" +protobuf = ">=4.21.6" + [[package]] name = "h11" version = "0.14.0" @@ -742,13 +1082,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -759,17 +1099,65 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -787,13 +1175,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.20.3" +version = "0.23.2" 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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, - {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, + {file = "huggingface_hub-0.23.2-py3-none-any.whl", hash = "sha256:48727a16e704d409c4bb5913613308499664f22a99743435dc3a13b23c485827"}, + {file = "huggingface_hub-0.23.2.tar.gz", hash = "sha256:f6829b62d5fdecb452a76fdbec620cba4c1573655a8d710c1df71735fd9edbd2"}, ] [package.dependencies] @@ -806,37 +1194,39 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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"] -inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "6.11.0" +version = "7.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, - {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, + {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] @@ -919,13 +1309,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -934,173 +1324,421 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jiter" +version = "0.4.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, + {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, + {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, + {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, + {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, + {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, + {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, + {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, + {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, + {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, + {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, + {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, + {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, +] + [[package]] name = "joblib" -version = "1.3.2" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "langchain" -version = "0.0.198" +version = "0.2.1" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.0.198-py3-none-any.whl", hash = "sha256:9d8e57ec25901989339ffac2ea7e759333d084100c90526e8ad57fb61b2003c9"}, - {file = "langchain-0.0.198.tar.gz", hash = "sha256:656385c23aeec1f8f4efbce598f729c817c60eb3f7c9fd77c03a8d28e7d0fa81"}, + {file = "langchain-0.2.1-py3-none-any.whl", hash = "sha256:3e13bf97c5717bce2c281f5117e8778823e8ccf62d949e73d3869448962b1c97"}, + {file = "langchain-0.2.1.tar.gz", hash = "sha256:5758a315e1ac92eb26dafec5ad0fafa03cafa686aba197d5bb0b1dd28cc03ebe"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.6.0" -langchainplus-sdk = ">=0.0.7" -numexpr = ">=2.8.4,<3.0.0" +langchain-core = ">=0.2.0,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" numpy = ">=1,<2" -openapi-schema-pydantic = ">=1.2,<2.0" -pydantic = ">=1,<2" -PyYAML = ">=5.4.1" +pydantic = ">=1,<3" +PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.2,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.6.1,<0.7.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] -cohere = ["cohere (>=3,<4)"] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<6)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] -llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] -qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.1,<0.2)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.7,<1.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] -name = "langchainplus-sdk" -version = "0.0.20" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +name = "langchain-community" +version = "0.2.1" +description = "Community contributed LangChain integrations." optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchainplus_sdk-0.0.20-py3-none-any.whl", hash = "sha256:07a869d476755803aa04c4986ce78d00c2fe4ff584c0eaa57d7570c9664188db"}, - {file = "langchainplus_sdk-0.0.20.tar.gz", hash = "sha256:3d300e2e3290f68cc9d842c059f9458deba60e776c9e790309688cad1bfbb219"}, + {file = "langchain_community-0.2.1-py3-none-any.whl", hash = "sha256:b834e2c5ded6903b839fcaf566eee90a0ffae53405a0f7748202725e701d39cd"}, + {file = "langchain_community-0.2.1.tar.gz", hash = "sha256:079942e8f15da975769ccaae19042b7bba5481c42020bbbd7d8cad73a9393261"}, ] [package.dependencies] -pydantic = ">=1,<2" +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.2.0,<0.3.0" +langchain-core = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpathlib (>=0.18,<0.19)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] + +[[package]] +name = "langchain-core" +version = "0.2.3" +description = "Building applications with LLMs through composability" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_core-0.2.3-py3-none-any.whl", hash = "sha256:22189b5a3a30bfd65eb995f95e627f7c2c3acb322feb89f5f5f2fb7df21833a7"}, + {file = "langchain_core-0.2.3.tar.gz", hash = "sha256:fbc75a64b9c0b7655d96ca57a707df1e6c09efc1539c36adbd73260612549810"}, +] + +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.65,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" tenacity = ">=8.1.0,<9.0.0" +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langchain-text-splitters" +version = "0.2.0" +description = "LangChain text splitting utilities" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_text_splitters-0.2.0-py3-none-any.whl", hash = "sha256:7b4c6a45f8471630a882b321e138329b6897102a5bc62f4c12be1c0b05bb9199"}, + {file = "langchain_text_splitters-0.2.0.tar.gz", hash = "sha256:b32ab4f7397f7d42c1fa3283fefc2547ba356bd63a68ee9092865e5ad83c82f9"}, +] + +[package.dependencies] +langchain-core = ">=0.2.0,<0.3.0" + +[package.extras] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] + +[[package]] +name = "langsmith" +version = "0.1.65" +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.65-py3-none-any.whl", hash = "sha256:ab4487029240e69cca30da1065f1e9138e5a7ca2bbe8c697f0bd7d5839f71cf7"}, + {file = "langsmith-0.1.65.tar.gz", hash = "sha256:d3c2eb2391478bd79989f02652cf66e29a7959d677614b6993a47cef43f7f43b"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[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.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "marshmallow" -version = "3.20.2" +version = "3.21.2" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, - {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, + {file = "marshmallow-3.21.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, + {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, ] [package.dependencies] packaging = ">=17.0" [package.extras] -dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["pre-commit (>=2.4,<4.0)"] +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 = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] traitlets = "*" +[[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 = "miniaudio" version = "1.59" @@ -1167,85 +1805,101 @@ cffi = ">=1.12.0" [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -1284,168 +1938,169 @@ plot = ["matplotlib"] tgrep = ["pyparsing"] twitter = ["twython"] -[[package]] -name = "numexpr" -version = "2.8.8" -description = "Fast numerical expression evaluator for NumPy" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, - {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, - {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, - {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, - {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, - {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, - {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, - {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, - {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, - {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, - {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, - {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, - {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, - {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, - {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, - {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, - {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, - {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, - {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, - {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, - {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, - {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, - {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, - {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, - {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, - {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, - {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, - {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, - {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, -] - -[package.dependencies] -numpy = ">=1.13.3" - [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openai" -version = "0.27.10" -description = "Python client library for the OpenAI API" +version = "1.30.5" +description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, - {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, + {file = "openai-1.30.5-py3-none-any.whl", hash = "sha256:2ad95e926de0d2e09cde632a9204b0a6dca4a03c2cdcc84329b01f355784355a"}, + {file = "openai-1.30.5.tar.gz", hash = "sha256:5366562eb2c5917e6116ae0391b7ae6e3acd62b0ae3f565ada32b35d8fcfa106"}, ] [package.dependencies] -aiohttp = "*" -requests = ">=2.20" -tqdm = "*" +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" [package.extras] -datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] -embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] -wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] - -[[package]] -name = "openapi-schema-pydantic" -version = "1.2.4" -description = "OpenAPI (v3) specification schema as pydantic class" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, - {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, -] - -[package.dependencies] -pydantic = ">=1.8.2" +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.22.0" +version = "1.24.0" description = "OpenTelemetry Python API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, - {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, + {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" +importlib-metadata = ">=6.0,<=7.0" [[package]] name = "opentelemetry-sdk" -version = "1.22.0" +version = "1.24.0" description = "OpenTelemetry Python SDK" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, - {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, + {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.22.0" -opentelemetry-semantic-conventions = "0.43b0" +opentelemetry-api = "1.24.0" +opentelemetry-semantic-conventions = "0.45b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.43b0" +version = "0.45b0" description = "OpenTelemetry Semantic Conventions" optional = false -python-versions = ">=3.7" +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.3" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, - {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, + {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, + {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, + {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, + {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, + {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, + {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, + {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, + {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, + {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, + {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, + {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, + {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, + {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, + {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, + {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, + {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, ] [[package]] @@ -1461,18 +2116,18 @@ files = [ [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pexpect" @@ -1488,20 +2143,68 @@ files = [ [package.dependencies] ptyprocess = ">=0.5" +[[package]] +name = "phonenumbers" +version = "8.13.37" +description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." +optional = false +python-versions = "*" +files = [ + {file = "phonenumbers-8.13.37-py2.py3-none-any.whl", hash = "sha256:4ea00ef5012422c08c7955c21131e7ae5baa9a3ef52cf2d561e963f023006b80"}, + {file = "phonenumbers-8.13.37.tar.gz", hash = "sha256:bd315fed159aea0516f7c367231810fe8344d5bec26156b88fa18374c11d1cf2"}, +] + [[package]] name = "prompt-toolkit" -version = "3.0.43" +version = "3.0.45" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, - {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, + {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, + {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, ] [package.dependencies] wcwidth = "*" +[[package]] +name = "proto-plus" +version = "1.23.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -1527,68 +2230,162 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "pvkoala" +version = "2.0.1" +description = "Koala Noise Suppression Engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pvkoala-2.0.1-py3-none-any.whl", hash = "sha256:8b153e076b4d14adccdcb4d800aa84e8d2f91e0640b959677582d3128cbcb249"}, + {file = "pvkoala-2.0.1.tar.gz", hash = "sha256:5e017c671fc1338d42dc20f9dee003d0144bbba1757b6f1fcd6272c5308da242"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "1.10.14" -description = "Data validation and settings management using python type hints" +version = "2.7.2" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, - {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, - {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, - {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, - {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, - {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, - {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, - {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, - {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, - {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] + {file = "pydantic-2.7.2-py3-none-any.whl", hash = "sha256:834ab954175f94e6e68258537dc49402c4a5e9d0409b9f1b86b7e934a8372de7"}, + {file = "pydantic-2.7.2.tar.gz", hash = "sha256:71b2945998f9c9b7919a45bde9a50397b289937d215ae141c1d0903ba7149fd7"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.3" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.3" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:744697428fcdec6be5670460b578161d1ffe34743a5c15656be7ea82b008197c"}, + {file = "pydantic_core-2.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b40c05ced1ba4218b14986fe6f283d22e1ae2ff4c8e28881a70fb81fbfcda7"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a9a75622357076efb6b311983ff190fbfb3c12fc3a853122b34d3d358126c"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2e253af04ceaebde8eb201eb3f3e3e7e390f2d275a88300d6a1959d710539e2"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:855ec66589c68aa367d989da5c4755bb74ee92ccad4fdb6af942c3612c067e34"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3e42bb54e7e9d72c13ce112e02eb1b3b55681ee948d748842171201a03a98a"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6ac9ffccc9d2e69d9fba841441d4259cb668ac180e51b30d3632cd7abca2b9b"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c56eca1686539fa0c9bda992e7bd6a37583f20083c37590413381acfc5f192d6"}, + {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17954d784bf8abfc0ec2a633108207ebc4fa2df1a0e4c0c3ccbaa9bb01d2c426"}, + {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:98ed737567d8f2ecd54f7c8d4f8572ca7c7921ede93a2e52939416170d357812"}, + {file = "pydantic_core-2.18.3-cp310-none-win32.whl", hash = "sha256:9f9e04afebd3ed8c15d67a564ed0a34b54e52136c6d40d14c5547b238390e779"}, + {file = "pydantic_core-2.18.3-cp310-none-win_amd64.whl", hash = "sha256:45e4ffbae34f7ae30d0047697e724e534a7ec0a82ef9994b7913a412c21462a0"}, + {file = "pydantic_core-2.18.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b9ebe8231726c49518b16b237b9fe0d7d361dd221302af511a83d4ada01183ab"}, + {file = "pydantic_core-2.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8e20e15d18bf7dbb453be78a2d858f946f5cdf06c5072453dace00ab652e2b2"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d9ff283cd3459fa0bf9b0256a2b6f01ac1ff9ffb034e24457b9035f75587cb"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f7ef5f0ebb77ba24c9970da18b771711edc5feaf00c10b18461e0f5f5949231"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73038d66614d2e5cde30435b5afdced2b473b4c77d4ca3a8624dd3e41a9c19be"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6afd5c867a74c4d314c557b5ea9520183fadfbd1df4c2d6e09fd0d990ce412cd"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd7df92f28d351bb9f12470f4c533cf03d1b52ec5a6e5c58c65b183055a60106"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80aea0ffeb1049336043d07799eace1c9602519fb3192916ff525b0287b2b1e4"}, + {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaee40f25bba38132e655ffa3d1998a6d576ba7cf81deff8bfa189fb43fd2bbe"}, + {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9128089da8f4fe73f7a91973895ebf2502539d627891a14034e45fb9e707e26d"}, + {file = "pydantic_core-2.18.3-cp311-none-win32.whl", hash = "sha256:fec02527e1e03257aa25b1a4dcbe697b40a22f1229f5d026503e8b7ff6d2eda7"}, + {file = "pydantic_core-2.18.3-cp311-none-win_amd64.whl", hash = "sha256:58ff8631dbab6c7c982e6425da8347108449321f61fe427c52ddfadd66642af7"}, + {file = "pydantic_core-2.18.3-cp311-none-win_arm64.whl", hash = "sha256:3fc1c7f67f34c6c2ef9c213e0f2a351797cda98249d9ca56a70ce4ebcaba45f4"}, + {file = "pydantic_core-2.18.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0928cde2ae416a2d1ebe6dee324709c6f73e93494d8c7aea92df99aab1fc40f"}, + {file = "pydantic_core-2.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bee9bb305a562f8b9271855afb6ce00223f545de3d68560b3c1649c7c5295e9"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e862823be114387257dacbfa7d78547165a85d7add33b446ca4f4fae92c7ff5c"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a36f78674cbddc165abab0df961b5f96b14461d05feec5e1f78da58808b97e7"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba905d184f62e7ddbb7a5a751d8a5c805463511c7b08d1aca4a3e8c11f2e5048"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fdd362f6a586e681ff86550b2379e532fee63c52def1c666887956748eaa326"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b214b7ee3bd3b865e963dbed0f8bc5375f49449d70e8d407b567af3222aae4"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691018785779766127f531674fa82bb368df5b36b461622b12e176c18e119022"}, + {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:60e4c625e6f7155d7d0dcac151edf5858102bc61bf959d04469ca6ee4e8381bd"}, + {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4e651e47d981c1b701dcc74ab8fec5a60a5b004650416b4abbef13db23bc7be"}, + {file = "pydantic_core-2.18.3-cp312-none-win32.whl", hash = "sha256:ffecbb5edb7f5ffae13599aec33b735e9e4c7676ca1633c60f2c606beb17efc5"}, + {file = "pydantic_core-2.18.3-cp312-none-win_amd64.whl", hash = "sha256:2c8333f6e934733483c7eddffdb094c143b9463d2af7e6bd85ebcb2d4a1b82c6"}, + {file = "pydantic_core-2.18.3-cp312-none-win_arm64.whl", hash = "sha256:7a20dded653e516a4655f4c98e97ccafb13753987434fe7cf044aa25f5b7d417"}, + {file = "pydantic_core-2.18.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:eecf63195be644b0396f972c82598cd15693550f0ff236dcf7ab92e2eb6d3522"}, + {file = "pydantic_core-2.18.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c44efdd3b6125419c28821590d7ec891c9cb0dff33a7a78d9d5c8b6f66b9702"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e59fca51ffbdd1638b3856779342ed69bcecb8484c1d4b8bdb237d0eb5a45e2"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70cf099197d6b98953468461d753563b28e73cf1eade2ffe069675d2657ed1d5"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63081a49dddc6124754b32a3774331467bfc3d2bd5ff8f10df36a95602560361"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:370059b7883485c9edb9655355ff46d912f4b03b009d929220d9294c7fd9fd60"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64faeedfd8254f05f5cf6fc755023a7e1606af3959cfc1a9285744cc711044"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d2e725de0f90d8671f89e420d36c3dd97639b98145e42fcc0e1f6d492a46dc"}, + {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:67bc078025d70ec5aefe6200ef094576c9d86bd36982df1301c758a9fff7d7f4"}, + {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf952c3f4100e203cbaf8e0c907c835d3e28f9041474e52b651761dc248a3c0"}, + {file = "pydantic_core-2.18.3-cp38-none-win32.whl", hash = "sha256:9a46795b1f3beb167eaee91736d5d17ac3a994bf2215a996aed825a45f897558"}, + {file = "pydantic_core-2.18.3-cp38-none-win_amd64.whl", hash = "sha256:200ad4e3133cb99ed82342a101a5abf3d924722e71cd581cc113fe828f727fbc"}, + {file = "pydantic_core-2.18.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:304378b7bf92206036c8ddd83a2ba7b7d1a5b425acafff637172a3aa72ad7083"}, + {file = "pydantic_core-2.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c826870b277143e701c9ccf34ebc33ddb4d072612683a044e7cce2d52f6c3fef"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e201935d282707394f3668380e41ccf25b5794d1b131cdd96b07f615a33ca4b1"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5560dda746c44b48bf82b3d191d74fe8efc5686a9ef18e69bdabccbbb9ad9442"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b32c2a1f8032570842257e4c19288eba9a2bba4712af542327de9a1204faff8"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:929c24e9dea3990bc8bcd27c5f2d3916c0c86f5511d2caa69e0d5290115344a9"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a8376fef60790152564b0eab376b3e23dd6e54f29d84aad46f7b264ecca943"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dccf3ef1400390ddd1fb55bf0632209d39140552d068ee5ac45553b556780e06"}, + {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41dbdcb0c7252b58fa931fec47937edb422c9cb22528f41cb8963665c372caf6"}, + {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:666e45cf071669fde468886654742fa10b0e74cd0fa0430a46ba6056b24fb0af"}, + {file = "pydantic_core-2.18.3-cp39-none-win32.whl", hash = "sha256:f9c08cabff68704a1b4667d33f534d544b8a07b8e5d039c37067fceb18789e78"}, + {file = "pydantic_core-2.18.3-cp39-none-win_amd64.whl", hash = "sha256:4afa5f5973e8572b5c0dcb4e2d4fda7890e7cd63329bd5cc3263a25c92ef0026"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:77319771a026f7c7d29c6ebc623de889e9563b7087911b46fd06c044a12aa5e9"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:df11fa992e9f576473038510d66dd305bcd51d7dd508c163a8c8fe148454e059"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d531076bdfb65af593326ffd567e6ab3da145020dafb9187a1d131064a55f97c"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33ce258e4e6e6038f2b9e8b8a631d17d017567db43483314993b3ca345dcbbb"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f9cd7f5635b719939019be9bda47ecb56e165e51dd26c9a217a433e3d0d59a9"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cd4a032bb65cc132cae1fe3e52877daecc2097965cd3914e44fbd12b00dae7c5"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f2718430098bcdf60402136c845e4126a189959d103900ebabb6774a5d9fdb"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0037a92cf0c580ed14e10953cdd26528e8796307bb8bb312dc65f71547df04d"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b95a0972fac2b1ff3c94629fc9081b16371dad870959f1408cc33b2f78ad347a"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a62e437d687cc148381bdd5f51e3e81f5b20a735c55f690c5be94e05da2b0d5c"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b367a73a414bbb08507da102dc2cde0fa7afe57d09b3240ce82a16d608a7679c"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ecce4b2360aa3f008da3327d652e74a0e743908eac306198b47e1c58b03dd2b"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4435b8d83f0c9561a2a9585b1de78f1abb17cb0cef5f39bf6a4b47d19bafe3"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:616221a6d473c5b9aa83fa8982745441f6a4a62a66436be9445c65f241b86c94"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7e6382ce89a92bc1d0c0c5edd51e931432202b9080dc921d8d003e616402efd1"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff58f379345603d940e461eae474b6bbb6dab66ed9a851ecd3cb3709bf4dcf6a"}, + {file = "pydantic_core-2.18.3.tar.gz", hash = "sha256:432e999088d85c8f36b9a3f769a8e2b57aabd817bbb729a90d1fe7f18f6f1f39"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydub" @@ -1603,19 +2400,55 @@ files = [ [[package]] name = "pygments" -version = "2.17.2" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, - {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pyht" +version = "0.0.28" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pyht-0.0.28-py3-none-any.whl", hash = "sha256:ad8801acaa906eff5d6b39ce5ca76a08c154f705a2d0b2b6e841b219ef7875be"}, + {file = "pyht-0.0.28.tar.gz", hash = "sha256:00792e8c068fc905557525de9db0dbd7dcb651e15f05c6cc49490340b95a444a"}, +] + +[package.dependencies] +filelock = ">=3.12.4,<4.0.0" +grpcio = ">=1.58.0,<2.0.0" +protobuf = ">=4.24.3,<5.0.0" +requests = ">=2.31.0,<3.0.0" + +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "python-dotenv" version = "1.0.1" @@ -1632,17 +2465,28 @@ cli = ["click (>=5.0)"] [[package]] name = "python-multipart" -version = "0.0.6" +version = "0.0.9" description = "A streaming multipart parser for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, ] [package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +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 = "pyyaml" @@ -1656,6 +2500,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1663,8 +2508,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1681,6 +2534,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1688,122 +2542,142 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, ] +[[package]] +name = "redis" +version = "5.0.4" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, + {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {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"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1817,46 +2691,206 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "scipy" -version = "1.12.0" -description = "Fundamental algorithms for scientific computing in Python" +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.9" +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 = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "sentry-sdk" +version = "2.3.1" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.3.1-py2.py3-none-any.whl", hash = "sha256:c5aeb095ba226391d337dd42a6f9470d86c9fc236ecc71cfc7cd1942b45010c6"}, + {file = "sentry_sdk-2.3.1.tar.gz", hash = "sha256:139a71a19f5e9eb5d3623942491ce03cf8ebc14ea2e39ba3e6fe79560d8a5b1f"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +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-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +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 (>=5)"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" files = [ - {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, - {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, - {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, - {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, - {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, - {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, - {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, - {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, - {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, - {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, - {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, -] - -[package.dependencies] -numpy = ">=1.22.4,<1.29.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + {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 = "six" @@ -1871,27 +2905,27 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] name = "sounddevice" -version = "0.4.6" +version = "0.4.7" description = "Play and Record Sound with Python" optional = false python-versions = ">=3.7" files = [ - {file = "sounddevice-0.4.6-py3-none-any.whl", hash = "sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20"}, - {file = "sounddevice-0.4.6-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8"}, - {file = "sounddevice-0.4.6-py3-none-win32.whl", hash = "sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b"}, - {file = "sounddevice-0.4.6-py3-none-win_amd64.whl", hash = "sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c"}, - {file = "sounddevice-0.4.6.tar.gz", hash = "sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9"}, + {file = "sounddevice-0.4.7-py3-none-any.whl", hash = "sha256:1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7"}, + {file = "sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a"}, + {file = "sounddevice-0.4.7-py3-none-win32.whl", hash = "sha256:1ec1df094c468a210113aa22c4f390d5b4d9c7a73e41a6cb6ecfec83db59b380"}, + {file = "sounddevice-0.4.7-py3-none-win_amd64.whl", hash = "sha256:0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548"}, + {file = "sounddevice-0.4.7.tar.gz", hash = "sha256:69b386818d50a2d518607d4b973442e8d524760c7cd6c8b8be03d8c98fc4bce7"}, ] [package.dependencies] @@ -1900,80 +2934,62 @@ CFFI = ">=1.0" [package.extras] numpy = ["NumPy"] -[[package]] -name = "speechrecognition" -version = "3.10.1" -description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -optional = false -python-versions = ">=3.8" -files = [ - {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, - {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, -] - -[package.dependencies] -requests = ">=2.26.0" -typing-extensions = "*" - -[package.extras] -whisper-api = ["openai"] - [[package]] name = "sqlalchemy" -version = "2.0.25" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, - {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, - {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -2026,172 +3042,214 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "starlette" -version = "0.27.0" +version = "0.37.2" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [package.dependencies] anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "tenacity" -version = "8.2.3" +version = "8.3.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, + {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, ] +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.15.1" +version = "0.19.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, - {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, - {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, - {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, - {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, - {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, - {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, - {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, - {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, - {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, - {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, - {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, - {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, - {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, - {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, -] - -[package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -2205,28 +3263,62 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.14.1" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, - {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "twilio" +version = "9.1.0" +description = "Twilio API client and TwiML generator" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "twilio-9.1.0-py2.py3-none-any.whl", hash = "sha256:eb4687a9f81dc3118e8981c5a46d9f8184baee135c79afed47c714c759c31bbc"}, + {file = "twilio-9.1.0.tar.gz", hash = "sha256:ab2eb19c779855bf02cdca8a7e02ebaa64feee47da7b591ac9088ec07a6962e2"}, +] + +[package.dependencies] +aiohttp = ">=3.8.4" +aiohttp-retry = ">=2.8.3" +PyJWT = ">=2.0.0,<3.0.0" +requests = ">=2.0.0" + +[[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.9.0" +version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, ] [[package]] @@ -2244,80 +3336,367 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] + [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.30.0" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, - {file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, + {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, + {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, ] [package.dependencies] click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + [[package]] name = "vocode" version = "0.1.111" description = "The all-in-one voice SDK" optional = false -python-versions = ">=3.8.1,<3.12" +python-versions = ">=3.9,<3.12" +files = [] +develop = true + +[package.dependencies] +aiohttp = "^3.9.5" +anthropic = {version = "^0.28.0", optional = true} +azure-cognitiveservices-speech = {version = "^1.37.0", optional = true} +elevenlabs = {version = "^1.2.2", optional = true} +fastapi = "^0.111.0" +google-cloud-speech = {version = "^2.26.0", optional = true} +google-cloud-texttospeech = {version = "^2.16.3", optional = true} +janus = "^1.0.0" +jinja2 = "^3.1.4" +jsonschema = "^4.22.0" +langchain = {version = "^0.2.1", optional = true} +langchain-community = {version = "^0.2.1", optional = true} +loguru = "^0.7.2" +miniaudio = {version = "^1.59", optional = true} +nltk = {version = "^3.8.1", optional = true} +openai = {version = "^1.30.5", optional = true} +opentelemetry-sdk = "^1.24.0" +phonenumbers = "^8.13.37" +pvkoala = {version = "^2.0.1", optional = true} +pydantic = "^2.7.2" +pydub = {version = "^0.25.1", optional = true} +pyht = {version = "^0.0.28", optional = true} +redis = {version = "^5.0.4", optional = true} +requests = "^2.32.3" +sentry-sdk = {version = "^2.3.1", extras = ["fastapi"], optional = true} +sounddevice = "^0.4.7" +tiktoken = {version = "0.7.0", optional = true} +twilio = {version = "^9.1.0", optional = true} +uvicorn = "^0.30.0" +vonage = {version = "^3.14.0", optional = true} +websockets = "^12.0" + +[package.extras] +agents = ["anthropic (>=0.28.0,<0.29.0)", "openai (>=1.30.5,<2.0.0)", "tiktoken (==0.7.0)"] +all = ["anthropic (>=0.28.0,<0.29.0)", "azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=1.30.5,<2.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)", "redis (>=5.0.4,<6.0.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)", "tiktoken (==0.7.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)"] +synthesizers = ["azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)"] +telephony = ["redis (>=5.0.4,<6.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] + +[package.source] +type = "directory" +url = "../.." + +[[package]] +name = "vonage" +version = "3.14.0" +description = "Vonage Server SDK for Python" +optional = false +python-versions = ">=3.8" files = [ - {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, - {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, + {file = "vonage-3.14.0-py2.py3-none-any.whl", hash = "sha256:f8d28b8fcd157c0610d84b880779aadd3ab3768abfb18ef863e08669de163ccf"}, + {file = "vonage-3.14.0.tar.gz", hash = "sha256:ea001e9616abb19670c4250a1ac46288207030ebc9d9ecbcf5fcffef61fa5850"}, ] [package.dependencies] -aiohttp = ">=3.8.4,<4.0.0" -anthropic = ">=0.2.9,<0.3.0" -azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" -fastapi = ">=0.100.1,<0.101.0" -janus = ">=1.0.0,<2.0.0" -jinja2 = ">=3.1.2,<4.0.0" -langchain = ">=0.0.198,<0.0.199" -miniaudio = ">=1.59,<2.0" -nltk = ">=3.8.1,<4.0.0" -openai = ">=0.27.8,<0.28.0" -opentelemetry-sdk = ">=1.17.0,<2.0.0" -pydub = ">=0.25.1,<0.26.0" -python-multipart = ">=0.0.6,<0.0.7" -requests = ">=2.28.2,<3.0.0" -scipy = ">=1.10.1,<2.0.0" -six = ">=1.16.0,<2.0.0" -sounddevice = ">=0.4.6,<0.5.0" -speechrecognition = ">=3.10.0,<4.0.0" -uvicorn = ">=0.21.1,<0.22.0" -websockets = ">=11.0.2,<12.0.0" +Deprecated = "*" +pydantic = ">=2.5.2" +pytz = ">=2018.5" +requests = ">=2.4.2" +vonage-jwt = ">=1.1.0" -[package.extras] -actions = ["nylas (>=5.14.0,<6.0.0)"] -agents = ["google-cloud-aiplatform (>=1.26.0,<2.0.0)"] -all = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-aiplatform (>=1.26.0,<2.0.0)", "google-cloud-speech (>=2.19.0,<3.0.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)", "nylas (>=5.14.0,<6.0.0)", "redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] -synthesizers = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)"] -telephony = ["redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] -transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] +[[package]] +name = "vonage-jwt" +version = "1.1.1" +description = "Tooling for working with JWTs for Vonage APIs in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, + {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, +] + +[package.dependencies] +pyjwt = {version = ">=1.6.4", extras = ["crypto"]} +vonage-utils = ">=1.1.2" + +[[package]] +name = "vonage-utils" +version = "1.1.2" +description = "Utils package containing objects for use with Vonage APIs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, + {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, +] + +[package.dependencies] +pydantic = ">=2.7.1" +typing-extensions = ">=4.9.0" + +[[package]] +name = "watchfiles" +version = "0.22.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, +] + +[package.dependencies] +anyio = ">=3.0.0" [[package]] name = "wcwidth" @@ -2332,83 +3711,99 @@ files = [ [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.16.0" @@ -2593,20 +3988,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, + {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, ] [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"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "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.9,<3.12" -content-hash = "1f9bab039c4649c00109eb45a3d2e3ca5ff31cf0cdbabbed9e610c2d2aef9d35" +content-hash = "4f04aff2fd12f06ec9d2cb85b3ee1f4d34aca7ebd40858407f589fef00dab033" diff --git a/apps/client_backend/pyproject.toml b/apps/client_backend/pyproject.toml index 6863fbd168..ab75265668 100644 --- a/apps/client_backend/pyproject.toml +++ b/apps/client_backend/pyproject.toml @@ -7,9 +7,11 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.9,<3.12" -python-dotenv = "^1.0.0" -vocode = "0.1.111" -elevenlabs = "^0.2.23" +python-dotenv = "^1.0.1" +vocode = { path = "../..", extras = [ + "all", +], develop = true, python = ">=3.11,<3.12" } +elevenlabs = "^1.2.2" [build-system] diff --git a/apps/telephony_app/Dockerfile b/apps/telephony_app/Dockerfile index d96b3f348e..8c25f61403 100644 --- a/apps/telephony_app/Dockerfile +++ b/apps/telephony_app/Dockerfile @@ -16,4 +16,4 @@ RUN poetry install --no-dev --no-interaction --no-ansi COPY main.py /code/main.py COPY speller_agent.py /code/speller_agent.py -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000"] \ No newline at end of file +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3000"] diff --git a/apps/telephony_app/docker-compose.yml b/apps/telephony_app/docker-compose.yml index a6c5be9363..e6a2519bd6 100644 --- a/apps/telephony_app/docker-compose.yml +++ b/apps/telephony_app/docker-compose.yml @@ -3,14 +3,14 @@ services: image: redis:7.0.9-alpine command: redis-server --bind 0.0.0.0 ports: - - 6379:6379 + - 6379:6379 app: image: vocode-telephony-app env_file: - - .env + - .env ports: - - 3000:3000 + - 3000:3000 depends_on: - - redis + - redis environment: - - REDISHOST=redis + - REDISHOST=redis diff --git a/apps/telephony_app/main.py b/apps/telephony_app/main.py index b6ed34cbef..5acc6dd28d 100644 --- a/apps/telephony_app/main.py +++ b/apps/telephony_app/main.py @@ -1,42 +1,33 @@ # Standard library imports -import logging import os import sys +from dotenv import load_dotenv + # Third-party imports from fastapi import FastAPI -from vocode.streaming.models.telephony import TwilioConfig +from loguru import logger from pyngrok import ngrok -from vocode.streaming.telephony.config_manager.redis_config_manager import ( - RedisConfigManager, -) -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.telephony.server.base import ( - TwilioInboundCallConfig, - TelephonyServer, -) -from dotenv import load_dotenv # Local application/library specific imports -from speller_agent import ( - SpellerAgentFactory, - SpellerAgentConfig, -) +from speller_agent import SpellerAgentFactory + +from vocode.logging import configure_pretty_logging +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.telephony import TwilioConfig +from vocode.streaming.telephony.config_manager.redis_config_manager import RedisConfigManager +from vocode.streaming.telephony.server.base import TelephonyServer, TwilioInboundCallConfig # if running from python, this will load the local .env # docker-compose will load the .env file by itself load_dotenv() -app = FastAPI(docs_url=None) +configure_pretty_logging() -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) +app = FastAPI(docs_url=None) -config_manager = RedisConfigManager( - logger=logger, -) +config_manager = RedisConfigManager() BASE_URL = os.getenv("BASE_URL") @@ -66,7 +57,9 @@ ), # uncomment this to use the speller agent instead # agent_config=SpellerAgentConfig( - # initial_message=BaseMessage(text="im a speller agent, say something to me and ill spell it out for you"), + # initial_message=BaseMessage( + # text="im a speller agent, say something to me and ill spell it out for you" + # ), # generate_responses=False, # ), twilio_config=TwilioConfig( @@ -76,7 +69,6 @@ ) ], agent_factory=SpellerAgentFactory(), - logger=logger, ) app.include_router(telephony_server.get_router()) diff --git a/apps/telephony_app/outbound_call.py b/apps/telephony_app/outbound_call.py index 4fc6dba7a4..6c4ee35683 100644 --- a/apps/telephony_app/outbound_call.py +++ b/apps/telephony_app/outbound_call.py @@ -1,15 +1,18 @@ import os + from dotenv import load_dotenv -load_dotenv() +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.telephony import TwilioConfig -from vocode.streaming.telephony.conversation.outbound_call import OutboundCall -from vocode.streaming.telephony.config_manager.redis_config_manager import ( - RedisConfigManager, -) +load_dotenv() from speller_agent import SpellerAgentConfig +from vocode.streaming.telephony.config_manager.redis_config_manager import RedisConfigManager +from vocode.streaming.telephony.conversation.outbound_call import OutboundCall + BASE_URL = os.environ["BASE_URL"] @@ -21,12 +24,22 @@ async def main(): to_phone="+15555555555", from_phone="+15555555555", config_manager=config_manager, - agent_config=SpellerAgentConfig(generate_responses=False), + agent_config=ChatGPTAgentConfig( + initial_message=BaseMessage(text="What up"), + prompt_preamble="Have a pleasant conversation about life", + generate_responses=True, + ), + telephony_config=TwilioConfig( + account_sid=os.environ["TWILIO_ACCOUNT_SID"], + auth_token=os.environ["TWILIO_AUTH_TOKEN"], + ), ) input("Press enter to start call...") await outbound_call.start() + if __name__ == "__main__": import asyncio + asyncio.run(main()) diff --git a/apps/telephony_app/poetry.lock b/apps/telephony_app/poetry.lock index b262a12c26..d851a18351 100644 --- a/apps/telephony_app/poetry.lock +++ b/apps/telephony_app/poetry.lock @@ -2,92 +2,91 @@ [[package]] name = "aiohttp" -version = "3.9.1" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, - {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, - {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, - {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, - {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, - {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, - {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, - {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, - {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, - {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, - {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, - {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, - {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, - {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, - {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, - {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, - {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, - {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, - {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, - {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, - {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, - {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, - {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, - {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, - {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, - {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, - {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -125,47 +124,78 @@ files = [ frozenlist = ">=1.1.0" [[package]] -name = "anthropic" -version = "0.2.10" -description = "Library for accessing the anthropic API" +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "anthropic-0.2.10-py3-none-any.whl", hash = "sha256:a007496207fd186b0bcb9592b00ca130069d2a427f3d6f602a61dbbd1ac6316e"}, - {file = "anthropic-0.2.10.tar.gz", hash = "sha256:e4da061a86d8ffb86072c0b0feaf219a3a4f7dfddd4224df9ba769e469498c19"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anthropic" +version = "0.28.0" +description = "The official Python library for the anthropic API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -requests = "*" -tokenizers = "*" +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.7,<5" [package.extras] -dev = ["black (>=22.3.0)", "pytest"] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "4.2.0" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + [[package]] name = "async-timeout" version = "4.0.3" @@ -198,28 +228,39 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "azure-cognitiveservices-speech" -version = "1.34.1" +version = "1.37.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:f0bbdb78b6c48b34b870bb05e7085ae277ef230425b86e25ac62f808480bbbbf"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:501be52021acea776c23e1fae3fc08b65801008dc6d919959758723ee8114fbf"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:d28ec35b4e88d5205dda2afb401588d185dabeede9a16432d53f8751bcf853ba"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:12a243371a133d0299fcebb067ed93e989fdeaa163b5dcf63f6f2d6a2ebcb8e7"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win32.whl", hash = "sha256:cd0d4b84b6fd1657ad1f2b088fa83bb851c6f1568b514d92f265d9e958e7f83f"}, - {file = "azure_cognitiveservices_speech-1.34.1-py3-none-win_amd64.whl", hash = "sha256:21a1fc84eca697332862af0a1fafe0766e9742c91848e0c3a6cf4f883081721d"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:906d6bf65176e93464e2d763dd074ca00c48cfe1a896371fcdcb155a500910f7"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54ec8dd55d4dbd9058c61909e08485d3761d6d30954da189e1b17d84daf5e2e0"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:685424689725d2d4115485998c0888c8b5b502259037ff533e5a834575f80b66"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:384f66786c2335165035270897b34d0b91736a1fdf38f7696e9a227075cb2489"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win32.whl", hash = "sha256:343d5f449ccd6c9b53cd37dd46a70ece0905243517df7a0c047779e55072254c"}, + {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win_amd64.whl", hash = "sha256:a18fb45490cdcd681407ccaad9560fb14dda1c8276de297e219ea1a880467e28"}, +] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -412,43 +453,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.1" +version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77"}, - {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa"}, - {file = "cryptography-42.0.1-cp37-abi3-win32.whl", hash = "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453"}, - {file = "cryptography-42.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302"}, - {file = "cryptography-42.0.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49"}, - {file = "cryptography-42.0.1-cp39-abi3-win32.whl", hash = "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881"}, - {file = "cryptography-42.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04"}, - {file = "cryptography-42.0.1.tar.gz", hash = "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, + {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, + {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, + {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, + {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, + {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, + {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, + {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, + {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, + {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, + {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, + {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, + {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, + {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, ] [package.dependencies] @@ -466,19 +507,30 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.5.14" +version = "0.6.6" description = "Easily serialize dataclasses to and from JSON." optional = false -python-versions = ">=3.7,<3.13" +python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, - {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, + {file = "dataclasses_json-0.6.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, + {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, ] [package.dependencies] marshmallow = ">=3.18.0,<4.0.0" typing-inspect = ">=0.4.0,<1" +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + [[package]] name = "deprecated" version = "1.2.14" @@ -497,52 +549,142 @@ wrapt = ">=1.10,<2" dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] -name = "exceptiongroup" -version = "1.2.0" -description = "Backport of PEP 654 (exception groups)" +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "elevenlabs" +version = "1.2.2" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "elevenlabs-1.2.2-py3-none-any.whl", hash = "sha256:60b92b0e2aabdfba93a43569f207f8a2ad397492519b8e11a2eebb32807ddefa"}, + {file = "elevenlabs-1.2.2.tar.gz", hash = "sha256:ebd02869b95602b8956874dd727981bb49ad16b9a3c2f5901193d838213694aa"}, +] + +[package.dependencies] +httpx = ">=0.21.2" +ipython = ">=7.0" +pydantic = ">=1.9.2" +requests = ">=2.20" +typing_extensions = ">=4.0.0" +websockets = ">=11.0" + +[[package]] +name = "email-validator" +version = "2.1.1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, + {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -test = ["pytest (>=6)"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastapi" -version = "0.100.1" +version = "0.111.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, +] + +[package.dependencies] +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" files = [ - {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, - {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, ] [package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +typer = ">=0.12.3" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.13.1" +version = "3.14.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, + {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +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-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -633,13 +775,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.12.2" +version = "2024.5.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, - {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, + {file = "fsspec-2024.5.0-py3-none-any.whl", hash = "sha256:e0fdbc446d67e182f49a70b82cf7889028a63588fde6b222521f10937b2b670c"}, + {file = "fsspec-2024.5.0.tar.gz", hash = "sha256:1d021b0b0f933e3b3029ed808eb400c08ba101ca2de4b3483fbc9ca23fcee94a"}, ] [package.extras] @@ -647,7 +789,7 @@ abfs = ["adlfs"] adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] -devel = ["pytest", "pytest-cov"] +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"] @@ -657,15 +799,117 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +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 = "google-api-core" +version = "2.19.0" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.29.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-cloud-speech" +version = "2.26.0" +description = "Google Cloud Speech API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, + {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" + +[[package]] +name = "google-cloud-texttospeech" +version = "2.16.3" +description = "Google Cloud Texttospeech API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, + {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" + +[[package]] +name = "googleapis-common-protos" +version = "1.63.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, + {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "greenlet" version = "3.0.3" @@ -737,6 +981,80 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "grpcio" +version = "1.64.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, + {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, + {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, + {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, + {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, + {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, + {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, + {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, + {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, + {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, + {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, + {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, + {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, + {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, + {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, + {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, + {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, + {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, + {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, + {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, + {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.0)"] + +[[package]] +name = "grpcio-status" +version = "1.62.2" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.62.2" +protobuf = ">=4.21.6" + [[package]] name = "h11" version = "0.14.0" @@ -750,13 +1068,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] @@ -767,17 +1085,65 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -795,13 +1161,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.20.3" +version = "0.23.2" 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.20.3-py3-none-any.whl", hash = "sha256:d988ae4f00d3e307b0c80c6a05ca6dbb7edba8bba3079f74cda7d9c2e562a7b6"}, - {file = "huggingface_hub-0.20.3.tar.gz", hash = "sha256:94e7f8e074475fbc67d6a71957b678e1b4a74ff1b64a644fd6cbb83da962d05d"}, + {file = "huggingface_hub-0.23.2-py3-none-any.whl", hash = "sha256:48727a16e704d409c4bb5913613308499664f22a99743435dc3a13b23c485827"}, + {file = "huggingface_hub-0.23.2.tar.gz", hash = "sha256:f6829b62d5fdecb452a76fdbec620cba4c1573655a8d710c1df71735fd9edbd2"}, ] [package.dependencies] @@ -814,37 +1180,39 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.1.3)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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"] -inference = ["aiohttp", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)"] -quality = ["mypy (==1.5.1)", "ruff (>=0.1.3)"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (>1.1,<2.0)", "pydantic (>1.1,<3.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "6.11.0" +version = "7.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.11.0-py3-none-any.whl", hash = "sha256:f0afba6205ad8f8947c7d338b5342d5db2afbfd82f9cbef7879a9539cc12eb9b"}, - {file = "importlib_metadata-6.11.0.tar.gz", hash = "sha256:1231cf92d825c9e03cfc4da076a16de6422c863558229ea0b22b675657463443"}, + {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] @@ -855,6 +1223,43 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link 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 = "ipython" +version = "8.24.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, + {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + [[package]] name = "janus" version = "1.0.0" @@ -869,15 +1274,34 @@ files = [ [package.dependencies] typing-extensions = ">=3.7.4.3" +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" -version = "3.1.3" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, - {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -886,190 +1310,452 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jiter" +version = "0.4.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, + {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, + {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, + {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, + {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, + {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, + {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, + {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, + {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, + {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, + {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, + {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, + {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, + {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, + {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, + {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, + {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, + {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, + {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, + {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, + {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, + {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, + {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, + {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, + {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, + {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, + {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, +] + [[package]] name = "joblib" -version = "1.3.2" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "langchain" -version = "0.0.198" +version = "0.2.1" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.0.198-py3-none-any.whl", hash = "sha256:9d8e57ec25901989339ffac2ea7e759333d084100c90526e8ad57fb61b2003c9"}, - {file = "langchain-0.0.198.tar.gz", hash = "sha256:656385c23aeec1f8f4efbce598f729c817c60eb3f7c9fd77c03a8d28e7d0fa81"}, + {file = "langchain-0.2.1-py3-none-any.whl", hash = "sha256:3e13bf97c5717bce2c281f5117e8778823e8ccf62d949e73d3869448962b1c97"}, + {file = "langchain-0.2.1.tar.gz", hash = "sha256:5758a315e1ac92eb26dafec5ad0fafa03cafa686aba197d5bb0b1dd28cc03ebe"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.6.0" -langchainplus-sdk = ">=0.0.7" -numexpr = ">=2.8.4,<3.0.0" +langchain-core = ">=0.2.0,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" numpy = ">=1,<2" -openapi-schema-pydantic = ">=1.2,<2.0" -pydantic = ">=1,<2" -PyYAML = ">=5.4.1" +pydantic = ">=1,<3" +PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] -all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.2.6,<0.3.0)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.2,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=3,<4)", "deeplake (>=3.3.0,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=2.8.6,<3.0.0)", "elasticsearch (>=8,<9)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.1.dev3,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.1.2,<2.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.6.1,<0.7.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)"] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0a20230509004)", "openai (>=0,<1)"] -cohere = ["cohere (>=3,<4)"] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<6)"] docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "chardet (>=5.1.0,<6.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "psychicapi (>=0.5,<0.6)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "zep-python (>=0.31)"] -llms = ["anthropic (>=0.2.6,<0.3.0)", "cohere (>=3,<4)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"] -qdrant = ["qdrant-client (>=1.1.2,<2.0.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.1,<0.2)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.7,<1.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] text-helpers = ["chardet (>=5.1.0,<6.0.0)"] [[package]] -name = "langchainplus-sdk" -version = "0.0.20" -description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +name = "langchain-community" +version = "0.2.1" +description = "Community contributed LangChain integrations." optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchainplus_sdk-0.0.20-py3-none-any.whl", hash = "sha256:07a869d476755803aa04c4986ce78d00c2fe4ff584c0eaa57d7570c9664188db"}, - {file = "langchainplus_sdk-0.0.20.tar.gz", hash = "sha256:3d300e2e3290f68cc9d842c059f9458deba60e776c9e790309688cad1bfbb219"}, + {file = "langchain_community-0.2.1-py3-none-any.whl", hash = "sha256:b834e2c5ded6903b839fcaf566eee90a0ffae53405a0f7748202725e701d39cd"}, + {file = "langchain_community-0.2.1.tar.gz", hash = "sha256:079942e8f15da975769ccaae19042b7bba5481c42020bbbd7d8cad73a9393261"}, ] [package.dependencies] -pydantic = ">=1,<2" +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain = ">=0.2.0,<0.3.0" +langchain-core = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpathlib (>=0.18,<0.19)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] + [[package]] -name = "markupsafe" -version = "2.1.4" -description = "Safely add untrusted strings to HTML/XML markup." +name = "langchain-core" +version = "0.2.3" +description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.7" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "langchain_core-0.2.3-py3-none-any.whl", hash = "sha256:22189b5a3a30bfd65eb995f95e627f7c2c3acb322feb89f5f5f2fb7df21833a7"}, + {file = "langchain_core-0.2.3.tar.gz", hash = "sha256:fbc75a64b9c0b7655d96ca57a707df1e6c09efc1539c36adbd73260612549810"}, ] +[package.dependencies] +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.65,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + [[package]] -name = "marshmallow" -version = "3.20.2" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +name = "langchain-text-splitters" +version = "0.2.0" +description = "LangChain text splitting utilities" optional = false -python-versions = ">=3.8" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "marshmallow-3.20.2-py3-none-any.whl", hash = "sha256:c21d4b98fee747c130e6bc8f45c4b3199ea66bc00c12ee1f639f0aeca034d5e9"}, - {file = "marshmallow-3.20.2.tar.gz", hash = "sha256:4c1daff273513dc5eb24b219a8035559dc573c8f322558ef85f5438ddd1236dd"}, + {file = "langchain_text_splitters-0.2.0-py3-none-any.whl", hash = "sha256:7b4c6a45f8471630a882b321e138329b6897102a5bc62f4c12be1c0b05bb9199"}, + {file = "langchain_text_splitters-0.2.0.tar.gz", hash = "sha256:b32ab4f7397f7d42c1fa3283fefc2547ba356bd63a68ee9092865e5ad83c82f9"}, ] [package.dependencies] -packaging = ">=17.0" +langchain-core = ">=0.2.0,<0.3.0" [package.extras] -dev = ["pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.15)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["pre-commit (>=2.4,<4.0)"] -tests = ["pytest", "pytz", "simplejson"] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] -name = "miniaudio" -version = "1.59" -description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" +name = "langsmith" +version = "0.1.65" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false -python-versions = "*" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, - {file = "miniaudio-1.59-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba6f802376f49977e9698740411db46092ea005894ff86d805aeddde7e505c1e"}, - {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f24b44bd28ca631b830bc91bd910cb0209fba005401effa64cee9a8ba580992"}, - {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8980dda51e92ea750ca8bcfb1d2c198eca7e4c844ab857faac12e20245322aa6"}, - {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e21f56d51c627cef612d1a7bbc73fc7c5e03908f5ebc22c98494951ab8ccd3c8"}, - {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f6f1665ce8ed46caac48beec64c70e248a0b4e001590c698695cd22c1f634a0"}, - {file = "miniaudio-1.59-cp310-cp310-win32.whl", hash = "sha256:799b393adce56c8df1df16e7dc692a83125888df9ecf8ec0242c4905df6275ef"}, - {file = "miniaudio-1.59-cp310-cp310-win_amd64.whl", hash = "sha256:44c6b48f01d934784da282f7a17c40be9110ee6bc723f5f90916d2b2e729c9cc"}, - {file = "miniaudio-1.59-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a9387e85e6a63d66a873f4208fbaba93179d11423da08dc83c78dd1b68ba504"}, - {file = "miniaudio-1.59-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12fbbe3934856ab54fa8889ab6ec6b62a97faa2f85a8830e286fe5a4e9584ca4"}, - {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4a9a1dc4352af4198f6ca0c20bac8b5b6a89d0d67e3535149ef08420a1ab3c9"}, - {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eb9eac3f23fd4c94925830fa9c172e98aebfb12cec1dbfa6a7693b9e4c1e555"}, - {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:52882c36126c3a97fcdd8d753e4b1b07934bba9d4d3c431aa7f4914849090cac"}, - {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6bb6deee6d5969292d22730d31ee85ed0edc2997ca79978db0cca269ab73761"}, - {file = "miniaudio-1.59-cp311-cp311-win32.whl", hash = "sha256:6afe7449d7d593ba3f8bd91085a392d0c6ca3be4c03b62af37cb46f6c0c0d9f4"}, - {file = "miniaudio-1.59-cp311-cp311-win_amd64.whl", hash = "sha256:a22832e449a31620317ae657f7fd20a42466e5768c48373f8f28c53f2b36f5cd"}, - {file = "miniaudio-1.59-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbfb3c853641c8bd835e0654f49fe0c09b4018b1ecc7e4c2436e02fbaf748c4b"}, - {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45ce3596c693053a578db725848a90ba0dfcc03d1d94124b9fddaa9e50a7533e"}, - {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d07228047352b655a82711704a635eee41eb3977ceaaf672ee17d64a3ba261b7"}, - {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:586f95f1d10f5d4f58b272c15c601c3ba13128bd34a839bce5bd28a839d5cf3c"}, - {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7644f19b1dc00bca3ec9e6066eb8879c0e638091955092a1d7085a38d7de6e0f"}, - {file = "miniaudio-1.59-cp37-cp37m-win32.whl", hash = "sha256:055fb3a2e00ddcce2a2809cd2a3d5e68234588a00c70533fa4b68f0178829dce"}, - {file = "miniaudio-1.59-cp37-cp37m-win_amd64.whl", hash = "sha256:e1acea13830a53c026e58d44856ba4951a26eb0d0a2fda2ce6dc7280b6f57f81"}, - {file = "miniaudio-1.59-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8b6f1d4a2551061721cc7b22fb0eb3839aad9137553e01b4dde1a31c91ca45"}, + {file = "langsmith-0.1.65-py3-none-any.whl", hash = "sha256:ab4487029240e69cca30da1065f1e9138e5a7ca2bbe8c697f0bd7d5839f71cf7"}, + {file = "langsmith-0.1.65.tar.gz", hash = "sha256:d3c2eb2391478bd79989f02652cf66e29a7959d677614b6993a47cef43f7f43b"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[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" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "marshmallow" +version = "3.21.2" +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.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, + {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, +] + +[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 = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[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 = "miniaudio" +version = "1.59" +description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" +optional = false +python-versions = "*" +files = [ + {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, + {file = "miniaudio-1.59-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba6f802376f49977e9698740411db46092ea005894ff86d805aeddde7e505c1e"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f24b44bd28ca631b830bc91bd910cb0209fba005401effa64cee9a8ba580992"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8980dda51e92ea750ca8bcfb1d2c198eca7e4c844ab857faac12e20245322aa6"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e21f56d51c627cef612d1a7bbc73fc7c5e03908f5ebc22c98494951ab8ccd3c8"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f6f1665ce8ed46caac48beec64c70e248a0b4e001590c698695cd22c1f634a0"}, + {file = "miniaudio-1.59-cp310-cp310-win32.whl", hash = "sha256:799b393adce56c8df1df16e7dc692a83125888df9ecf8ec0242c4905df6275ef"}, + {file = "miniaudio-1.59-cp310-cp310-win_amd64.whl", hash = "sha256:44c6b48f01d934784da282f7a17c40be9110ee6bc723f5f90916d2b2e729c9cc"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a9387e85e6a63d66a873f4208fbaba93179d11423da08dc83c78dd1b68ba504"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12fbbe3934856ab54fa8889ab6ec6b62a97faa2f85a8830e286fe5a4e9584ca4"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4a9a1dc4352af4198f6ca0c20bac8b5b6a89d0d67e3535149ef08420a1ab3c9"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eb9eac3f23fd4c94925830fa9c172e98aebfb12cec1dbfa6a7693b9e4c1e555"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:52882c36126c3a97fcdd8d753e4b1b07934bba9d4d3c431aa7f4914849090cac"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6bb6deee6d5969292d22730d31ee85ed0edc2997ca79978db0cca269ab73761"}, + {file = "miniaudio-1.59-cp311-cp311-win32.whl", hash = "sha256:6afe7449d7d593ba3f8bd91085a392d0c6ca3be4c03b62af37cb46f6c0c0d9f4"}, + {file = "miniaudio-1.59-cp311-cp311-win_amd64.whl", hash = "sha256:a22832e449a31620317ae657f7fd20a42466e5768c48373f8f28c53f2b36f5cd"}, + {file = "miniaudio-1.59-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbfb3c853641c8bd835e0654f49fe0c09b4018b1ecc7e4c2436e02fbaf748c4b"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45ce3596c693053a578db725848a90ba0dfcc03d1d94124b9fddaa9e50a7533e"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d07228047352b655a82711704a635eee41eb3977ceaaf672ee17d64a3ba261b7"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:586f95f1d10f5d4f58b272c15c601c3ba13128bd34a839bce5bd28a839d5cf3c"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7644f19b1dc00bca3ec9e6066eb8879c0e638091955092a1d7085a38d7de6e0f"}, + {file = "miniaudio-1.59-cp37-cp37m-win32.whl", hash = "sha256:055fb3a2e00ddcce2a2809cd2a3d5e68234588a00c70533fa4b68f0178829dce"}, + {file = "miniaudio-1.59-cp37-cp37m-win_amd64.whl", hash = "sha256:e1acea13830a53c026e58d44856ba4951a26eb0d0a2fda2ce6dc7280b6f57f81"}, + {file = "miniaudio-1.59-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8b6f1d4a2551061721cc7b22fb0eb3839aad9137553e01b4dde1a31c91ca45"}, {file = "miniaudio-1.59-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:011b2b8d5c57a485a6b86476e24c1c6be4a61ec8c33c456e3052929269857d0d"}, {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b270e9e1df5ec05d03659febffaa704709d7c9cb0b3597cb0a993875d73be84"}, {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab9d0468790109bafc88ce9d1c93454b2d384af0c14a6657620315115390c8d"}, @@ -1105,85 +1791,101 @@ cffi = ">=1.12.0" [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -1222,168 +1924,169 @@ plot = ["matplotlib"] tgrep = ["pyparsing"] twitter = ["twython"] -[[package]] -name = "numexpr" -version = "2.8.8" -description = "Fast numerical expression evaluator for NumPy" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numexpr-2.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525"}, - {file = "numexpr-2.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd"}, - {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127"}, - {file = "numexpr-2.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6"}, - {file = "numexpr-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520"}, - {file = "numexpr-2.8.8-cp310-cp310-win32.whl", hash = "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef"}, - {file = "numexpr-2.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d"}, - {file = "numexpr-2.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68"}, - {file = "numexpr-2.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4"}, - {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5"}, - {file = "numexpr-2.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce"}, - {file = "numexpr-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373"}, - {file = "numexpr-2.8.8-cp311-cp311-win32.whl", hash = "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd"}, - {file = "numexpr-2.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084"}, - {file = "numexpr-2.8.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce"}, - {file = "numexpr-2.8.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3"}, - {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c"}, - {file = "numexpr-2.8.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa"}, - {file = "numexpr-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61"}, - {file = "numexpr-2.8.8-cp312-cp312-win32.whl", hash = "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a"}, - {file = "numexpr-2.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6"}, - {file = "numexpr-2.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0"}, - {file = "numexpr-2.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39"}, - {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921"}, - {file = "numexpr-2.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406"}, - {file = "numexpr-2.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729"}, - {file = "numexpr-2.8.8-cp39-cp39-win32.whl", hash = "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3"}, - {file = "numexpr-2.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2"}, - {file = "numexpr-2.8.8.tar.gz", hash = "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34"}, -] - -[package.dependencies] -numpy = ">=1.13.3" - [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openai" -version = "0.27.10" -description = "Python client library for the OpenAI API" +version = "1.30.5" +description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.10-py3-none-any.whl", hash = "sha256:beabd1757e3286fa166dde3b70ebb5ad8081af046876b47c14c41e203ed22a14"}, - {file = "openai-0.27.10.tar.gz", hash = "sha256:60e09edf7100080283688748c6803b7b3b52d5a55d21890f3815292a0552d83b"}, + {file = "openai-1.30.5-py3-none-any.whl", hash = "sha256:2ad95e926de0d2e09cde632a9204b0a6dca4a03c2cdcc84329b01f355784355a"}, + {file = "openai-1.30.5.tar.gz", hash = "sha256:5366562eb2c5917e6116ae0391b7ae6e3acd62b0ae3f565ada32b35d8fcfa106"}, ] [package.dependencies] -aiohttp = "*" -requests = ">=2.20" -tqdm = "*" +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" [package.extras] -datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] -embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] -wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] - -[[package]] -name = "openapi-schema-pydantic" -version = "1.2.4" -description = "OpenAPI (v3) specification schema as pydantic class" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "openapi-schema-pydantic-1.2.4.tar.gz", hash = "sha256:3e22cf58b74a69f752cc7e5f1537f6e44164282db2700cbbcd3bb99ddd065196"}, - {file = "openapi_schema_pydantic-1.2.4-py3-none-any.whl", hash = "sha256:a932ecc5dcbb308950282088956e94dea069c9823c84e507d64f6b622222098c"}, -] - -[package.dependencies] -pydantic = ">=1.8.2" +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.22.0" +version = "1.24.0" description = "OpenTelemetry Python API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.22.0-py3-none-any.whl", hash = "sha256:43621514301a7e9f5d06dd8013a1b450f30c2e9372b8e30aaeb4562abf2ce034"}, - {file = "opentelemetry_api-1.22.0.tar.gz", hash = "sha256:15ae4ca925ecf9cfdfb7a709250846fbb08072260fca08ade78056c502b86bed"}, + {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" +importlib-metadata = ">=6.0,<=7.0" [[package]] name = "opentelemetry-sdk" -version = "1.22.0" +version = "1.24.0" description = "OpenTelemetry Python SDK" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.22.0-py3-none-any.whl", hash = "sha256:a730555713d7c8931657612a88a141e3a4fe6eb5523d9e2d5a8b1e673d76efa6"}, - {file = "opentelemetry_sdk-1.22.0.tar.gz", hash = "sha256:45267ac1f38a431fc2eb5d6e0c0d83afc0b78de57ac345488aa58c28c17991d0"}, + {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.22.0" -opentelemetry-semantic-conventions = "0.43b0" +opentelemetry-api = "1.24.0" +opentelemetry-semantic-conventions = "0.45b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.43b0" +version = "0.45b0" description = "OpenTelemetry Semantic Conventions" optional = false -python-versions = ">=3.7" +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.3" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.43b0-py3-none-any.whl", hash = "sha256:291284d7c1bf15fdaddf309b3bd6d3b7ce12a253cec6d27144439819a15d8445"}, - {file = "opentelemetry_semantic_conventions-0.43b0.tar.gz", hash = "sha256:b9576fb890df479626fa624e88dde42d3d60b8b6c8ae1152ad157a8b97358635"}, + {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, + {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, + {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, + {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, + {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, + {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, + {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, + {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, + {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, + {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, + {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, + {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, + {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, + {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, + {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, + {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, + {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, + {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, + {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, + {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, + {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, + {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, + {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, + {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, + {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, + {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, ] [[package]] @@ -1397,68 +2100,278 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "phonenumbers" +version = "8.13.37" +description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." +optional = false +python-versions = "*" +files = [ + {file = "phonenumbers-8.13.37-py2.py3-none-any.whl", hash = "sha256:4ea00ef5012422c08c7955c21131e7ae5baa9a3ef52cf2d561e963f023006b80"}, + {file = "phonenumbers-8.13.37.tar.gz", hash = "sha256:bd315fed159aea0516f7c367231810fe8344d5bec26156b88fa18374c11d1cf2"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.45" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, + {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "proto-plus" +version = "1.23.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pvkoala" +version = "2.0.1" +description = "Koala Noise Suppression Engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pvkoala-2.0.1-py3-none-any.whl", hash = "sha256:8b153e076b4d14adccdcb4d800aa84e8d2f91e0640b959677582d3128cbcb249"}, + {file = "pvkoala-2.0.1.tar.gz", hash = "sha256:5e017c671fc1338d42dc20f9dee003d0144bbba1757b6f1fcd6272c5308da242"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "1.10.14" -description = "Data validation and settings management using python type hints" +version = "2.7.2" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pydantic-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054"}, - {file = "pydantic-1.10.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d"}, - {file = "pydantic-1.10.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9"}, - {file = "pydantic-1.10.14-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a"}, - {file = "pydantic-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7"}, - {file = "pydantic-1.10.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663"}, - {file = "pydantic-1.10.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046"}, - {file = "pydantic-1.10.14-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca"}, - {file = "pydantic-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f"}, - {file = "pydantic-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5"}, - {file = "pydantic-1.10.14-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc"}, - {file = "pydantic-1.10.14-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe"}, - {file = "pydantic-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee"}, - {file = "pydantic-1.10.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee"}, - {file = "pydantic-1.10.14-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022"}, - {file = "pydantic-1.10.14-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f"}, - {file = "pydantic-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4"}, - {file = "pydantic-1.10.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7"}, - {file = "pydantic-1.10.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f"}, - {file = "pydantic-1.10.14-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593"}, - {file = "pydantic-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8"}, - {file = "pydantic-1.10.14-py3-none-any.whl", hash = "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c"}, - {file = "pydantic-1.10.14.tar.gz", hash = "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] + {file = "pydantic-2.7.2-py3-none-any.whl", hash = "sha256:834ab954175f94e6e68258537dc49402c4a5e9d0409b9f1b86b7e934a8372de7"}, + {file = "pydantic-2.7.2.tar.gz", hash = "sha256:71b2945998f9c9b7919a45bde9a50397b289937d215ae141c1d0903ba7149fd7"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.3" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.3" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:744697428fcdec6be5670460b578161d1ffe34743a5c15656be7ea82b008197c"}, + {file = "pydantic_core-2.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b40c05ced1ba4218b14986fe6f283d22e1ae2ff4c8e28881a70fb81fbfcda7"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a9a75622357076efb6b311983ff190fbfb3c12fc3a853122b34d3d358126c"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2e253af04ceaebde8eb201eb3f3e3e7e390f2d275a88300d6a1959d710539e2"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:855ec66589c68aa367d989da5c4755bb74ee92ccad4fdb6af942c3612c067e34"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3e42bb54e7e9d72c13ce112e02eb1b3b55681ee948d748842171201a03a98a"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6ac9ffccc9d2e69d9fba841441d4259cb668ac180e51b30d3632cd7abca2b9b"}, + {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c56eca1686539fa0c9bda992e7bd6a37583f20083c37590413381acfc5f192d6"}, + {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17954d784bf8abfc0ec2a633108207ebc4fa2df1a0e4c0c3ccbaa9bb01d2c426"}, + {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:98ed737567d8f2ecd54f7c8d4f8572ca7c7921ede93a2e52939416170d357812"}, + {file = "pydantic_core-2.18.3-cp310-none-win32.whl", hash = "sha256:9f9e04afebd3ed8c15d67a564ed0a34b54e52136c6d40d14c5547b238390e779"}, + {file = "pydantic_core-2.18.3-cp310-none-win_amd64.whl", hash = "sha256:45e4ffbae34f7ae30d0047697e724e534a7ec0a82ef9994b7913a412c21462a0"}, + {file = "pydantic_core-2.18.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b9ebe8231726c49518b16b237b9fe0d7d361dd221302af511a83d4ada01183ab"}, + {file = "pydantic_core-2.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8e20e15d18bf7dbb453be78a2d858f946f5cdf06c5072453dace00ab652e2b2"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d9ff283cd3459fa0bf9b0256a2b6f01ac1ff9ffb034e24457b9035f75587cb"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f7ef5f0ebb77ba24c9970da18b771711edc5feaf00c10b18461e0f5f5949231"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73038d66614d2e5cde30435b5afdced2b473b4c77d4ca3a8624dd3e41a9c19be"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6afd5c867a74c4d314c557b5ea9520183fadfbd1df4c2d6e09fd0d990ce412cd"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd7df92f28d351bb9f12470f4c533cf03d1b52ec5a6e5c58c65b183055a60106"}, + {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80aea0ffeb1049336043d07799eace1c9602519fb3192916ff525b0287b2b1e4"}, + {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaee40f25bba38132e655ffa3d1998a6d576ba7cf81deff8bfa189fb43fd2bbe"}, + {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9128089da8f4fe73f7a91973895ebf2502539d627891a14034e45fb9e707e26d"}, + {file = "pydantic_core-2.18.3-cp311-none-win32.whl", hash = "sha256:fec02527e1e03257aa25b1a4dcbe697b40a22f1229f5d026503e8b7ff6d2eda7"}, + {file = "pydantic_core-2.18.3-cp311-none-win_amd64.whl", hash = "sha256:58ff8631dbab6c7c982e6425da8347108449321f61fe427c52ddfadd66642af7"}, + {file = "pydantic_core-2.18.3-cp311-none-win_arm64.whl", hash = "sha256:3fc1c7f67f34c6c2ef9c213e0f2a351797cda98249d9ca56a70ce4ebcaba45f4"}, + {file = "pydantic_core-2.18.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0928cde2ae416a2d1ebe6dee324709c6f73e93494d8c7aea92df99aab1fc40f"}, + {file = "pydantic_core-2.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bee9bb305a562f8b9271855afb6ce00223f545de3d68560b3c1649c7c5295e9"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e862823be114387257dacbfa7d78547165a85d7add33b446ca4f4fae92c7ff5c"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a36f78674cbddc165abab0df961b5f96b14461d05feec5e1f78da58808b97e7"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba905d184f62e7ddbb7a5a751d8a5c805463511c7b08d1aca4a3e8c11f2e5048"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fdd362f6a586e681ff86550b2379e532fee63c52def1c666887956748eaa326"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b214b7ee3bd3b865e963dbed0f8bc5375f49449d70e8d407b567af3222aae4"}, + {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691018785779766127f531674fa82bb368df5b36b461622b12e176c18e119022"}, + {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:60e4c625e6f7155d7d0dcac151edf5858102bc61bf959d04469ca6ee4e8381bd"}, + {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4e651e47d981c1b701dcc74ab8fec5a60a5b004650416b4abbef13db23bc7be"}, + {file = "pydantic_core-2.18.3-cp312-none-win32.whl", hash = "sha256:ffecbb5edb7f5ffae13599aec33b735e9e4c7676ca1633c60f2c606beb17efc5"}, + {file = "pydantic_core-2.18.3-cp312-none-win_amd64.whl", hash = "sha256:2c8333f6e934733483c7eddffdb094c143b9463d2af7e6bd85ebcb2d4a1b82c6"}, + {file = "pydantic_core-2.18.3-cp312-none-win_arm64.whl", hash = "sha256:7a20dded653e516a4655f4c98e97ccafb13753987434fe7cf044aa25f5b7d417"}, + {file = "pydantic_core-2.18.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:eecf63195be644b0396f972c82598cd15693550f0ff236dcf7ab92e2eb6d3522"}, + {file = "pydantic_core-2.18.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c44efdd3b6125419c28821590d7ec891c9cb0dff33a7a78d9d5c8b6f66b9702"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e59fca51ffbdd1638b3856779342ed69bcecb8484c1d4b8bdb237d0eb5a45e2"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70cf099197d6b98953468461d753563b28e73cf1eade2ffe069675d2657ed1d5"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63081a49dddc6124754b32a3774331467bfc3d2bd5ff8f10df36a95602560361"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:370059b7883485c9edb9655355ff46d912f4b03b009d929220d9294c7fd9fd60"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64faeedfd8254f05f5cf6fc755023a7e1606af3959cfc1a9285744cc711044"}, + {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d2e725de0f90d8671f89e420d36c3dd97639b98145e42fcc0e1f6d492a46dc"}, + {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:67bc078025d70ec5aefe6200ef094576c9d86bd36982df1301c758a9fff7d7f4"}, + {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf952c3f4100e203cbaf8e0c907c835d3e28f9041474e52b651761dc248a3c0"}, + {file = "pydantic_core-2.18.3-cp38-none-win32.whl", hash = "sha256:9a46795b1f3beb167eaee91736d5d17ac3a994bf2215a996aed825a45f897558"}, + {file = "pydantic_core-2.18.3-cp38-none-win_amd64.whl", hash = "sha256:200ad4e3133cb99ed82342a101a5abf3d924722e71cd581cc113fe828f727fbc"}, + {file = "pydantic_core-2.18.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:304378b7bf92206036c8ddd83a2ba7b7d1a5b425acafff637172a3aa72ad7083"}, + {file = "pydantic_core-2.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c826870b277143e701c9ccf34ebc33ddb4d072612683a044e7cce2d52f6c3fef"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e201935d282707394f3668380e41ccf25b5794d1b131cdd96b07f615a33ca4b1"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5560dda746c44b48bf82b3d191d74fe8efc5686a9ef18e69bdabccbbb9ad9442"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b32c2a1f8032570842257e4c19288eba9a2bba4712af542327de9a1204faff8"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:929c24e9dea3990bc8bcd27c5f2d3916c0c86f5511d2caa69e0d5290115344a9"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a8376fef60790152564b0eab376b3e23dd6e54f29d84aad46f7b264ecca943"}, + {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dccf3ef1400390ddd1fb55bf0632209d39140552d068ee5ac45553b556780e06"}, + {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41dbdcb0c7252b58fa931fec47937edb422c9cb22528f41cb8963665c372caf6"}, + {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:666e45cf071669fde468886654742fa10b0e74cd0fa0430a46ba6056b24fb0af"}, + {file = "pydantic_core-2.18.3-cp39-none-win32.whl", hash = "sha256:f9c08cabff68704a1b4667d33f534d544b8a07b8e5d039c37067fceb18789e78"}, + {file = "pydantic_core-2.18.3-cp39-none-win_amd64.whl", hash = "sha256:4afa5f5973e8572b5c0dcb4e2d4fda7890e7cd63329bd5cc3263a25c92ef0026"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:77319771a026f7c7d29c6ebc623de889e9563b7087911b46fd06c044a12aa5e9"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:df11fa992e9f576473038510d66dd305bcd51d7dd508c163a8c8fe148454e059"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d531076bdfb65af593326ffd567e6ab3da145020dafb9187a1d131064a55f97c"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33ce258e4e6e6038f2b9e8b8a631d17d017567db43483314993b3ca345dcbbb"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f9cd7f5635b719939019be9bda47ecb56e165e51dd26c9a217a433e3d0d59a9"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cd4a032bb65cc132cae1fe3e52877daecc2097965cd3914e44fbd12b00dae7c5"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f2718430098bcdf60402136c845e4126a189959d103900ebabb6774a5d9fdb"}, + {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0037a92cf0c580ed14e10953cdd26528e8796307bb8bb312dc65f71547df04d"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b95a0972fac2b1ff3c94629fc9081b16371dad870959f1408cc33b2f78ad347a"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a62e437d687cc148381bdd5f51e3e81f5b20a735c55f690c5be94e05da2b0d5c"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b367a73a414bbb08507da102dc2cde0fa7afe57d09b3240ce82a16d608a7679c"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ecce4b2360aa3f008da3327d652e74a0e743908eac306198b47e1c58b03dd2b"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4435b8d83f0c9561a2a9585b1de78f1abb17cb0cef5f39bf6a4b47d19bafe3"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:616221a6d473c5b9aa83fa8982745441f6a4a62a66436be9445c65f241b86c94"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7e6382ce89a92bc1d0c0c5edd51e931432202b9080dc921d8d003e616402efd1"}, + {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff58f379345603d940e461eae474b6bbb6dab66ed9a851ecd3cb3709bf4dcf6a"}, + {file = "pydantic_core-2.18.3.tar.gz", hash = "sha256:432e999088d85c8f36b9a3f769a8e2b57aabd817bbb729a90d1fe7f18f6f1f39"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydub" @@ -1471,6 +2384,37 @@ files = [ {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, ] +[[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 = "pyht" +version = "0.0.28" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pyht-0.0.28-py3-none-any.whl", hash = "sha256:ad8801acaa906eff5d6b39ce5ca76a08c154f705a2d0b2b6e841b219ef7875be"}, + {file = "pyht-0.0.28.tar.gz", hash = "sha256:00792e8c068fc905557525de9db0dbd7dcb651e15f05c6cc49490340b95a444a"}, +] + +[package.dependencies] +filelock = ">=3.12.4,<4.0.0" +grpcio = ">=1.58.0,<2.0.0" +protobuf = ">=4.24.3,<5.0.0" +requests = ">=2.31.0,<3.0.0" + [[package]] name = "pyjwt" version = "2.8.0" @@ -1493,16 +2437,21 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pyngrok" -version = "6.1.2" +version = "7.1.6" description = "A Python wrapper for ngrok." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "pyngrok-6.1.2.tar.gz", hash = "sha256:f5f4f67e79ed050ef2f9ce76b6ea8733b89502aa0b83002cea2ce6b994543622"}, + {file = "pyngrok-7.1.6-py3-none-any.whl", hash = "sha256:422ac7c339622fef51308f0c493a1f5a05d0f403eee5bdd183fb4021a6cb90d4"}, + {file = "pyngrok-7.1.6.tar.gz", hash = "sha256:05c0fca6340913658abddc623a0a53927aced93e27ffef801d24814bcb180eaa"}, ] [package.dependencies] -PyYAML = "*" +PyYAML = ">=5.1" + +[package.extras] +dev = ["coverage[toml]", "flake8", "flake8-pyproject", "pep8-naming", "psutil"] +docs = ["Sphinx", "mypy", "sphinx-autodoc-typehints (==1.25.2)", "sphinx-notfound-page", "sphinx-substitution-extensions", "types-PyYAML"] [[package]] name = "python-dotenv" @@ -1520,27 +2469,27 @@ cli = ["click (>=5.0)"] [[package]] name = "python-multipart" -version = "0.0.6" +version = "0.0.9" description = "A streaming multipart parser for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, ] [package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +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 = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -1555,6 +2504,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -1562,8 +2512,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1580,6 +2538,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1587,6 +2546,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1594,133 +2554,134 @@ files = [ [[package]] name = "redis" -version = "4.6.0" +version = "5.0.4" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, - {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, + {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, + {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" -version = "2023.12.25" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, - {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, - {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, - {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, - {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, - {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, - {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, - {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, - {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, - {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, - {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, - {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, - {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, - {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, - {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, - {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, - {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, - {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, - {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, - {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, - {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, - {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, - {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, - {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, - {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, - {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, - {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, - {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, - {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, - {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, - {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, - {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, + {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"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -1734,46 +2695,206 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "scipy" -version = "1.12.0" -description = "Fundamental algorithms for scientific computing in Python" +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.9" +python-versions = ">=3.7.0" files = [ - {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, - {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, - {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, - {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, - {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, - {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, - {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, - {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, - {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, - {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, - {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, - {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, - {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, - {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, - {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, - {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, - {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, - {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, -] - -[package.dependencies] -numpy = ">=1.22.4,<1.29.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "hypothesis", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + {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 = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "sentry-sdk" +version = "2.3.1" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.3.1-py2.py3-none-any.whl", hash = "sha256:c5aeb095ba226391d337dd42a6f9470d86c9fc236ecc71cfc7cd1942b45010c6"}, + {file = "sentry_sdk-2.3.1.tar.gz", hash = "sha256:139a71a19f5e9eb5d3623942491ce03cf8ebc14ea2e39ba3e6fe79560d8a5b1f"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +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-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +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 (>=5)"] + +[[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 = "six" @@ -1788,27 +2909,27 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] name = "sounddevice" -version = "0.4.6" +version = "0.4.7" description = "Play and Record Sound with Python" optional = false python-versions = ">=3.7" files = [ - {file = "sounddevice-0.4.6-py3-none-any.whl", hash = "sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20"}, - {file = "sounddevice-0.4.6-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8"}, - {file = "sounddevice-0.4.6-py3-none-win32.whl", hash = "sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b"}, - {file = "sounddevice-0.4.6-py3-none-win_amd64.whl", hash = "sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c"}, - {file = "sounddevice-0.4.6.tar.gz", hash = "sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9"}, + {file = "sounddevice-0.4.7-py3-none-any.whl", hash = "sha256:1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7"}, + {file = "sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a"}, + {file = "sounddevice-0.4.7-py3-none-win32.whl", hash = "sha256:1ec1df094c468a210113aa22c4f390d5b4d9c7a73e41a6cb6ecfec83db59b380"}, + {file = "sounddevice-0.4.7-py3-none-win_amd64.whl", hash = "sha256:0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548"}, + {file = "sounddevice-0.4.7.tar.gz", hash = "sha256:69b386818d50a2d518607d4b973442e8d524760c7cd6c8b8be03d8c98fc4bce7"}, ] [package.dependencies] @@ -1817,80 +2938,62 @@ CFFI = ">=1.0" [package.extras] numpy = ["NumPy"] -[[package]] -name = "speechrecognition" -version = "3.10.1" -description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -optional = false -python-versions = ">=3.8" -files = [ - {file = "SpeechRecognition-3.10.1-py2.py3-none-any.whl", hash = "sha256:69898b2b0bbd5bc65647c5ef833fe318ad74f02e8a6af5c9fd671933083660bc"}, - {file = "SpeechRecognition-3.10.1.tar.gz", hash = "sha256:718731886b7836e20a06b9a2c6cace12a9e130971bb6af1b1dd130b22bad9f82"}, -] - -[package.dependencies] -requests = ">=2.26.0" -typing-extensions = "*" - -[package.extras] -whisper-api = ["openai"] - [[package]] name = "sqlalchemy" -version = "2.0.25" +version = "2.0.30" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win32.whl", hash = "sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669"}, - {file = "SQLAlchemy-2.0.25-cp310-cp310-win_amd64.whl", hash = "sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win32.whl", hash = "sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c"}, - {file = "SQLAlchemy-2.0.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win32.whl", hash = "sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2"}, - {file = "SQLAlchemy-2.0.25-cp312-cp312-win_amd64.whl", hash = "sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win32.whl", hash = "sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4"}, - {file = "SQLAlchemy-2.0.25-cp37-cp37m-win_amd64.whl", hash = "sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win32.whl", hash = "sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e"}, - {file = "SQLAlchemy-2.0.25-cp38-cp38-win_amd64.whl", hash = "sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win32.whl", hash = "sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24"}, - {file = "SQLAlchemy-2.0.25-cp39-cp39-win_amd64.whl", hash = "sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7"}, - {file = "SQLAlchemy-2.0.25-py3-none-any.whl", hash = "sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3"}, - {file = "SQLAlchemy-2.0.25.tar.gz", hash = "sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] @@ -1922,174 +3025,235 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + [[package]] name = "starlette" -version = "0.27.0" +version = "0.37.2" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [package.dependencies] anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "tenacity" -version = "8.2.3" +version = "8.3.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, + {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.15.1" +version = "0.19.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "tokenizers-0.15.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:32c9491dd1bcb33172c26b454dbd607276af959b9e78fa766e2694cafab3103c"}, - {file = "tokenizers-0.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29a1b784b870a097e7768f8c20c2dd851e2c75dad3efdae69a79d3e7f1d614d5"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0049fbe648af04148b08cb211994ce8365ee628ce49724b56aaefd09a3007a78"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e84b3c235219e75e24de6b71e6073cd2c8d740b14d88e4c6d131b90134e3a338"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8cc575769ea11d074308c6d71cb10b036cdaec941562c07fc7431d956c502f0e"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bf28f299c4158e6d0b5eaebddfd500c4973d947ffeaca8bcbe2e8c137dff0b"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:506555f98361db9c74e1323a862d77dcd7d64c2058829a368bf4159d986e339f"}, - {file = "tokenizers-0.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7061b0a28ade15906f5b2ec8c48d3bdd6e24eca6b427979af34954fbe31d5cef"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ed5e35507b7a0e2aac3285c4f5e37d4ec5cfc0e5825b862b68a0aaf2757af52"}, - {file = "tokenizers-0.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1c9df9247df0de6509dd751b1c086e5f124b220133b5c883bb691cb6fb3d786f"}, - {file = "tokenizers-0.15.1-cp310-none-win32.whl", hash = "sha256:dd999af1b4848bef1b11d289f04edaf189c269d5e6afa7a95fa1058644c3f021"}, - {file = "tokenizers-0.15.1-cp310-none-win_amd64.whl", hash = "sha256:39d06a57f7c06940d602fad98702cf7024c4eee7f6b9fe76b9f2197d5a4cc7e2"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8ad034eb48bf728af06915e9294871f72fcc5254911eddec81d6df8dba1ce055"}, - {file = "tokenizers-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea9ede7c42f8fa90f31bfc40376fd91a7d83a4aa6ad38e6076de961d48585b26"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b85d6fe1a20d903877aa0ef32ef6b96e81e0e48b71c206d6046ce16094de6970"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a7d44f656320137c7d643b9c7dcc1814763385de737fb98fd2643880910f597"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd244bd0793cdacf27ee65ec3db88c21f5815460e8872bbeb32b040469d6774e"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3f4a36e371b3cb1123adac8aeeeeab207ad32f15ed686d9d71686a093bb140"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2921a53966afb29444da98d56a6ccbef23feb3b0c0f294b4e502370a0a64f25"}, - {file = "tokenizers-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f49068cf51f49c231067f1a8c9fc075ff960573f6b2a956e8e1b0154fb638ea5"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0ab1a22f20eaaab832ab3b00a0709ca44a0eb04721e580277579411b622c741c"}, - {file = "tokenizers-0.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:671268f24b607c4adc6fa2b5b580fd4211b9f84b16bd7f46d62f8e5be0aa7ba4"}, - {file = "tokenizers-0.15.1-cp311-none-win32.whl", hash = "sha256:a4f03e33d2bf7df39c8894032aba599bf90f6f6378e683a19d28871f09bb07fc"}, - {file = "tokenizers-0.15.1-cp311-none-win_amd64.whl", hash = "sha256:30f689537bcc7576d8bd4daeeaa2cb8f36446ba2f13f421b173e88f2d8289c4e"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f3a379dd0898a82ea3125e8f9c481373f73bffce6430d4315f0b6cd5547e409"}, - {file = "tokenizers-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d870ae58bba347d38ac3fc8b1f662f51e9c95272d776dd89f30035c83ee0a4f"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6d28e0143ec2e253a8a39e94bf1d24776dbe73804fa748675dbffff4a5cd6d8"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61ae9ac9f44e2da128ee35db69489883b522f7abe033733fa54eb2de30dac23d"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8e322a47e29128300b3f7749a03c0ec2bce0a3dc8539ebff738d3f59e233542"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:760334f475443bc13907b1a8e1cb0aeaf88aae489062546f9704dce6c498bfe2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b173753d4aca1e7d0d4cb52b5e3ffecfb0ca014e070e40391b6bb4c1d6af3f2"}, - {file = "tokenizers-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82c1f13d457c8f0ab17e32e787d03470067fe8a3b4d012e7cc57cb3264529f4a"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:425b46ceff4505f20191df54b50ac818055d9d55023d58ae32a5d895b6f15bb0"}, - {file = "tokenizers-0.15.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:681ac6ba3b4fdaf868ead8971221a061f580961c386e9732ea54d46c7b72f286"}, - {file = "tokenizers-0.15.1-cp312-none-win32.whl", hash = "sha256:f2272656063ccfba2044df2115095223960d80525d208e7a32f6c01c351a6f4a"}, - {file = "tokenizers-0.15.1-cp312-none-win_amd64.whl", hash = "sha256:9abe103203b1c6a2435d248d5ff4cceebcf46771bfbc4957a98a74da6ed37674"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2ce9ed5c8ef26b026a66110e3c7b73d93ec2d26a0b1d0ea55ddce61c0e5f446f"}, - {file = "tokenizers-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89b24d366137986c3647baac29ef902d2d5445003d11c30df52f1bd304689aeb"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0faebedd01b413ab777ca0ee85914ed8b031ea5762ab0ea60b707ce8b9be6842"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdbd9dfcdad4f3b95d801f768e143165165055c18e44ca79a8a26de889cd8e85"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:97194324c12565b07e9993ca9aa813b939541185682e859fb45bb8d7d99b3193"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:485e43e2cc159580e0d83fc919ec3a45ae279097f634b1ffe371869ffda5802c"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:191d084d60e3589d6420caeb3f9966168269315f8ec7fbc3883122dc9d99759d"}, - {file = "tokenizers-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01c28cc8d7220634a75b14c53f4fc9d1b485f99a5a29306a999c115921de2897"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:325212027745d3f8d5d5006bb9e5409d674eb80a184f19873f4f83494e1fdd26"}, - {file = "tokenizers-0.15.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3c5573603c36ce12dbe318bcfb490a94cad2d250f34deb2f06cb6937957bbb71"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:1441161adb6d71a15a630d5c1d8659d5ebe41b6b209586fbeea64738e58fcbb2"}, - {file = "tokenizers-0.15.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:382a8d0c31afcfb86571afbfefa37186df90865ce3f5b731842dab4460e53a38"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e76959783e3f4ec73b3f3d24d4eec5aa9225f0bee565c48e77f806ed1e048f12"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:401df223e5eb927c5961a0fc6b171818a2bba01fb36ef18c3e1b69b8cd80e591"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52606c233c759561a16e81b2290a7738c3affac7a0b1f0a16fe58dc22e04c7d"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72c658bbe5a05ed8bc2ac5ad782385bfd743ffa4bc87d9b5026341e709c6f44"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25f5643a2f005c42f0737a326c6c6bdfedfdc9a994b10a1923d9c3e792e4d6a6"}, - {file = "tokenizers-0.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c5b6f633999d6b42466bbfe21be2e26ad1760b6f106967a591a41d8cbca980e"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ceb5c9ad11a015150b545c1a11210966a45b8c3d68a942e57cf8938c578a77ca"}, - {file = "tokenizers-0.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bedd4ce0c4872db193444c395b11c7697260ce86a635ab6d48102d76be07d324"}, - {file = "tokenizers-0.15.1-cp37-none-win32.whl", hash = "sha256:cd6caef6c14f5ed6d35f0ddb78eab8ca6306d0cd9870330bccff72ad014a6f42"}, - {file = "tokenizers-0.15.1-cp37-none-win_amd64.whl", hash = "sha256:d2bd7af78f58d75a55e5df61efae164ab9200c04b76025f9cc6eeb7aff3219c2"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:59b3ca6c02e0bd5704caee274978bd055de2dff2e2f39dadf536c21032dfd432"}, - {file = "tokenizers-0.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:48fe21b67c22583bed71933a025fd66b1f5cfae1baefa423c3d40379b5a6e74e"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3d190254c66a20fb1efbdf035e6333c5e1f1c73b1f7bfad88f9c31908ac2c2c4"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fef90c8f5abf17d48d6635f5fd92ad258acd1d0c2d920935c8bf261782cfe7c8"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fac011ef7da3357aa7eb19efeecf3d201ede9618f37ddedddc5eb809ea0963ca"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:574ec5b3e71d1feda6b0ecac0e0445875729b4899806efbe2b329909ec75cb50"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aca16c3c0637c051a59ea99c4253f16fbb43034fac849076a7e7913b2b9afd2d"}, - {file = "tokenizers-0.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6f238fc2bbfd3e12e8529980ec1624c7e5b69d4e959edb3d902f36974f725a"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:587e11a26835b73c31867a728f32ca8a93c9ded4a6cd746516e68b9d51418431"}, - {file = "tokenizers-0.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6456e7ad397352775e2efdf68a9ec5d6524bbc4543e926eef428d36de627aed4"}, - {file = "tokenizers-0.15.1-cp38-none-win32.whl", hash = "sha256:614f0da7dd73293214bd143e6221cafd3f7790d06b799f33a987e29d057ca658"}, - {file = "tokenizers-0.15.1-cp38-none-win_amd64.whl", hash = "sha256:a4fa0a20d9f69cc2bf1cfce41aa40588598e77ec1d6f56bf0eb99769969d1ede"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8d3f18a45e0cf03ce193d5900460dc2430eec4e14c786e5d79bddba7ea19034f"}, - {file = "tokenizers-0.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:38dbd6c38f88ad7d5dc5d70c764415d38fe3bcd99dc81638b572d093abc54170"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:777286b1f7e52de92aa4af49fe31046cfd32885d1bbaae918fab3bba52794c33"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58d4d550a3862a47dd249892d03a025e32286eb73cbd6bc887fb8fb64bc97165"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4eda68ce0344f35042ae89220b40a0007f721776b727806b5c95497b35714bb7"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd33d15f7a3a784c3b665cfe807b8de3c6779e060349bd5005bb4ae5bdcb437"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1aa370f978ac0bfb50374c3a40daa93fd56d47c0c70f0c79607fdac2ccbb42"}, - {file = "tokenizers-0.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:241482b940340fff26a2708cb9ba383a5bb8a2996d67a0ff2c4367bf4b86cc3a"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:68f30b05f46a4d9aba88489eadd021904afe90e10a7950e28370d6e71b9db021"}, - {file = "tokenizers-0.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5a3c5d8025529670462b881b7b2527aacb6257398c9ec8e170070432c3ae3a82"}, - {file = "tokenizers-0.15.1-cp39-none-win32.whl", hash = "sha256:74d1827830f60a9d78da8f6d49a1fbea5422ce0eea42e2617877d23380a7efbc"}, - {file = "tokenizers-0.15.1-cp39-none-win_amd64.whl", hash = "sha256:9ff499923e4d6876d6b6a63ea84a56805eb35e91dd89b933a7aee0c56a3838c6"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b3aa007a0f4408f62a8471bdaa3faccad644cbf2622639f2906b4f9b5339e8b8"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f3d4176fa93d8b2070db8f3c70dc21106ae6624fcaaa334be6bdd3a0251e729e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d0e463655ef8b2064df07bd4a445ed7f76f6da3b286b4590812587d42f80e89"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:089138fd0351b62215c462a501bd68b8df0e213edcf99ab9efd5dba7b4cb733e"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e563ac628f5175ed08e950430e2580e544b3e4b606a0995bb6b52b3a3165728"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:244dcc28c5fde221cb4373961b20da30097669005b122384d7f9f22752487a46"}, - {file = "tokenizers-0.15.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d82951d46052dddae1369e68ff799a0e6e29befa9a0b46e387ae710fd4daefb0"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7b14296bc9059849246ceb256ffbe97f8806a9b5d707e0095c22db312f4fc014"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0309357bb9b6c8d86cdf456053479d7112074b470651a997a058cd7ad1c4ea57"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083f06e9d8d01b70b67bcbcb7751b38b6005512cce95808be6bf34803534a7e7"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85288aea86ada579789447f0dcec108ebef8da4b450037eb4813d83e4da9371e"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:385e6fcb01e8de90c1d157ae2a5338b23368d0b1c4cc25088cdca90147e35d17"}, - {file = "tokenizers-0.15.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:60067edfcbf7d6cd448ac47af41ec6e84377efbef7be0c06f15a7c1dd069e044"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f7e37f89acfe237d4eaf93c3b69b0f01f407a7a5d0b5a8f06ba91943ea3cf10"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:6a63a15b523d42ebc1f4028e5a568013388c2aefa4053a263e511cb10aaa02f1"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2417d9e4958a6c2fbecc34c27269e74561c55d8823bf914b422e261a11fdd5fd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8550974bace6210e41ab04231e06408cf99ea4279e0862c02b8d47e7c2b2828"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:194ba82129b171bcd29235a969e5859a93e491e9b0f8b2581f500f200c85cfdd"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1bfd95eef8b01e6c0805dbccc8eaf41d8c5a84f0cce72c0ab149fe76aae0bce6"}, - {file = "tokenizers-0.15.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b87a15dd72f8216b03c151e3dace00c75c3fe7b0ee9643c25943f31e582f1a34"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6ac22f358a0c2a6c685be49136ce7ea7054108986ad444f567712cf274b34cd8"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e9d1f046a9b9d9a95faa103f07db5921d2c1c50f0329ebba4359350ee02b18b"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a0fd30a4b74485f6a7af89fffb5fb84d6d5f649b3e74f8d37f624cc9e9e97cf"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e45dc206b9447fa48795a1247c69a1732d890b53e2cc51ba42bc2fefa22407"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eaff56ef3e218017fa1d72007184401f04cb3a289990d2b6a0a76ce71c95f96"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b41dc107e4a4e9c95934e79b025228bbdda37d9b153d8b084160e88d5e48ad6f"}, - {file = "tokenizers-0.15.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1922b8582d0c33488764bcf32e80ef6054f515369e70092729c928aae2284bc2"}, - {file = "tokenizers-0.15.1.tar.gz", hash = "sha256:c0a331d6d5a3d6e97b7f99f562cee8d56797180797bc55f12070e495e717c980"}, -] - -[package.dependencies] -huggingface_hub = ">=0.16.4,<1.0" + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" [package.extras] dev = ["tokenizers[testing]"] -docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -2101,15 +3265,30 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + [[package]] name = "twilio" -version = "8.12.0" +version = "9.1.0" description = "Twilio API client and TwiML generator" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-8.12.0-py2.py3-none-any.whl", hash = "sha256:ccdf78b634dff13fd50b33bafd254a9dc2fb492c6b06839683e73f09ec110ec6"}, - {file = "twilio-8.12.0.tar.gz", hash = "sha256:28e3a743da18d5b298c9b9fb9e922404a60f8091441c5e0aa35bfefc46411370"}, + {file = "twilio-9.1.0-py2.py3-none-any.whl", hash = "sha256:eb4687a9f81dc3118e8981c5a46d9f8184baee135c79afed47c714c759c31bbc"}, + {file = "twilio-9.1.0.tar.gz", hash = "sha256:ab2eb19c779855bf02cdca8a7e02ebaa64feee47da7b591ac9088ec07a6962e2"}, ] [package.dependencies] @@ -2118,15 +3297,32 @@ aiohttp-retry = ">=2.8.3" PyJWT = ">=2.0.0,<3.0.0" requests = ">=2.0.0" +[[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.9.0" +version = "4.12.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, ] [[package]] @@ -2144,192 +3340,474 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] + [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.30.0" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, - {file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, + {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, + {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, ] [package.dependencies] click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + [[package]] name = "vocode" version = "0.1.111" description = "The all-in-one voice SDK" optional = false -python-versions = ">=3.8.1,<3.12" -files = [ - {file = "vocode-0.1.111-py3-none-any.whl", hash = "sha256:52b1c22188dbb1526eea490ad86fc11cc50df6442f4dd908939948b13fa66953"}, - {file = "vocode-0.1.111.tar.gz", hash = "sha256:9eb1e6d25c55f2fd7b0e1ee712de61a5f2c2cb8b70b058ce5d0eb7eb86bf8367"}, -] +python-versions = ">=3.9,<3.12" +files = [] +develop = true [package.dependencies] -aiohttp = ">=3.8.4,<4.0.0" -anthropic = ">=0.2.9,<0.3.0" -azure-cognitiveservices-speech = ">=1.27.0,<2.0.0" -fastapi = ">=0.100.1,<0.101.0" -janus = ">=1.0.0,<2.0.0" -jinja2 = ">=3.1.2,<4.0.0" -langchain = ">=0.0.198,<0.0.199" -miniaudio = ">=1.59,<2.0" -nltk = ">=3.8.1,<4.0.0" -openai = ">=0.27.8,<0.28.0" -opentelemetry-sdk = ">=1.17.0,<2.0.0" -pydub = ">=0.25.1,<0.26.0" -python-multipart = ">=0.0.6,<0.0.7" -requests = ">=2.28.2,<3.0.0" -scipy = ">=1.10.1,<2.0.0" -six = ">=1.16.0,<2.0.0" -sounddevice = ">=0.4.6,<0.5.0" -speechrecognition = ">=3.10.0,<4.0.0" -uvicorn = ">=0.21.1,<0.22.0" -websockets = ">=11.0.2,<12.0.0" +aiohttp = "^3.9.5" +anthropic = {version = "^0.28.0", optional = true} +azure-cognitiveservices-speech = {version = "^1.37.0", optional = true} +elevenlabs = {version = "^1.2.2", optional = true} +fastapi = "^0.111.0" +google-cloud-speech = {version = "^2.26.0", optional = true} +google-cloud-texttospeech = {version = "^2.16.3", optional = true} +janus = "^1.0.0" +jinja2 = "^3.1.4" +jsonschema = "^4.22.0" +langchain = {version = "^0.2.1", optional = true} +langchain-community = {version = "^0.2.1", optional = true} +loguru = "^0.7.2" +miniaudio = {version = "^1.59", optional = true} +nltk = {version = "^3.8.1", optional = true} +openai = {version = "^1.30.5", optional = true} +opentelemetry-sdk = "^1.24.0" +phonenumbers = "^8.13.37" +pvkoala = {version = "^2.0.1", optional = true} +pydantic = "^2.7.2" +pydub = {version = "^0.25.1", optional = true} +pyht = {version = "^0.0.28", optional = true} +redis = {version = "^5.0.4", optional = true} +requests = "^2.32.3" +sentry-sdk = {version = "^2.3.1", extras = ["fastapi"], optional = true} +sounddevice = "^0.4.7" +tiktoken = {version = "0.7.0", optional = true} +twilio = {version = "^9.1.0", optional = true} +uvicorn = "^0.30.0" +vonage = {version = "^3.14.0", optional = true} +websockets = "^12.0" [package.extras] -actions = ["nylas (>=5.14.0,<6.0.0)"] -agents = ["google-cloud-aiplatform (>=1.26.0,<2.0.0)"] -all = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-aiplatform (>=1.26.0,<2.0.0)", "google-cloud-speech (>=2.19.0,<3.0.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)", "nylas (>=5.14.0,<6.0.0)", "redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] -synthesizers = ["elevenlabs (>=0.2.6,<0.3.0)", "google-cloud-texttospeech (>=2.14.1,<3.0.0)", "gtts (>=2.3.1,<3.0.0)"] -telephony = ["redis (>=4.5.4,<5.0.0)", "twilio (>=8.1.0,<9.0.0)", "vonage (>=3.5.1,<4.0.0)"] -transcribers = ["google-cloud-speech (>=2.19.0,<3.0.0)"] +agents = ["anthropic (>=0.28.0,<0.29.0)", "openai (>=1.30.5,<2.0.0)", "tiktoken (==0.7.0)"] +all = ["anthropic (>=0.28.0,<0.29.0)", "azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=1.30.5,<2.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)", "redis (>=5.0.4,<6.0.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)", "tiktoken (==0.7.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)"] +synthesizers = ["azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)"] +telephony = ["redis (>=5.0.4,<6.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] + +[package.source] +type = "directory" +url = "../.." [[package]] name = "vonage" -version = "3.12.0" +version = "3.14.0" description = "Vonage Server SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "vonage-3.12.0-py2.py3-none-any.whl", hash = "sha256:5816909ae6ad76b18e4b33addcff6e8156bab0b8c6a6caf4803c60e7585cadf6"}, - {file = "vonage-3.12.0.tar.gz", hash = "sha256:3034df64e482927be4c9c289dee890b4e578b0057a0055af05a8ca471d143e9c"}, + {file = "vonage-3.14.0-py2.py3-none-any.whl", hash = "sha256:f8d28b8fcd157c0610d84b880779aadd3ab3768abfb18ef863e08669de163ccf"}, + {file = "vonage-3.14.0.tar.gz", hash = "sha256:ea001e9616abb19670c4250a1ac46288207030ebc9d9ecbcf5fcffef61fa5850"}, ] [package.dependencies] Deprecated = "*" -pydantic = ">=1.10,<2.dev0" +pydantic = ">=2.5.2" pytz = ">=2018.5" requests = ">=2.4.2" vonage-jwt = ">=1.1.0" [[package]] name = "vonage-jwt" -version = "1.1.0" -description = "A JWT Generator for Python. Creates JWTs for use with Vonage APIs." +version = "1.1.1" +description = "Tooling for working with JWTs for Vonage APIs in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vonage_jwt-1.1.0-py3-none-any.whl", hash = "sha256:f41d2fc51f80cebddff1d65ec2146527ee83ca95f3e8a8fe9cda2263a435e2ed"}, - {file = "vonage_jwt-1.1.0.tar.gz", hash = "sha256:ed6af2bf82dc7cffe42ad453295472b86e02852baaaa3f2b97cd49fcb4e9019d"}, + {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, + {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, ] [package.dependencies] pyjwt = {version = ">=1.6.4", extras = ["crypto"]} +vonage-utils = ">=1.1.2" + +[[package]] +name = "vonage-utils" +version = "1.1.2" +description = "Utils package containing objects for use with Vonage APIs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, + {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, +] + +[package.dependencies] +pydantic = ">=2.7.1" +typing-extensions = ">=4.9.0" + +[[package]] +name = "watchfiles" +version = "0.22.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" version = "1.16.0" @@ -2514,20 +3992,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.19.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.19.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, + {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, ] [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"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "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.9,<3.12" -content-hash = "1bed2edebca6168ceb42e5c8bdcb8196d30e29498ca7ea4515f7bcf53ceb926a" +content-hash = "34b3cef8d3c84f54cf50b30e588a545a89fffe91d46a33cb269f48c222176f4e" diff --git a/apps/telephony_app/pyproject.toml b/apps/telephony_app/pyproject.toml index df7b2c7abc..01f6fc1b69 100644 --- a/apps/telephony_app/pyproject.toml +++ b/apps/telephony_app/pyproject.toml @@ -7,12 +7,11 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.9,<3.12" -redis = "^4.5.4" -twilio = "^8.1.0" -vonage = "^3.5.1" -pyngrok = "^6.0.0" -python-dotenv = "^1.0.0" -vocode = "0.1.111" +pyngrok = "^7.1.6" +python-dotenv = "^1.0.1" +vocode = { path = "../..", extras = [ + "all", +], develop = true, python = ">=3.11,<3.12" } [build-system] diff --git a/apps/telephony_app/speller_agent.py b/apps/telephony_app/speller_agent.py index 19f755a94d..43ed0ce732 100644 --- a/apps/telephony_app/speller_agent.py +++ b/apps/telephony_app/speller_agent.py @@ -1,16 +1,18 @@ -import logging -from typing import Optional, Tuple import typing +from typing import Optional, Tuple + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.models.agent import AgentConfig, AgentType, ChatGPTAgentConfig -from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent -from vocode.streaming.agent.factory import AgentFactory class SpellerAgentConfig(AgentConfig, type="agent_speller"): """Configuration for SpellerAgent. Inherits from AgentConfig.""" + pass + class SpellerAgent(RespondAgent[SpellerAgentConfig]): """SpellerAgent class. Inherits from RespondAgent. @@ -47,18 +49,14 @@ async def respond( return "".join(c + " " for c in human_input), False - -class SpellerAgentFactory(AgentFactory): +class SpellerAgentFactory(AbstractAgentFactory): """Factory class for creating agents based on the provided agent configuration.""" - def create_agent( - self, agent_config: AgentConfig, logger: Optional[logging.Logger] = None - ) -> BaseAgent: + def create_agent(self, agent_config: AgentConfig) -> BaseAgent: """Creates an agent based on the provided agent configuration. Args: agent_config (AgentConfig): The configuration for the agent to be created. - logger (Optional[logging.Logger]): The logger to be used by the agent. Returns: BaseAgent: The created agent. diff --git a/playground/streaming/agent/chat.py b/playground/streaming/agent/chat.py index bba34122f1..659443c9a4 100644 --- a/playground/streaming/agent/chat.py +++ b/playground/streaming/agent/chat.py @@ -1,85 +1,109 @@ import asyncio +import random import typing + from dotenv import load_dotenv -from playground.streaming.tracing_utils import make_parser_and_maybe_trace from pydantic.v1 import BaseModel + +from vocode.streaming.action.abstract_factory import AbstractActionFactory from vocode.streaming.action.base_action import BaseAction -from vocode.streaming.action.factory import ActionFactory from vocode.streaming.action.worker import ActionsWorker from vocode.streaming.models.actions import ( ActionConfig, ActionInput, ActionOutput, - ActionType, + EndOfTurn, + PhraseBasedActionTrigger, + PhraseBasedActionTriggerConfig, + PhraseTrigger, ) from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.transcript import Transcript -from vocode.streaming.utils.state_manager import ConversationStateManager +from vocode.streaming.utils.state_manager import AbstractConversationStateManager from vocode.streaming.utils.worker import InterruptibleAgentResponseEvent load_dotenv() from vocode.streaming.agent import ChatGPTAgent from vocode.streaming.agent.base_agent import ( - BaseAgent, AgentResponseMessage, AgentResponseType, + BaseAgent, TranscriptionAgentInput, ) - -from vocode.streaming.transcriber.base_transcriber import Transcription +from vocode.streaming.models.transcriber import Transcription from vocode.streaming.utils import create_conversation_id +BACKCHANNELS = ["Got it", "Sure", "Okay", "I understand"] + class ShoutActionConfig(ActionConfig, type="shout"): # type: ignore num_exclamation_marks: int class ShoutActionParameters(BaseModel): - name: str + pass class ShoutActionResponse(BaseModel): success: bool -class ShoutAction( - BaseAction[ShoutActionConfig, ShoutActionParameters, ShoutActionResponse] -): +class ShoutAction(BaseAction[ShoutActionConfig, ShoutActionParameters, ShoutActionResponse]): description: str = "Shouts someone's name" parameters_type: typing.Type[ShoutActionParameters] = ShoutActionParameters response_type: typing.Type[ShoutActionResponse] = ShoutActionResponse async def run( - self, action_input: ActionInput[ShoutActionParameters] + self, + action_input: ActionInput[ShoutActionParameters], ) -> ActionOutput[ShoutActionResponse]: - print( - f"HI THERE {action_input.params.name}{self.action_config.num_exclamation_marks * '!'}" - ) + print(f"HI THERE {self.action_config.num_exclamation_marks * '!'}") return ActionOutput( action_type=self.action_config.type, response=ShoutActionResponse(success=True), ) -class ShoutActionFactory(ActionFactory): +class ShoutActionFactory(AbstractActionFactory): def create_action(self, action_config: ActionConfig) -> BaseAction: if isinstance(action_config, ShoutActionConfig): - return ShoutAction(action_config, should_respond=True) + return ShoutAction(action_config, should_respond="always") else: raise Exception("Invalid action type") -class DummyConversationManager(ConversationStateManager): - pass +class DummyConversationManager(AbstractConversationStateManager): + """For use with Agents operating in a non-call context.""" + + def __init__( + self, + using_input_streaming_synthesizer: bool = False, + ): + self._using_input_streaming_synthesizer = using_input_streaming_synthesizer + self._conversation_id = create_conversation_id() + + def using_input_streaming_synthesizer(self): + return self._using_input_streaming_synthesizer + def get_conversation_id(self): + return self._conversation_id -async def run_agent(agent: BaseAgent): + +async def run_agent( + agent: BaseAgent, interruption_probability: float, backchannel_probability: float +): ended = False conversation_id = create_conversation_id() async def receiver(): nonlocal ended + + assert agent.transcript is not None + + ignore_until_end_of_turn = False + while not ended: try: event = await agent.get_output_queue().get() @@ -93,13 +117,37 @@ async def receiver(): elif response.type == AgentResponseType.MESSAGE: agent_response = typing.cast(AgentResponseMessage, response) - agent.transcript.add_bot_message( - agent_response.message.text, conversation_id - ) - print( - "AI: " - + typing.cast(AgentResponseMessage, response).message.text - ) + if isinstance(agent_response.message, EndOfTurn): + ignore_until_end_of_turn = False + if random.random() < backchannel_probability: + backchannel = random.choice(BACKCHANNELS) + print("Human: " + f"[{backchannel}]") + agent.transcript.add_human_message( + backchannel, + conversation_id, + is_backchannel=True, + ) + elif isinstance(agent_response.message, BaseMessage): + if ignore_until_end_of_turn: + continue + + message_sent: str + is_final: bool + # TODO: consider allowing the user to interrupt the agent manually by responding fast + if random.random() < interruption_probability: + stop_idx = random.randint(0, len(agent_response.message.text)) + message_sent = agent_response.message.text[:stop_idx] + ignore_until_end_of_turn = True + is_final = False + else: + message_sent = agent_response.message.text + is_final = True + + agent.transcript.add_bot_message( + message_sent, conversation_id, is_final=is_final + ) + + print("AI: " + message_sent + ("-" if not is_final else "")) except asyncio.CancelledError: break @@ -116,6 +164,8 @@ async def sender(): message=message, confidence=1.0, is_final=True ), conversation_id=conversation_id, + twilio_sid="0", + vonage_uuid=None, ) ) ) @@ -129,9 +179,7 @@ async def sender(): output_queue=agent.get_input_queue(), action_factory=agent.action_factory, ) - actions_worker.attach_conversation_state_manager( - agent.conversation_state_manager - ) + actions_worker.attach_conversation_state_manager(agent.conversation_state_manager) actions_worker.start() await asyncio.gather(receiver(), sender()) @@ -144,32 +192,43 @@ async def agent_main(): # Replace with your agent! agent = ChatGPTAgent( ChatGPTAgentConfig( - prompt_preamble="have a conversation", + prompt_preamble="Have a conversation", + initial_message=BaseMessage(text="Is this Ajay?"), actions=[ - ShoutActionConfig(num_exclamation_marks=3), + ShoutActionConfig( + num_exclamation_marks=3, + action_trigger=PhraseBasedActionTrigger( + type="action_trigger_phrase_based", + config=PhraseBasedActionTriggerConfig( + phrase_triggers=[ + PhraseTrigger( + phrase="shout", + conditions=["phrase_condition_type_contains"], + ), + ], + ), + ), + ), ], ), action_factory=ShoutActionFactory(), ) - agent.attach_conversation_state_manager(DummyConversationManager(conversation=None)) + agent.attach_conversation_state_manager(DummyConversationManager()) agent.attach_transcript(transcript) if agent.agent_config.initial_message is not None: agent.output_queue.put_nowait( InterruptibleAgentResponseEvent( - payload=AgentResponseMessage( - message=agent.agent_config.initial_message - ), + payload=AgentResponseMessage(message=agent.agent_config.initial_message), agent_response_tracker=asyncio.Event(), ) ) agent.start() try: - await run_agent(agent) + await run_agent(agent, interruption_probability=0, backchannel_probability=0) except KeyboardInterrupt: agent.terminate() if __name__ == "__main__": - make_parser_and_maybe_trace() asyncio.run(agent_main()) diff --git a/playground/streaming/agent/restful_user_implemented_agent.py b/playground/streaming/agent/restful_user_implemented_agent.py index d5d36402a8..d8af0c9769 100644 --- a/playground/streaming/agent/restful_user_implemented_agent.py +++ b/playground/streaming/agent/restful_user_implemented_agent.py @@ -1,6 +1,7 @@ # type: ignore from typing import Generator, Optional, Tuple + from vocode.streaming.models.agent import RESTfulAgentOutput, RESTfulAgentText from vocode.streaming.user_implemented_agent.restful_agent import RESTfulAgent diff --git a/playground/streaming/agent/websocket_user_implemented_agent.py b/playground/streaming/agent/websocket_user_implemented_agent.py index 157a5aa0c8..56698bc445 100644 --- a/playground/streaming/agent/websocket_user_implemented_agent.py +++ b/playground/streaming/agent/websocket_user_implemented_agent.py @@ -1,4 +1,5 @@ import asyncio + from websockets.server import serve from vocode.streaming.models.websocket_agent import ( diff --git a/playground/streaming/benchmark.py b/playground/streaming/benchmark.py deleted file mode 100644 index 2717a2af37..0000000000 --- a/playground/streaming/benchmark.py +++ /dev/null @@ -1,569 +0,0 @@ -from collections import defaultdict -import os -import re -import json -import argparse -import asyncio -import logging -from tqdm import tqdm -import sounddevice as sd -from opentelemetry import trace, metrics -from opentelemetry.sdk.metrics import MeterProvider -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from opentelemetry.sdk.metrics.export import ( - InMemoryMetricReader, -) -from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter -from opentelemetry.sdk.resources import Resource -from vocode.streaming.agent.base_agent import TranscriptionAgentInput -from vocode.streaming.agent.vertex_ai_agent import ChatVertexAIAgent -from vocode.streaming.input_device.file_input_device import FileInputDevice -from vocode.streaming.agent import ChatGPTAgent, ChatAnthropicAgent -from vocode.streaming.input_device.microphone_input import MicrophoneInput -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.agent import ( - AzureOpenAIConfig, - ChatGPTAgentConfig, - ChatAnthropicAgentConfig, - ChatVertexAIAgentConfig, -) -from vocode.streaming.models.synthesizer import ( - AzureSynthesizerConfig, - BarkSynthesizerConfig, - CoquiSynthesizerConfig, - CoquiTTSSynthesizerConfig, - ElevenLabsSynthesizerConfig, - GTTSSynthesizerConfig, - GoogleSynthesizerConfig, - PlayHtSynthesizerConfig, - RimeSynthesizerConfig, - StreamElementsSynthesizerConfig, -) -from vocode.streaming.models.transcriber import ( - DeepgramTranscriberConfig, - AssemblyAITranscriberConfig, - PunctuationEndpointingConfig, -) -from vocode.streaming.models.transcript import Transcript -from vocode.streaming.output_device.file_output_device import FileOutputDevice -from vocode.streaming.synthesizer import ( - AzureSynthesizer, - BarkSynthesizer, - CoquiSynthesizer, - CoquiTTSSynthesizer, - ElevenLabsSynthesizer, - GTTSSynthesizer, - GoogleSynthesizer, - PlayHtSynthesizer, - RimeSynthesizer, - StreamElementsSynthesizer, -) -from vocode.streaming.transcriber import DeepgramTranscriber, AssemblyAITranscriber -from vocode.streaming.transcriber.base_transcriber import Transcription -from vocode.streaming.utils import get_chunk_size_per_second, remove_non_letters_digits -from vocode.streaming.utils.worker import InterruptibleEvent -from playground.streaming.tracing_utils import get_final_metrics - -logger = logging.getLogger(__name__) -logging.basicConfig() - -logger.setLevel(logging.DEBUG) -tracer = trace.get_tracer(__name__) -meter = metrics.get_meter(__name__) - - -# Create the parser -parser = argparse.ArgumentParser( - description="Benchmark Vocode's transcribers, agents, and synthesizers.\n" - + "Example usage: python playground/streaming/benchmark.py --all --all_num_cycles 3 --create_graphs" -) - -synthesizer_classes = { - "elevenlabs": (ElevenLabsSynthesizer, ElevenLabsSynthesizerConfig), - "azure": (AzureSynthesizer, AzureSynthesizerConfig), - "bark": (BarkSynthesizer, BarkSynthesizerConfig), - # "coqui": (CoquiSynthesizer, CoquiSynthesizerConfig), - # "coquitts": (CoquiTTSSynthesizer, CoquiTTSSynthesizerConfig), - "google": (GoogleSynthesizer, GoogleSynthesizerConfig), - "gtts": (GTTSSynthesizer, GTTSSynthesizerConfig), - "playht": (PlayHtSynthesizer, PlayHtSynthesizerConfig), - "rime": (RimeSynthesizer, RimeSynthesizerConfig), - "streamelements": (StreamElementsSynthesizer, StreamElementsSynthesizerConfig), -} - - -# These synthesizers stream output so they need to be traced within this file. -STREAMING_SYNTHESIZERS = ["azure", "elevenlabs"] - - -TRANSCRIBER_CHOICES = ["deepgram", "assemblyai"] -AGENT_CHOICES = [ - "gpt_gpt-3.5-turbo", - "gpt_gpt-4", - "azuregpt_gpt-35-turbo", - "anthropic_claude-v1", - "anthropic_claude-instant-v1", - "vertex_ai_chat-bison@001", -] -SYNTHESIZER_CHOICES = list(synthesizer_classes) - -parser.add_argument( - "--transcribers", - type=str, - nargs="*", - default=[], - choices=TRANSCRIBER_CHOICES + ["all"], - help="The list of transcribers to benchmark", -) -parser.add_argument( - "--agents", - type=str, - nargs="*", - default=[], - choices=AGENT_CHOICES + ["all"], - help="The list of agents to benchmark. Each agent should be of the form _.", -) -parser.add_argument( - "--synthesizers", - type=str, - nargs="*", - default=[], - choices=SYNTHESIZER_CHOICES + ["all"], - help="The list of synthesizers to benchmark", -) -parser.add_argument( - "--transcriber_audio", - type=str, - default="playground/streaming/test.wav", - help="Path to the audio file to transcribe", -) -parser.add_argument( - "--transcriber_use_mic", - action="store_true", - help="Use the microphone as the input device for the transcriber. " - + "Overrides --transcriber_audio. Be silent for ≈5 seconds to end transcription.", -) -parser.add_argument( - "--synthesizer_text", - type=str, - default="Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, “and what is the use of a book,” thought Alice “without pictures or conversations?”", - help="The text for synthesizers to synthesize", -) -parser.add_argument( - "--agent_prompt_preamble", - type=str, - default="The AI is having a very short and pleasant conversation about life", - help="The prompt preamble to use for the agent", -) -parser.add_argument( - "--agent_first_input", - type=str, - default="What is the meaning of life?", - help="The initial message sent to the agent (this is a transcribed sentence that the agent should respond to).", -) -parser.add_argument( - "--no_generate_responses", - action="store_true", - help="Disable streaming generated responses for agents", -) -parser.add_argument( - "--transcriber_num_cycles", - type=int, - default=1, - help="The number of transcriber runs to perform. Results are averaged over the runs.", -) -parser.add_argument( - "--synthesizer_num_cycles", - type=int, - default=1, - help="The number of synthesizer runs to perform. Results are averaged over the runs.", -) -parser.add_argument( - "--all_num_cycles", - type=int, - default=None, - help="The number of transcriber, agent, and synthesizer runs to perform. Overrides all other num_cycle arguments.", -) -parser.add_argument( - "--agent_num_cycles", - type=int, - default=1, - help="The number of agent runs to perform. Results are averaged over the runs.", -) -parser.add_argument( - "--all", - action="store_true", - help="Run all supported transcribers, agents, and synthesizers. Ignores other arguments.", -) -parser.add_argument( - "--create_graphs", - action="store_true", - help="Create graphs from the benchmark results. Requires matplotlib.", -) -parser.add_argument( - "--just_graphs", - action="store_true", - help="Skips computing statistics. Loads the last saved benchmark result " - + "JSON file and creates graphs from it.", -) -parser.add_argument( - "--results_file", - type=str, - default="benchmark_results.json", - help="The file to save the benchmark JSON results to", -) -parser.add_argument( - "--results_dir", - type=str, - default="benchmark_results", - help="The directory to save the text-to-speech output and JSON results to", -) -args = parser.parse_args() -if args.all: - print("--all is set! Running all supported transcribers, agents, and synthesizers.") - args.transcribers = TRANSCRIBER_CHOICES - args.agents = AGENT_CHOICES - args.synthesizers = SYNTHESIZER_CHOICES - -if "all" in args.transcribers: - args.transcribers = TRANSCRIBER_CHOICES -if "all" in args.agents: - args.agents = AGENT_CHOICES -if "all" in args.synthesizers: - args.synthesizers = SYNTHESIZER_CHOICES - -if args.all_num_cycles is not None: - args.transcriber_num_cycles = args.all_num_cycles - args.agent_num_cycles = args.all_num_cycles - args.synthesizer_num_cycles = args.all_num_cycles - -if args.create_graphs or args.just_graphs: - try: - import matplotlib.pyplot as plt - except ImportError: - print( - "ERROR: The --create_graphs flag requires matplotlib. Please " - + "install matplotlib and try again." - ) - exit(1) - -if args.just_graphs: - print( - "--just_graphs is set! Skipping computing statistics and instead " - + "generating graphs from the last saved benchmark result JSON file." - ) - -should_generate_responses = not args.no_generate_responses - -os.makedirs(args.results_dir, exist_ok=True) - - -def get_transcriber(transcriber_name, file_input): - if transcriber_name == "deepgram": - transcriber = DeepgramTranscriber( - DeepgramTranscriberConfig.from_input_device( - file_input, - endpointing_config=PunctuationEndpointingConfig(), - ) - ) - elif transcriber_name == "assemblyai": - transcriber = AssemblyAITranscriber( - AssemblyAITranscriberConfig.from_input_device( - file_input, - ) - ) - return transcriber - - -trace.set_tracer_provider(TracerProvider(resource=Resource.create({}))) -span_exporter = InMemorySpanExporter() -trace.get_tracer_provider().add_span_processor(SimpleSpanProcessor(span_exporter)) # type: ignore - -reader = InMemoryMetricReader() -provider = MeterProvider(metric_readers=[reader]) -metrics.set_meter_provider(provider) - - -async def run_agents(): - for agent_name in tqdm(args.agents, desc="Agents"): - company, model_name = agent_name.rsplit("_", 1) - length_meter = meter.create_counter( - remove_non_letters_digits( - f"agent.agent_chat_{company}-{model_name}.total_characters" - ), - ) - for _ in tqdm(range(args.agent_num_cycles), desc="Agent Cycles"): - if company == "gpt": - agent = ChatGPTAgent( - ChatGPTAgentConfig( - initial_message=None, - prompt_preamble=args.agent_prompt_preamble, - allow_agent_to_be_cut_off=False, - model_name=model_name, - generate_responses=should_generate_responses, - ) - ) - elif company == "azuregpt": - agent = ChatGPTAgent( - ChatGPTAgentConfig( - initial_message=None, - prompt_preamble=args.agent_prompt_preamble, - allow_agent_to_be_cut_off=False, - azure_params=AzureOpenAIConfig(engine=model_name), - generate_responses=should_generate_responses, - ) - ) - elif company == "anthropic": - agent = ChatAnthropicAgent( - ChatAnthropicAgentConfig( - initial_message=None, - allow_agent_to_be_cut_off=False, - model_name=model_name, - generate_responses=should_generate_responses, - ) - ) - elif company == "vertex_ai": - agent = ChatVertexAIAgent( - ChatVertexAIAgentConfig( - initial_message=None, - prompt_preamble=args.agent_prompt_preamble, - allow_agent_to_be_cut_off=False, - model_name=model_name, - generate_responses=False, - ) - ) - agent.attach_transcript(Transcript()) - agent_task = agent.start() - message = TranscriptionAgentInput( - transcription=Transcription( - message=args.agent_first_input, confidence=1.0, is_final=True - ), - conversation_id=0, - ) - agent.consume_nonblocking( - agent.interruptible_event_factory.create_interruptible_event(message) - ) - - while True: - try: - message = await asyncio.wait_for( - agent.output_queue.get(), timeout=15 - ) - length_meter.add(len(message.payload.message.text)) - logger.debug( - f"[Agent: {agent_name}] Response from API: {message.payload.message.text}" - ) - except asyncio.TimeoutError: - logger.debug( - f"[Agent: {agent_name}] Agent queue is empty, stopping..." - ) - break - - -async def run_synthesizers(): - def create_file_output_device(synthesizer_name, extra_info=""): - return FileOutputDevice( - os.path.join(args.results_dir, f"{synthesizer_name}{extra_info}.wav"), - ) - - for synthesizer_cycle_idx in tqdm( - range(args.synthesizer_num_cycles), desc="Synthesizer Cycles" - ): - for synthesizer_name in args.synthesizers: - file_output = create_file_output_device( - synthesizer_name, f"-run={synthesizer_cycle_idx}" - ) - synthesizer_class, synthesizer_config_class = synthesizer_classes[ - synthesizer_name - ] - extra_config = {} - if synthesizer_name == "playht": - extra_config["voice_id"] = "larry" - elif synthesizer_name == "rime": - extra_config["speaker"] = "young_male_unmarked-1" - synthesizer = synthesizer_class( - synthesizer_config_class.from_output_device(file_output, **extra_config) - ) - - chunk_size = get_chunk_size_per_second( - synthesizer.get_synthesizer_config().audio_encoding, - synthesizer.get_synthesizer_config().sampling_rate, - ) - - current_synthesizer_is_streaming = ( - synthesizer_name in STREAMING_SYNTHESIZERS - ) - if current_synthesizer_is_streaming: - total_synthesis_span = tracer.start_span( - f"synthesizer.{synthesizer_name}.create_total" - ) - first_synthesis_span = tracer.start_span( - f"synthesizer.{synthesizer_name}.create_first" - ) - - try: - synthesis_result = await synthesizer.create_speech( - message=BaseMessage(text=args.synthesizer_text), - chunk_size=chunk_size, - ) - except asyncio.TimeoutError: - logger.error( - f"[Synthesizer: {synthesizer_name}] Timed out while synthesizing. Skipping {synthesizer_name}..." - ) - continue - except Exception as e: - logger.error( - f"[Synthesizer: {synthesizer_name}] Exception while synthesizing: {e}. Skipping {synthesizer_name}..." - ) - continue - chunk_generator = synthesis_result.chunk_generator - - with tqdm(desc=f"{synthesizer_name.title()} Synthesizing") as pbar: - first_chunk = True - while True: - pbar.update(1) - chunk_result = await chunk_generator.__anext__() - if current_synthesizer_is_streaming and first_chunk: - first_chunk = False - first_synthesis_span.end() - file_output.consume_nonblocking(chunk_result.chunk) - if chunk_result.is_last_chunk: - break - - if current_synthesizer_is_streaming: - total_synthesis_span.end() - - -async def run_transcribers(): - sample_rate = 44100 - chunk_size = 2048 - sleep_time = chunk_size / sample_rate - if args.transcriber_use_mic: - input_device_info = sd.query_devices(kind="input") - input_device = MicrophoneInput(input_device_info) - else: - input_device = FileInputDevice( - args.transcriber_audio, - chunk_size=chunk_size, - silent_duration=0.01, - skip_initial_load=True, - ) - - for transcriber_cycle_idx in tqdm( - range(args.transcriber_num_cycles), desc="Transcriber Cycles" - ): - for transcriber_name in tqdm(args.transcribers, desc="Transcribers"): - transcriber = get_transcriber(transcriber_name, input_device) - if not args.transcriber_use_mic: - input_device.load() - transcriber_task = transcriber.start() - - if args.transcriber_use_mic: - - async def record_audio_task(): - while True: - chunk = await input_device.get_audio() - transcriber.send_audio(chunk) - - send_audio = asyncio.create_task(record_audio_task()) - else: - - async def send_audio_task(): - while not input_device.is_done(): - chunk = await input_device.get_audio() - transcriber.send_audio(chunk) - await asyncio.sleep(sleep_time) - - send_audio = asyncio.create_task(send_audio_task()) - - # `get` from `transcriber.output_queue` until it's empty for 5 seconds - pbar = tqdm( - desc=f"{transcriber_name.title()} Transcribing", - total=input_device.duration if not args.transcriber_use_mic else None, - unit="chunk", - ) - while True: - try: - transcription = await asyncio.wait_for( - transcriber.output_queue.get(), timeout=5 - ) - # update the progress bar status - pbar.update(round(transcriber.audio_cursor - pbar.n, 2)) - except asyncio.TimeoutError: - logger.debug( - f"[Transcriber: {transcriber_name}] Transcriber queue is empty, stopping transcription..." - ) - send_audio.cancel() - break - if not args.transcriber_use_mic: - pbar.update(pbar.total - pbar.n) - transcriber.terminate() - - -def create_graphs(final_results): - logger.info("Creating graphs from benchmark results...") - results_split = [] - for name, value in final_results.items(): - first_name = name.split(".", 1) - second_name = first_name[1].rsplit(".", 1) - results_split.append((first_name[0], *second_name, value)) - - graph_data = defaultdict(lambda: defaultdict(list)) - for category, name, metric, value in results_split: - graph_data[f"{category} - {metric}"]["labels"].append(name) - graph_data[f"{category} - {metric}"]["values"].append(value) - - graph_dir = os.path.join(args.results_dir, "graphs") - os.makedirs(graph_dir, exist_ok=True) - - for graph_title, data in graph_data.items(): - plt.title(graph_title) - plt.bar(data["labels"], data["values"]) - plt.xticks(rotation=45) - plt.tight_layout() - plt.savefig(os.path.join(graph_dir, f"{graph_title}.png")) - plt.clf() - - -async def main(): - result_file_path = os.path.join(args.results_dir, args.results_file) - if not args.just_graphs: - if args.agents: - await run_agents() - if args.transcribers: - await run_transcribers() - if args.synthesizers: - await run_synthesizers() - - trace_results = span_exporter.get_finished_spans() - final_spans = defaultdict(list) - for span in trace_results: - duration_ns = span.end_time - span.start_time - duration_s = duration_ns / 1e9 - final_spans[span.name].append(duration_s) - - scope_metrics = reader.get_metrics_data().resource_metrics[0].scope_metrics - final_metrics = get_final_metrics(scope_metrics, final_spans=final_spans) - - final_spans = {k: sum(v) / len(v) for k, v in final_spans.items() if len(v) > 0} - if len(scope_metrics) > 0: - final_results = {**final_spans, **final_metrics} - else: - final_results = final_spans - print(json.dumps(final_results, indent=4)) - if args.results_file: - with open(result_file_path, "w") as f: - json.dump(final_results, f, indent=4) - else: - with open(result_file_path, "r") as f: - final_results = json.load(f) - - if args.create_graphs or args.just_graphs: - create_graphs(final_results) - - print("Benchmarking complete!") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/playground/streaming/synthesizer/synthesize.py b/playground/streaming/synthesizer/synthesize.py index 41adfbef8b..b27153c4b0 100644 --- a/playground/streaming/synthesizer/synthesize.py +++ b/playground/streaming/synthesizer/synthesize.py @@ -1,39 +1,26 @@ import time -import argparse -from typing import Optional -import aiohttp -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment + from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.synthesizer import ( - AzureSynthesizerConfig, - GoogleSynthesizerConfig, - PlayHtSynthesizerConfig, - ElevenLabsSynthesizerConfig, - RimeSynthesizerConfig, - PollySynthesizerConfig, -) +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.output_device.speaker_output import SpeakerOutput -from vocode.streaming.synthesizer import * +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer from vocode.streaming.utils import get_chunk_size_per_second -from playground.streaming.tracing_utils import make_parser_and_maybe_trace - if __name__ == "__main__": import asyncio + from dotenv import load_dotenv load_dotenv() - make_parser_and_maybe_trace() - seconds_per_chunk = 1 async def speak( synthesizer: BaseSynthesizer, output_device: BaseOutputDevice, message: BaseMessage, - bot_sentiment: Optional[BotSentiment] = None, ): message_sent = message.text cut_off = False @@ -42,19 +29,15 @@ async def speak( synthesizer.get_synthesizer_config().sampling_rate, ) # ClientSession needs to be created within the async task - synthesizer.aiohttp_session = aiohttp.ClientSession() - synthesis_result = await synthesizer.create_speech( + synthesis_result = await synthesizer.create_speech_uncached( message=message, - chunk_size=chunk_size, - bot_sentiment=bot_sentiment, + chunk_size=int(chunk_size), ) chunk_idx = 0 async for chunk_result in synthesis_result.chunk_generator: try: start_time = time.time() - speech_length_seconds = seconds_per_chunk * ( - len(chunk_result.chunk) / chunk_size - ) + speech_length_seconds = seconds_per_chunk * (len(chunk_result.chunk) / chunk_size) output_device.consume_nonblocking(chunk_result.chunk) end_time = time.time() await asyncio.sleep( @@ -63,19 +46,11 @@ async def speak( 0, ) ) - print( - "Sent chunk {} with size {}".format( - chunk_idx, len(chunk_result.chunk) - ) - ) + print("Sent chunk {} with size {}".format(chunk_idx, len(chunk_result.chunk))) chunk_idx += 1 except asyncio.CancelledError: seconds = chunk_idx * seconds_per_chunk - print( - "Interrupted, stopping text to speech after {} chunks".format( - chunk_idx - ) - ) + print("Interrupted, stopping text to speech after {} chunks".format(chunk_idx)) message_sent = f"{synthesis_result.get_message_up_to(seconds)}-" cut_off = True break @@ -83,6 +58,8 @@ async def speak( return message_sent, cut_off async def main(): + speaker_output = SpeakerOutput.from_default_device() + synthesizer = AzureSynthesizer(AzureSynthesizerConfig.from_output_device(speaker_output)) try: while True: message_sent, _ = await speak( @@ -93,13 +70,7 @@ async def main(): print("Message sent: ", message_sent) except KeyboardInterrupt: print("Interrupted, exiting") - await synthesizer.tear_down() - - speaker_output = SpeakerOutput.from_default_device() # replace with the synthesizer you want to test # Note: --trace will not work with AzureSynthesizer - synthesizer = AzureSynthesizer( - AzureSynthesizerConfig.from_output_device(speaker_output) - ) asyncio.run(main()) diff --git a/playground/streaming/tracing_utils.py b/playground/streaming/tracing_utils.py index a923437842..2dd1c86569 100644 --- a/playground/streaming/tracing_utils.py +++ b/playground/streaming/tracing_utils.py @@ -1,12 +1,21 @@ -import re +raise DeprecationWarning( + "OpenTelemetry support is currently deprecated, but planned to be re-enabled in the future." +) + import argparse +import re from collections import defaultdict from threading import RLock from typing import Any, Dict, List, Optional, Union + +from opentelemetry.sdk.metrics.export import ( + HistogramDataPoint, + Metric, + MetricReader, + MetricsData, + NumberDataPoint, +) from opentelemetry.sdk.trace.export import SpanExporter -from opentelemetry.sdk.metrics.export import MetricReader -from opentelemetry.sdk.metrics.export import Metric, MetricsData -from opentelemetry.sdk.metrics.export import NumberDataPoint, HistogramDataPoint NANOSECONDS_PER_SECOND = 1e9 @@ -43,21 +52,16 @@ def get_final_metrics(scope_metrics, final_spans=None): transcriber_str = metric_name.split(".")[1] final_metrics[metric_name] = ( raw_metric.sum - / formatted_metric_results[ - f"transcriber.{transcriber_str}.duration" - ].sum + / formatted_metric_results[f"transcriber.{transcriber_str}.duration"].sum ) elif re.match(r"agent.*\.total_characters", metric_name) and final_spans: agent_str = metric_name.split(".", 1)[1].rsplit(".", 1)[0] generate_total_key = f"agent.{agent_str}.generate_total" respond_total_key = f"agent.{agent_str}.respond_total" - final_metrics[f"agent.{agent_str}.characters_per_second"] = ( - raw_metric.value - / ( - sum(final_spans[generate_total_key]) - if generate_total_key in final_spans - else sum(final_spans[respond_total_key]) - ) + final_metrics[f"agent.{agent_str}.characters_per_second"] = raw_metric.value / ( + sum(final_spans[generate_total_key]) + if generate_total_key in final_spans + else sum(final_spans[respond_total_key]) ) else: try: @@ -104,15 +108,13 @@ def shutdown(self, timeout_millis: float = 30_000, **kwargs) -> None: def make_parser_and_maybe_trace(): parser = argparse.ArgumentParser() - parser.add_argument( - "--trace", action="store_true", help="Log latencies and other statistics" - ) + parser.add_argument("--trace", action="store_true", help="Log latencies and other statistics") args = parser.parse_args() if args.trace: from opentelemetry import trace + from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor - from opentelemetry.sdk.resources import Resource trace.set_tracer_provider(TracerProvider(resource=Resource.create({}))) span_exporter = PrintDurationSpanExporter() diff --git a/playground/streaming/transcriber/transcribe.py b/playground/streaming/transcriber/transcribe.py index 0ce3ea3ce7..111c272466 100644 --- a/playground/streaming/transcriber/transcribe.py +++ b/playground/streaming/transcriber/transcribe.py @@ -1,35 +1,18 @@ -import argparse - from vocode.streaming.input_device.microphone_input import MicrophoneInput -from vocode.streaming.models.transcriber import ( - DeepgramTranscriberConfig, - PunctuationEndpointingConfig, +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, Transcription +from vocode.streaming.transcriber.base_transcriber import BaseTranscriber +from vocode.streaming.transcriber.deepgram_transcriber import ( + DeepgramEndpointingConfig, + DeepgramTranscriber, ) -from vocode.streaming.transcriber.base_transcriber import BaseTranscriber, Transcription -from vocode.streaming.transcriber import * - if __name__ == "__main__": import asyncio + from dotenv import load_dotenv load_dotenv() - parser = argparse.ArgumentParser() - parser.add_argument( - "--trace", action="store_true", help="Log latencies and other statistics" - ) - args = parser.parse_args() - - if args.trace: - from opentelemetry import metrics - from opentelemetry.sdk.metrics import MeterProvider - from playground.streaming.tracing_utils import SpecificStatisticsReader - - reader = SpecificStatisticsReader() - provider = MeterProvider(metric_readers=[reader]) - metrics.set_meter_provider(provider) - async def print_output(transcriber: BaseTranscriber): while True: transcription: Transcription = await transcriber.output_queue.get() @@ -41,7 +24,7 @@ async def listen(): # replace with the transcriber you want to test transcriber = DeepgramTranscriber( DeepgramTranscriberConfig.from_input_device( - microphone_input, endpointing_config=PunctuationEndpointingConfig() + microphone_input, endpointing_config=DeepgramEndpointingConfig() ) ) transcriber.start() diff --git a/poetry.lock b/poetry.lock index 04b2b07965..c1b8234c67 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,112 +1,100 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiohttp-retry" @@ -124,17 +112,17 @@ aiohttp = "*" [[package]] name = "aioresponses" -version = "0.7.4" +version = "0.7.6" description = "Mock out requests made by ClientSession from aiohttp package" optional = false python-versions = "*" files = [ - {file = "aioresponses-0.7.4-py2.py3-none-any.whl", hash = "sha256:1160486b5ea96fcae6170cf2bdef029b9d3a283b7dbeabb3d7f1182769bfb6b7"}, - {file = "aioresponses-0.7.4.tar.gz", hash = "sha256:9b8c108b36354c04633bad0ea752b55d956a7602fe3e3234b939fc44af96f1d8"}, + {file = "aioresponses-0.7.6-py2.py3-none-any.whl", hash = "sha256:d2c26defbb9b440ea2685ec132e90700907fd10bcca3e85ec2f157219f0d26f7"}, + {file = "aioresponses-0.7.6.tar.gz", hash = "sha256:f795d9dbda2d61774840e7e32f5366f45752d1adc1b74c9362afd017296c7ee1"}, ] [package.dependencies] -aiohttp = ">=2.0.0,<4.0.0" +aiohttp = ">=3.3.0,<4.0.0" [[package]] name = "aiosignal" @@ -152,85 +140,60 @@ frozenlist = ">=1.1.0" [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} - [[package]] name = "anthropic" -version = "0.7.1" +version = "0.28.0" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.7.1-py3-none-any.whl", hash = "sha256:116d009f1a01fa46f3213e1f0b57b79a5ce3f3c0b2bf14441f96c8de6399a4b4"}, - {file = "anthropic-0.7.1.tar.gz", hash = "sha256:c5559be61dc74499e713669ee9efc0da6f190870f32c9606d7ad989dea5bde82"}, + {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, ] [package.dependencies] -anyio = ">=3.5.0,<4" +anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" +sniffio = "*" tokenizers = ">=0.13.0" -typing-extensions = ">=4.5,<5" +typing-extensions = ">=4.7,<5" + +[package.extras] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth (>=2,<3)"] [[package]] name = "anyio" -version = "3.7.1" +version = "4.4.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -optional = true -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - -[[package]] -name = "asttokens" -version = "2.2.1" -description = "Annotate AST trees with source code positions" -optional = true -python-versions = "*" -files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -test = ["astroid", "pytest"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] [[package]] name = "async-timeout" @@ -245,46 +208,36 @@ files = [ [[package]] name = "attrs" -version = "23.1.0" +version = "23.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, ] [package.extras] cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] +dev = ["attrs[tests]", "pre-commit"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "azure-cognitiveservices-speech" -version = "1.31.0" +version = "1.38.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:43818484c5b0e0f2f22bb47fef5fea32cec779c08eefd7a501d5ae240ce0bd3f"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4684046eb04f17484db768b1de058b0b5a65f7e40c016c0e187247c8c8c9b029"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:8d82aa933677b528fbe0605b9a0ab1f7aa5f09d4aadd48fb21473ba2dfeec614"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0d4a6952d24a32eecec70dd063ba401a1aa6ee72d70c2cc2343bd60741494b67"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win32.whl", hash = "sha256:3dfe69185f910208099c9e635e52de7e846928c6d0dda526b26ef3c1ed8ee62e"}, - {file = "azure_cognitiveservices_speech-1.31.0-py3-none-win_amd64.whl", hash = "sha256:39940875d651999e0b60caef20adc9798951a675eece4f5e4fb03bcb77ddef03"}, -] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = true -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:18dce915ab032711f687abb3297dd19176b9cbea562b322ee6fa7365ef4a5091"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9dd0800fbc4a8438c6dfd5747a658251914fe2d205a29e9b46158cadac6ab381"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:1c344e8a6faadb063cea451f0301e13b44d9724e1242337039bff601e81e6f86"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e002595a749471efeac3a54c80097946570b76c13049760b97a4b881d9d24af"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win32.whl", hash = "sha256:16a530e6c646eb49ea0bc05cb45a9d28b99e4b67613f6c3a6c54e26e6bf65241"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, ] [[package]] @@ -334,234 +287,210 @@ jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] -name = "boto3" -version = "1.28.30" -description = "The AWS SDK for Python" -optional = false -python-versions = ">= 3.7" +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = true +python-versions = ">=3.7" files = [ - {file = "boto3-1.28.30-py3-none-any.whl", hash = "sha256:e095ede98d3680e65966ab71f273b7d86938f5d853773ef96f4cb646277c2a4b"}, - {file = "boto3-1.28.30.tar.gz", hash = "sha256:2b509a959966a572f15db5768a18066ce1f53022ac53fca9421c620219fa3998"}, + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] -[package.dependencies] -botocore = ">=1.31.30,<1.32.0" -jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.6.0,<0.7.0" - -[package.extras] -crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] - [[package]] -name = "botocore" -version = "1.31.30" -description = "Low-level, data-driven core of boto 3." -optional = false -python-versions = ">= 3.7" +name = "cartesia" +version = "0.1.1" +description = "The official Python library for the Cartesia API." +optional = true +python-versions = ">=3.8.0" files = [ - {file = "botocore-1.31.30-py3-none-any.whl", hash = "sha256:269f20dcadd8dfd0c26d0e6fbceb84814ff6638ff3aafcc5324b9fb9949a7051"}, - {file = "botocore-1.31.30.tar.gz", hash = "sha256:3cf6a9d7621b897c9ff23cd02113826141b3dd3d7e90273b661efc4dc05f84e2"}, + {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, + {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, ] [package.dependencies] -jmespath = ">=0.7.1,<2.0.0" -python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +aiohttp = "*" +httpx = "*" +pytest-asyncio = "*" +requests = "*" +websockets = "*" [package.extras] -crt = ["awscrt (==0.16.26)"] - -[[package]] -name = "cachetools" -version = "5.3.1" -description = "Extensible memoizing collections and decorators" -optional = true -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, -] +all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] +dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] pycparser = "*" -[[package]] -name = "cfgv" -version = "3.4.0" -description = "Validate configuration and produce human readable error messages." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, - {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, -] - [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] @@ -589,77 +518,142 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "coverage" +version = "7.5.3" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, + {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, + {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, + {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, + {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, + {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, + {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, + {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, + {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, + {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, + {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, + {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, + {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, + {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, + {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, + {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, + {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, + {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, + {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, + {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, + {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, + {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, + {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, + {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, + {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, + {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, + {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, + {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + [[package]] name = "cryptography" -version = "41.0.3" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"}, - {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"}, - {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"}, - {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"}, - {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"}, - {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"}, - {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"}, - {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"}, - {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"}, - {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"}, -] - -[package.dependencies] -cffi = ">=1.12" + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.5.14" +version = "0.6.7" description = "Easily serialize dataclasses to and from JSON." -optional = false -python-versions = ">=3.7,<3.13" +optional = true +python-versions = "<4.0,>=3.7" files = [ - {file = "dataclasses_json-0.5.14-py3-none-any.whl", hash = "sha256:5ec6fed642adb1dbdb4182badb01e0861badfd8fda82e3b67f44b2d1e9d10d21"}, - {file = "dataclasses_json-0.5.14.tar.gz", hash = "sha256:d82896a94c992ffaf689cd1fafc180164e2abdd415b8f94a7f78586af5886236"}, + {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 = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = true -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "deprecated" version = "1.2.14" @@ -678,185 +672,300 @@ wrapt = ">=1.10,<2" dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] [[package]] -name = "distlib" -version = "0.3.7" -description = "Distribution utilities" +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] [[package]] -name = "distro" -version = "1.8.0" -description = "Distro - an OS platform information API" +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, - {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + [[package]] name = "elevenlabs" -version = "0.2.27" -description = "The official elevenlabs python package." -optional = true -python-versions = "*" +version = "1.3.0" +description = "" +optional = false +python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-0.2.27-py3-none-any.whl", hash = "sha256:c31ea892d5668002bc26d0bb46a6466b0b4e2fe5aaed75cbc1b7011f01d3fa29"}, - {file = "elevenlabs-0.2.27.tar.gz", hash = "sha256:1b17d3c997557e5aa654b296e3960c25ea183525cfdbd0ec53070b038ba5fd95"}, + {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, + {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, ] [package.dependencies] -ipython = ">=7.0" -pydantic = ">=2.0" +httpx = ">=0.21.2" +pydantic = ">=1.9.2" requests = ">=2.20" +typing_extensions = ">=4.0.0" websockets = ">=11.0" +[[package]] +name = "email-validator" +version = "2.1.1" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, + {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] -name = "executing" -version = "1.2.0" -description = "Get the currently executing AST node of a frame, and other information" -optional = true -python-versions = "*" +name = "fakeredis" +version = "2.23.2" +description = "Python implementation of redis API, can be used for testing purposes." +optional = false +python-versions = "<4.0,>=3.7" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "fakeredis-2.23.2-py3-none-any.whl", hash = "sha256:3721946b955930c065231befd24a9cdc68b339746e93848ef01a010d98e4eb4f"}, + {file = "fakeredis-2.23.2.tar.gz", hash = "sha256:d649c409abe46c63690b6c35d3c460e4ce64c69a52cea3f02daff2649378f878"}, ] +[package.dependencies] +redis = ">=4" +sortedcontainers = ">=2,<3" +typing_extensions = {version = ">=4.7,<5.0", markers = "python_version < \"3.11\""} + [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +bf = ["pyprobables (>=0.6,<0.7)"] +cf = ["pyprobables (>=0.6,<0.7)"] +json = ["jsonpath-ng (>=1.6,<2.0)"] +lua = ["lupa (>=2.1,<3.0)"] +probabilistic = ["pyprobables (>=0.6,<0.7)"] [[package]] name = "fastapi" -version = "0.100.1" +version = "0.111.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, +] + +[package.dependencies] +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" files = [ - {file = "fastapi-0.100.1-py3-none-any.whl", hash = "sha256:ec6dd52bfc4eff3063cfcd0713b43c87640fefb2687bbbe3d8a08d94049cdf32"}, - {file = "fastapi-0.100.1.tar.gz", hash = "sha256:522700d7a469e4a973d92321ab93312448fbe20fca9c8da97effc7e7bc56df23"}, + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, ] [package.dependencies] -pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<3.0.0" -starlette = ">=0.27.0,<0.28.0" -typing-extensions = ">=4.5.0" +typer = ">=0.12.3" [package.extras] -all = ["email-validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.12.2" +version = "3.15.1" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +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)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.6.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, + {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, ] +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +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 = "google-api-core" -version = "2.11.1" +version = "2.19.0" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.11.1.tar.gz", hash = "sha256:25d29e05a0058ed5f19c61c0a78b1b53adea4d9364b464d014fbda941f6d1c9a"}, - {file = "google_api_core-2.11.1-py3-none-any.whl", hash = "sha256:d92a5a92dc36dd4f4b9ee4e55528a90e432b059f93aee6ad857f9de8cc7ae94a"}, + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, ] [package.dependencies] @@ -870,6 +979,7 @@ grpcio-status = [ {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -880,21 +990,19 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.22.0" +version = "2.30.0" description = "Google Authentication Library" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, - {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -903,470 +1011,202 @@ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] -[[package]] -name = "google-cloud-aiplatform" -version = "1.30.1" -description = "Vertex AI API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-aiplatform-1.30.1.tar.gz", hash = "sha256:7552a6b2e66d7a9ff3c4b2bb95b0e9c182e7475dfb35d6347e9299f78779135a"}, - {file = "google_cloud_aiplatform-1.30.1-py2.py3-none-any.whl", hash = "sha256:ab1bbd4cf83cf583b7dea7e53421ad076f18b63e93cb22fb53c03176d5aa9258"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.32.0,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} -google-cloud-bigquery = ">=1.15.0,<4.0.0dev" -google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" -google-cloud-storage = ">=1.32.0,<3.0.0dev" -packaging = ">=14.3" -proto-plus = ">=1.22.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -shapely = "<2.0.0" - -[package.extras] -autologging = ["mlflow (>=1.27.0,<=2.1.1)"] -cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -datasets = ["pyarrow (>=3.0.0,<8.0dev)"] -endpoint = ["requests (>=2.28.1)"] -full = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "starlette (>=0.17.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)"] -lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] -metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] -pipelines = ["pyyaml (>=5.3,<7)"] -prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<0.76.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] -private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] -tensorboard = ["tensorflow (>=2.3.0,<3.0.0dev)"] -testing = ["docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<0.76.0)", "google-cloud-bigquery-storage", "google-vizier (==0.0.4)", "grpcio-testing", "ipython", "kfp", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3,<7)", "requests (>=2.28.1)", "scikit-learn", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] -vizier = ["google-vizier (==0.0.4)"] -xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] - -[[package]] -name = "google-cloud-bigquery" -version = "3.11.4" -description = "Google BigQuery API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-bigquery-3.11.4.tar.gz", hash = "sha256:697df117241a2283bcbb93b21e10badc14e51c9a90800d2a7e1a3e1c7d842974"}, - {file = "google_cloud_bigquery-3.11.4-py2.py3-none-any.whl", hash = "sha256:5fa7897743a0ed949ade25a0942fc9e7557d8fce307c6f8a76d1b604cf27f1b1"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.6.0,<3.0.0dev" -google-resumable-media = ">=0.6.0,<3.0dev" -grpcio = [ - {version = ">=1.49.1,<2.0dev", markers = "python_version >= \"3.11\""}, - {version = ">=1.47.0,<2.0dev", markers = "python_version < \"3.11\""}, -] -packaging = ">=20.0.0" -proto-plus = ">=1.15.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -python-dateutil = ">=2.7.2,<3.0dev" -requests = ">=2.21.0,<3.0.0dev" - -[package.extras] -all = ["Shapely (>=1.8.4,<2.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] -geopandas = ["Shapely (>=1.8.4,<2.0dev)", "geopandas (>=0.9.0,<1.0dev)"] -ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] -ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] -opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] -pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] -tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] - -[[package]] -name = "google-cloud-core" -version = "2.3.3" -description = "Google Cloud API client core library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, - {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, -] - -[package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)"] - -[[package]] -name = "google-cloud-resource-manager" -version = "1.10.3" -description = "Google Cloud Resource Manager API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-resource-manager-1.10.3.tar.gz", hash = "sha256:f80efcea36f10c5a81889afe93910926e3978b4b1ceeb82f563a2fc863072d14"}, - {file = "google_cloud_resource_manager-1.10.3-py2.py3-none-any.whl", hash = "sha256:1381a4b0f522248ebe0ebd1289d8822b99c54f4e1fe03924a6e723b2ed93dd7f"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" -proto-plus = [ - {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - [[package]] name = "google-cloud-speech" -version = "2.21.0" +version = "2.26.0" description = "Google Cloud Speech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-speech-2.21.0.tar.gz", hash = "sha256:661c39bbb6f2b216ba56ace3b087260e9778dd19ade9efa3700adee9258009ad"}, - {file = "google_cloud_speech-2.21.0-py2.py3-none-any.whl", hash = "sha256:88e51aa35d385d7b8325c461327c5f4a19ac8ab38d92ffb0d61c4e91494a0171"}, + {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, + {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -proto-plus = [ - {version = ">=1.22.2,<2.0.0dev", markers = "python_version >= \"3.11\""}, - {version = ">=1.22.0,<2.0.0dev", markers = "python_version < \"3.11\""}, -] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -[[package]] -name = "google-cloud-storage" -version = "2.10.0" -description = "Google Cloud Storage API client library" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-cloud-storage-2.10.0.tar.gz", hash = "sha256:934b31ead5f3994e5360f9ff5750982c5b6b11604dc072bc452c25965e076dc7"}, - {file = "google_cloud_storage-2.10.0-py2.py3-none-any.whl", hash = "sha256:9433cf28801671de1c80434238fb1e7e4a1ba3087470e90f70c928ea77c2b9d7"}, -] - -[package.dependencies] -google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" -google-cloud-core = ">=2.3.0,<3.0dev" -google-resumable-media = ">=2.3.2" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -protobuf = ["protobuf (<5.0.0dev)"] - [[package]] name = "google-cloud-texttospeech" -version = "2.16.1" +version = "2.16.3" description = "Google Cloud Texttospeech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.16.1.tar.gz", hash = "sha256:f0c81ff37a5ddc51689299dbd60f030ed85504163e86f04c9a375fd9fa50b304"}, - {file = "google_cloud_texttospeech-2.16.1-py2.py3-none-any.whl", hash = "sha256:58ed78a30ee17cce96ef11f4c793e6bf8f67d029860699b338138bce9502000f"}, + {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, + {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, ] [package.dependencies] -google-api-core = {version = ">=1.34.0,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<3.0.0dev" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" -[[package]] -name = "google-crc32c" -version = "1.5.0" -description = "A python wrapper of the C library 'Google CRC32C'" -optional = true -python-versions = ">=3.7" -files = [ - {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, - {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, - {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, - {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, - {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, - {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, - {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, - {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, - {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, - {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, - {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, - {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, - {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, - {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, - {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, - {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, - {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, - {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, - {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, - {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, - {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, -] - -[package.extras] -testing = ["pytest"] - -[[package]] -name = "google-resumable-media" -version = "2.5.0" -description = "Utilities for Google Media Downloads and Resumable Uploads" -optional = true -python-versions = ">= 3.7" -files = [ - {file = "google-resumable-media-2.5.0.tar.gz", hash = "sha256:218931e8e2b2a73a58eb354a288e03a0fd5fb1c4583261ac6e4c078666468c93"}, - {file = "google_resumable_media-2.5.0-py2.py3-none-any.whl", hash = "sha256:da1bd943e2e114a56d85d6848497ebf9be6a14d3db23e9fc57581e7c3e8170ec"}, -] - -[package.dependencies] -google-crc32c = ">=1.0,<2.0dev" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] -requests = ["requests (>=2.18.0,<3.0.0dev)"] - [[package]] name = "googleapis-common-protos" -version = "1.60.0" +version = "1.63.1" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.60.0.tar.gz", hash = "sha256:e73ebb404098db405ba95d1e1ae0aa91c3e15a71da031a2eeb6b2e23e7bc3708"}, - {file = "googleapis_common_protos-1.60.0-py2.py3-none-any.whl", hash = "sha256:69f9bbcc6acde92cab2db95ce30a70bd2b81d20b12eff3f1aabaffcbe8a93918"}, + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, ] [package.dependencies] -grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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 = "2.0.2" +version = "3.0.3" description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "grpc-google-iam-v1" -version = "0.12.6" -description = "IAM API client library" optional = true python-versions = ">=3.7" files = [ - {file = "grpc-google-iam-v1-0.12.6.tar.gz", hash = "sha256:2bc4b8fdf22115a65d751c9317329322602c39b7c86a289c9b72d228d960ef5f"}, - {file = "grpc_google_iam_v1-0.12.6-py2.py3-none-any.whl", hash = "sha256:5c10f3d8dc2d88678ab1a9b0cb5482735c5efee71e6c0cd59f872eef22913f5c"}, + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, ] -[package.dependencies] -googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} -grpcio = ">=1.44.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0dev" +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.57.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" -optional = true -python-versions = ">=3.7" +optional = false +python-versions = ">=3.8" files = [ - {file = "grpcio-1.57.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:092fa155b945015754bdf988be47793c377b52b88d546e45c6a9f9579ac7f7b6"}, - {file = "grpcio-1.57.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2f7349786da979a94690cc5c2b804cab4e8774a3cf59be40d037c4342c906649"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82640e57fb86ea1d71ea9ab54f7e942502cf98a429a200b2e743d8672171734f"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40b72effd4c789de94ce1be2b5f88d7b9b5f7379fe9645f198854112a6567d9a"}, - {file = "grpcio-1.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f708a6a17868ad8bf586598bee69abded4996b18adf26fd2d91191383b79019"}, - {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60fe15288a0a65d5c1cb5b4a62b1850d07336e3ba728257a810317be14f0c527"}, - {file = "grpcio-1.57.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6907b1cf8bb29b058081d2aad677b15757a44ef2d4d8d9130271d2ad5e33efca"}, - {file = "grpcio-1.57.0-cp310-cp310-win32.whl", hash = "sha256:57b183e8b252825c4dd29114d6c13559be95387aafc10a7be645462a0fc98bbb"}, - {file = "grpcio-1.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7b400807fa749a9eb286e2cd893e501b110b4d356a218426cb9c825a0474ca56"}, - {file = "grpcio-1.57.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6ebecfb7a31385393203eb04ed8b6a08f5002f53df3d59e5e795edb80999652"}, - {file = "grpcio-1.57.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:00258cbe3f5188629828363ae8ff78477ce976a6f63fb2bb5e90088396faa82e"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:23e7d8849a0e58b806253fd206ac105b328171e01b8f18c7d5922274958cc87e"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5371bcd861e679d63b8274f73ac281751d34bd54eccdbfcd6aa00e692a82cd7b"}, - {file = "grpcio-1.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aed90d93b731929e742967e236f842a4a2174dc5db077c8f9ad2c5996f89f63e"}, - {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe752639919aad9ffb0dee0d87f29a6467d1ef764f13c4644d212a9a853a078d"}, - {file = "grpcio-1.57.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fada6b07ec4f0befe05218181f4b85176f11d531911b64c715d1875c4736d73a"}, - {file = "grpcio-1.57.0-cp311-cp311-win32.whl", hash = "sha256:bb396952cfa7ad2f01061fbc7dc1ad91dd9d69243bcb8110cf4e36924785a0fe"}, - {file = "grpcio-1.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:e503cb45ed12b924b5b988ba9576dc9949b2f5283b8e33b21dcb6be74a7c58d0"}, - {file = "grpcio-1.57.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:fd173b4cf02b20f60860dc2ffe30115c18972d7d6d2d69df97ac38dee03be5bf"}, - {file = "grpcio-1.57.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:d7f8df114d6b4cf5a916b98389aeaf1e3132035420a88beea4e3d977e5f267a5"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:76c44efa4ede1f42a9d5b2fed1fe9377e73a109bef8675fb0728eb80b0b8e8f2"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4faea2cfdf762a664ab90589b66f416274887641ae17817de510b8178356bf73"}, - {file = "grpcio-1.57.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c60b83c43faeb6d0a9831f0351d7787a0753f5087cc6fa218d78fdf38e5acef0"}, - {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b363bbb5253e5f9c23d8a0a034dfdf1b7c9e7f12e602fc788c435171e96daccc"}, - {file = "grpcio-1.57.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f1fb0fd4a1e9b11ac21c30c169d169ef434c6e9344ee0ab27cfa6f605f6387b2"}, - {file = "grpcio-1.57.0-cp37-cp37m-win_amd64.whl", hash = "sha256:34950353539e7d93f61c6796a007c705d663f3be41166358e3d88c45760c7d98"}, - {file = "grpcio-1.57.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:871f9999e0211f9551f368612460442a5436d9444606184652117d6a688c9f51"}, - {file = "grpcio-1.57.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:a8a8e560e8dbbdf29288872e91efd22af71e88b0e5736b0daf7773c1fecd99f0"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2313b124e475aa9017a9844bdc5eafb2d5abdda9d456af16fc4535408c7d6da6"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4098b6b638d9e0ca839a81656a2fd4bc26c9486ea707e8b1437d6f9d61c3941"}, - {file = "grpcio-1.57.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e5b58e32ae14658085c16986d11e99abd002ddbf51c8daae8a0671fffb3467f"}, - {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0f80bf37f09e1caba6a8063e56e2b87fa335add314cf2b78ebf7cb45aa7e3d06"}, - {file = "grpcio-1.57.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5b7a4ce8f862fe32b2a10b57752cf3169f5fe2915acfe7e6a1e155db3da99e79"}, - {file = "grpcio-1.57.0-cp38-cp38-win32.whl", hash = "sha256:9338bacf172e942e62e5889b6364e56657fbf8ac68062e8b25c48843e7b202bb"}, - {file = "grpcio-1.57.0-cp38-cp38-win_amd64.whl", hash = "sha256:e1cb52fa2d67d7f7fab310b600f22ce1ff04d562d46e9e0ac3e3403c2bb4cc16"}, - {file = "grpcio-1.57.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fee387d2fab144e8a34e0e9c5ca0f45c9376b99de45628265cfa9886b1dbe62b"}, - {file = "grpcio-1.57.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b53333627283e7241fcc217323f225c37783b5f0472316edcaa4479a213abfa6"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f19ac6ac0a256cf77d3cc926ef0b4e64a9725cc612f97228cd5dc4bd9dbab03b"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3fdf04e402f12e1de8074458549337febb3b45f21076cc02ef4ff786aff687e"}, - {file = "grpcio-1.57.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5613a2fecc82f95d6c51d15b9a72705553aa0d7c932fad7aed7afb51dc982ee5"}, - {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b670c2faa92124b7397b42303e4d8eb64a4cd0b7a77e35a9e865a55d61c57ef9"}, - {file = "grpcio-1.57.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a635589201b18510ff988161b7b573f50c6a48fae9cb567657920ca82022b37"}, - {file = "grpcio-1.57.0-cp39-cp39-win32.whl", hash = "sha256:d78d8b86fcdfa1e4c21f8896614b6cc7ee01a2a758ec0c4382d662f2a62cf766"}, - {file = "grpcio-1.57.0-cp39-cp39-win_amd64.whl", hash = "sha256:20ec6fc4ad47d1b6e12deec5045ec3cd5402d9a1597f738263e98f490fe07056"}, - {file = "grpcio-1.57.0.tar.gz", hash = "sha256:4b089f7ad1eb00a104078bab8015b0ed0ebcb3b589e527ab009c53893fd4e613"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.57.0)"] + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpcio-status" -version = "1.57.0" +version = "1.62.2" description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.57.0.tar.gz", hash = "sha256:b098da99df1eebe58337f8f78e50df990273ccacc1226fddeb47c590e3df9e02"}, - {file = "grpcio_status-1.57.0-py3-none-any.whl", hash = "sha256:15d6af055914ebbc4ed17e55ebfb8e6bb17a45a57fea32e6af19978fb7844690"}, + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.57.0" +grpcio = ">=1.62.2" protobuf = ">=4.21.6" -[[package]] -name = "gtts" -version = "2.3.2" -description = "gTTS (Google Text-to-Speech), a Python library and CLI tool to interface with Google Translate text-to-speech API" -optional = true -python-versions = ">=3.7" -files = [ - {file = "gTTS-2.3.2-py3-none-any.whl", hash = "sha256:9132e409603f34d5023458e3e10ce2f5df55498d7a2ee781c9adbe616fbd4152"}, - {file = "gTTS-2.3.2.tar.gz", hash = "sha256:5314f7dedb4230889ff4773edd37e101408497e166982027b8d9582a4585eb4f"}, -] - -[package.dependencies] -click = ">=7.1,<8.2" -requests = ">=2.27,<3" - -[package.extras] -docs = ["sphinx", "sphinx-autobuild", "sphinx-click", "sphinx-mdinclude", "sphinx-rtd-theme"] -tests = ["pytest (>=7.1.3,<7.2.0)", "pytest-cov", "testfixtures"] - [[package]] name = "h11" version = "0.14.0" @@ -1380,39 +1220,88 @@ files = [ [[package]] name = "httpcore" -version = "0.17.3" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = "==1.*" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.27.0" description = "The next generation HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" @@ -1423,48 +1312,68 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] [[package]] -name = "identify" -version = "2.5.26" -description = "File identification library for Python" +name = "huggingface-hub" +version = "0.23.3" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false -python-versions = ">=3.8" +python-versions = ">=3.8.0" files = [ - {file = "identify-2.5.26-py2.py3-none-any.whl", hash = "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54"}, - {file = "identify-2.5.26.tar.gz", hash = "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f"}, + {file = "huggingface_hub-0.23.3-py3-none-any.whl", hash = "sha256:22222c41223f1b7c209ae5511d2d82907325a0e3cdbce5f66949d43c598ff3bc"}, + {file = "huggingface_hub-0.23.3.tar.gz", hash = "sha256:1a1118a0b3dea3bab6c325d71be16f5ffe441d32f3ac7c348d6875911b694b5b"}, ] +[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] -license = ["ukkonen"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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.3.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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["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"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "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" @@ -1478,43 +1387,18 @@ files = [ ] [[package]] -name = "ipython" -version = "8.12.2" -description = "IPython: Productive Interactive Computing" -optional = true -python-versions = ">=3.8" +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +[package.extras] +colors = ["colorama (>=0.4.6)"] [[package]] name = "janus" @@ -1531,68 +1415,108 @@ files = [ typing-extensions = ">=3.7.4.3" [[package]] -name = "jedi" -version = "0.19.0" -description = "An autocompletion tool for Python that can be used for text editors." -optional = true -python-versions = ">=3.6" +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" +MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] [[package]] -name = "jmespath" -version = "1.0.1" -description = "JSON Matching Expressions" +name = "jiter" +version = "0.4.2" +description = "Fast iterable JSON parser." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, + {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, + {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, + {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, + {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, + {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, + {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, + {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, + {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, + {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, + {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, + {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, ] [[package]] name = "joblib" -version = "1.3.2" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] name = "jsonpatch" version = "1.33" description = "Apply JSON-Patches (RFC 6902)" -optional = false +optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" files = [ {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, @@ -1604,34 +1528,67 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = true +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.8" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, ] +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "langchain" -version = "0.1.4" +version = "0.2.3" description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.8.1,<4.0" +optional = true +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.1.4-py3-none-any.whl", hash = "sha256:6befdd6221f5f326092e31a3c19efdc7ce3d7d1f2e2cab065141071451730ed7"}, - {file = "langchain-0.1.4.tar.gz", hash = "sha256:8767a9461e2b717ce9a35b1fa20659de89ea86ba9c2a4ff516e05d47ab2d195d"}, + {file = "langchain-0.2.3-py3-none-any.whl", hash = "sha256:5dc33cd9c8008693d328b7cb698df69073acecc89ad9c2a95f243b3314f8d834"}, + {file = "langchain-0.2.3.tar.gz", hash = "sha256:81962cc72cce6515f7bd71e01542727870789bf8b666c6913d85559080c1a201"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -dataclasses-json = ">=0.5.7,<0.7" -jsonpatch = ">=1.33,<2.0" -langchain-community = ">=0.0.14,<0.1" -langchain-core = ">=0.1.16,<0.2" -langsmith = ">=0.0.83,<0.1" +langchain-core = ">=0.2.0,<0.3.0" +langchain-text-splitters = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.17,<0.2.0" numpy = ">=1,<2" pydantic = ">=1,<3" PyYAML = ">=5.3" @@ -1639,183 +1596,227 @@ requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] -clarifai = ["clarifai (>=9.1.0)"] -cli = ["typer (>=0.9.0,<0.10.0)"] -cohere = ["cohere (>=4,<5)"] -docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] -embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] -javascript = ["esprima (>=4.0.1,<5.0.0)"] -llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] -qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] -text-helpers = ["chardet (>=5.1.0,<6.0.0)"] - [[package]] name = "langchain-community" -version = "0.0.16" +version = "0.2.4" description = "Community contributed LangChain integrations." -optional = false -python-versions = ">=3.8.1,<4.0" +optional = true +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.0.16-py3-none-any.whl", hash = "sha256:0f1dfc1a6205ce8d39931d3515974a208a9f69c16157c649f83490a7cc830b73"}, - {file = "langchain_community-0.0.16.tar.gz", hash = "sha256:c06512a93013a06fba7679cd5a1254ff8b927cddd2d1fbe0cc444bf7bbdf0b8c"}, + {file = "langchain_community-0.2.4-py3-none-any.whl", hash = "sha256:8582e9800f4837660dc297cccd2ee1ddc1d8c440d0fe8b64edb07620f0373b0e"}, + {file = "langchain_community-0.2.4.tar.gz", hash = "sha256:2bb6a1a36b8500a564d25d76469c02457b1a7c3afea6d4a609a47c06b993e3e4"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain-core = ">=0.1.16,<0.2" -langsmith = ">=0.0.83,<0.1" +langchain = ">=0.2.0,<0.3.0" +langchain-core = ">=0.2.0,<0.3.0" +langsmith = ">=0.1.0,<0.2.0" numpy = ">=1,<2" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)", "zhipuai (>=1.0.7,<2.0.0)"] - [[package]] name = "langchain-core" -version = "0.1.17" +version = "0.2.5" description = "Building applications with LLMs through composability" -optional = false -python-versions = ">=3.8.1,<4.0" +optional = true +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.17-py3-none-any.whl", hash = "sha256:026155cf97867bde410ab1834799ab4c5ba64c39380f2a4328bcf9c78623ca64"}, - {file = "langchain_core-0.1.17.tar.gz", hash = "sha256:59016e457cd6a1708d83a3a454acc97cf02c2a2c3af95626d13f83894fd4e777"}, + {file = "langchain_core-0.2.5-py3-none-any.whl", hash = "sha256:abe5138f22acff23a079ec538be5268bbf97cf023d51987a0dd474d2a16cae3e"}, + {file = "langchain_core-0.2.5.tar.gz", hash = "sha256:4a5c2f56b22396a63ef4790043660e393adbfa6832b978f023ca996a04b8e752"}, ] [package.dependencies] -anyio = ">=3,<5" jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.0.83,<0.1" +langsmith = ">=0.1.66,<0.2.0" packaging = ">=23.2,<24.0" pydantic = ">=1,<3" PyYAML = ">=5.3" -requests = ">=2,<3" tenacity = ">=8.1.0,<9.0.0" +[[package]] +name = "langchain-text-splitters" +version = "0.2.1" +description = "LangChain text splitting utilities" +optional = true +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, + {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, +] + +[package.dependencies] +langchain-core = ">=0.2.0,<0.3.0" + [package.extras] -extended-testing = ["jinja2 (>=3,<4)"] +extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] name = "langsmith" -version = "0.0.85" +version = "0.1.77" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." -optional = false -python-versions = ">=3.8.1,<4.0" +optional = true +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.0.85-py3-none-any.whl", hash = "sha256:9d0ccbcda7b69c83828060603a51bb4319e43b8dc807fbd90b6355f8ec709500"}, - {file = "langsmith-0.0.85.tar.gz", hash = "sha256:fefc631fc30d836b54d4e3f99961c41aea497633898b8f09e305b6c7216c2c54"}, + {file = "langsmith-0.1.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, + {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, ] [package.dependencies] +orjson = ">=3.9.14,<4.0.0" pydantic = ">=1,<3" requests = ">=2,<3" +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[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.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "marshmallow" -version = "3.20.1" +version = "3.21.3" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -optional = false +optional = true python-versions = ">=3.8" files = [ - {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, - {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, + {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 = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +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 = "matplotlib-inline" -version = "0.1.6" -description = "Inline Matplotlib backend for Jupyter" -optional = true -python-versions = ">=3.5" +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -[package.dependencies] -traitlets = "*" - [[package]] name = "miniaudio" version = "1.59" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" -optional = false +optional = true python-versions = "*" files = [ {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, @@ -1877,121 +1878,137 @@ cffi = ">=1.12.0" [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] name = "mypy" -version = "1.8.0" +version = "1.10.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, + {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, + {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, + {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, + {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, + {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, + {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, + {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, + {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, + {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, + {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, + {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, + {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, + {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, + {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, + {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, + {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, + {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, + {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, + {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, + {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, + {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, + {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, + {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, + {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, + {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, + {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, ] [package.dependencies] @@ -2041,139 +2058,172 @@ plot = ["matplotlib"] tgrep = ["pyparsing"] twitter = ["twython"] -[[package]] -name = "nodeenv" -version = "1.8.0" -description = "Node.js virtual environment builder" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" -files = [ - {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, - {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, -] - -[package.dependencies] -setuptools = "*" - [[package]] name = "numpy" -version = "1.24.4" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, - {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, - {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, - {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, - {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, - {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, - {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, - {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, - {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, - {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, - {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, - {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, - {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, - {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, - {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, - {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, - {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, - {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, - {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, -] - -[[package]] -name = "nylas" -version = "5.14.1" -description = "Python bindings for Nylas, the next-generation email platform." -optional = true -python-versions = "*" -files = [ - {file = "nylas-5.14.1.tar.gz", hash = "sha256:dfd83d957817a1e0be67c9c5ca677565cfe587d06120cbd08cb36bf89b3bb55f"}, +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[package.dependencies] -requests = {version = ">=2.4.2", extras = ["security"]} -six = ">=1.4.1" -urlobject = "*" -websocket-client = "0.59.0" - -[package.extras] -release = ["bumpversion (>=0.5.0)", "twine (>=3.4.2)"] -test = ["mock", "pytest", "pytest-cov", "pytest-mock", "pytest-timeout", "pytz", "responses (==0.10.5)", "twine"] - [[package]] name = "openai" -version = "0.27.8" -description = "Python client library for the OpenAI API" +version = "1.34.0" +description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-0.27.8-py3-none-any.whl", hash = "sha256:e0a7c2f7da26bdbe5354b03c6d4b82a2f34bd4458c7a17ae1a7092c3e397e03c"}, - {file = "openai-0.27.8.tar.gz", hash = "sha256:2483095c7db1eee274cebac79e315a986c4e55207bb4fa7b82d185b3a2ed9536"}, + {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, + {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, ] [package.dependencies] -aiohttp = "*" -requests = ">=2.20" -tqdm = "*" +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.7,<5" [package.extras] -datalib = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] -dev = ["black (>=21.6b0,<22.0)", "pytest (==6.*)", "pytest-asyncio", "pytest-mock"] -embeddings = ["matplotlib", "numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "plotly", "scikit-learn (>=1.0.2)", "scipy", "tenacity (>=8.0.1)"] -wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)", "wandb"] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.19.0" +version = "1.25.0" description = "OpenTelemetry Python API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.19.0-py3-none-any.whl", hash = "sha256:dcd2a0ad34b691964947e1d50f9e8c415c32827a1d87f0459a72deb9afdf5597"}, - {file = "opentelemetry_api-1.19.0.tar.gz", hash = "sha256:db374fb5bea00f3c7aa290f5d94cea50b659e6ea9343384c5f6c2bb5d5e8db65"}, + {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, + {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<7.0" +importlib-metadata = ">=6.0,<=7.1" [[package]] name = "opentelemetry-sdk" -version = "1.19.0" +version = "1.25.0" description = "OpenTelemetry Python SDK" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.19.0-py3-none-any.whl", hash = "sha256:bb67ad676b1bc671766a40d7fc9d9563854c186fa11f0dc8fa2284e004bd4263"}, - {file = "opentelemetry_sdk-1.19.0.tar.gz", hash = "sha256:765928956262c7a7766eaba27127b543fb40ef710499cad075f261f52163a87f"}, + {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, + {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, ] [package.dependencies] -opentelemetry-api = "1.19.0" -opentelemetry-semantic-conventions = "0.40b0" +opentelemetry-api = "1.25.0" +opentelemetry-semantic-conventions = "0.46b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.40b0" +version = "0.46b0" description = "OpenTelemetry Semantic Conventions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, + {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, +] + +[package.dependencies] +opentelemetry-api = "1.25.0" + +[[package]] +name = "orjson" +version = "3.10.4" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.40b0-py3-none-any.whl", hash = "sha256:7ebbaf86755a0948902e68637e3ae516c50222c30455e55af154ad3ffe283839"}, - {file = "opentelemetry_semantic_conventions-0.40b0.tar.gz", hash = "sha256:5a7a491873b15ab7c4907bbfd8737645cc87ca55a0a326c1755d1b928d8a0fae"}, + {file = "orjson-3.10.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:afca963f19ca60c7aedadea9979f769139127288dd58ccf3f7c5e8e6dc62cabf"}, + {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b112eff36ba7ccc7a9d6b87e17b9d6bde4312d05e3ddf66bf5662481dee846"}, + {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02b192eaba048b1039eca9a0cef67863bd5623042f5c441889a9957121d97e14"}, + {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:827c3d0e4fc44242c82bfdb1a773235b8c0575afee99a9fa9a8ce920c14e440f"}, + {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca8ec09724f10ec209244caeb1f9f428b6bb03f2eda9ed5e2c4dd7f2b7fabd44"}, + {file = "orjson-3.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8eaa5d531a8fde11993cbcb27e9acf7d9c457ba301adccb7fa3a021bfecab46c"}, + {file = "orjson-3.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e112aa7fc4ea67367ec5e86c39a6bb6c5719eddc8f999087b1759e765ddaf2d4"}, + {file = "orjson-3.10.4-cp310-none-win32.whl", hash = "sha256:1538844fb88446c42da3889f8c4ecce95a630b5a5ba18ecdfe5aea596f4dff21"}, + {file = "orjson-3.10.4-cp310-none-win_amd64.whl", hash = "sha256:de02811903a2e434127fba5389c3cc90f689542339a6e52e691ab7f693407b5a"}, + {file = "orjson-3.10.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:358afaec75de7237dfea08e6b1b25d226e33a1e3b6dc154fc99eb697f24a1ffa"}, + {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb4e292c3198ab3d93e5f877301d2746be4ca0ba2d9c513da5e10eb90e19ff52"}, + {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c39e57cf6323a39238490092985d5d198a7da4a3be013cc891a33fef13a536e"}, + {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f86df433fc01361ff9270ad27455ce1ad43cd05e46de7152ca6adb405a16b2f6"}, + {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c9966276a2c97e93e6cbe8286537f88b2a071827514f0d9d47a0aefa77db458"}, + {file = "orjson-3.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c499a14155a1f5a1e16e0cd31f6cf6f93965ac60a0822bc8340e7e2d3dac1108"}, + {file = "orjson-3.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3087023ce904a327c29487eb7e1f2c060070e8dbb9a3991b8e7952a9c6e62f38"}, + {file = "orjson-3.10.4-cp311-none-win32.whl", hash = "sha256:f965893244fe348b59e5ce560693e6dd03368d577ce26849b5d261ce31c70101"}, + {file = "orjson-3.10.4-cp311-none-win_amd64.whl", hash = "sha256:c212f06fad6aa6ce85d5665e91a83b866579f29441a47d3865c57329c0857357"}, + {file = "orjson-3.10.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d0965a8b0131959833ca8a65af60285995d57ced0de2fd8f16fc03235975d238"}, + {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27b64695d9f2aef3ae15a0522e370ec95c946aaea7f2c97a1582a62b3bdd9169"}, + {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:867d882ddee6a20be4c8b03ae3d2b0333894d53ad632d32bd9b8123649577171"}, + {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0667458f8a8ceb6dee5c08fec0b46195f92c474cbbec71dca2a6b7fd5b67b8d"}, + {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3eac9befc4eaec1d1ff3bba6210576be4945332dde194525601c5ddb5c060d3"}, + {file = "orjson-3.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4343245443552eae240a33047a6d1bcac7a754ad4b1c57318173c54d7efb9aea"}, + {file = "orjson-3.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30153e269eea43e98918d4d462a36a7065031d9246407dfff2579a4e457515c1"}, + {file = "orjson-3.10.4-cp312-none-win32.whl", hash = "sha256:1a7d092ee043abf3db19c2183115e80676495c9911843fdb3ebd48ca7b73079e"}, + {file = "orjson-3.10.4-cp312-none-win_amd64.whl", hash = "sha256:07a2adbeb8b9efe6d68fc557685954a1f19d9e33f5cc018ae1a89e96647c1b65"}, + {file = "orjson-3.10.4-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f5a746f3d908bce1a1e347b9ca89864047533bdfab5a450066a0315f6566527b"}, + {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:465b4a8a3e459f8d304c19071b4badaa9b267c59207a005a7dd9dfe13d3a423f"}, + {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35858d260728c434a3d91b60685ab32418318567e8902039837e1c2af2719e0b"}, + {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a5ba090d40c4460312dd69c232b38c2ff67a823185cfe667e841c9dd5c06841"}, + {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dde86755d064664e62e3612a166c28298aa8dfd35a991553faa58855ae739cc"}, + {file = "orjson-3.10.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:020a9e9001cfec85c156ef3b185ff758b62ef986cefdb8384c4579facd5ce126"}, + {file = "orjson-3.10.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3bf8e6e3388a2e83a86466c912387e0f0a765494c65caa7e865f99969b76ba0d"}, + {file = "orjson-3.10.4-cp38-none-win32.whl", hash = "sha256:c5a1cca6a4a3129db3da68a25dc0a459a62ae58e284e363b35ab304202d9ba9e"}, + {file = "orjson-3.10.4-cp38-none-win_amd64.whl", hash = "sha256:ecd97d98d7bee3e3d51d0b51c92c457f05db4993329eea7c69764f9820e27eb3"}, + {file = "orjson-3.10.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:71362daa330a2fc85553a1469185ac448547392a8f83d34e67779f8df3a52743"}, + {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d24b59d1fecb0fd080c177306118a143f7322335309640c55ed9580d2044e363"}, + {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e906670aea5a605b083ebb58d575c35e88cf880fa372f7cedaac3d51e98ff164"}, + {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ce32ed4bc4d632268e4978e595fe5ea07e026b751482b4a0feec48f66a90abc"}, + {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dcd34286246e0c5edd0e230d1da2daab2c1b465fcb6bac85b8d44057229d40a"}, + {file = "orjson-3.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c45d4b8c403e50beedb1d006a8916d9910ed56bceaf2035dc253618b44d0a161"}, + {file = "orjson-3.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aaed3253041b5002a4f5bfdf6f7b5cce657d974472b0699a469d439beba40381"}, + {file = "orjson-3.10.4-cp39-none-win32.whl", hash = "sha256:9a4f41b7dbf7896f8dbf559b9b43dcd99e31e0d49ac1b59d74f52ce51ab10eb9"}, + {file = "orjson-3.10.4-cp39-none-win_amd64.whl", hash = "sha256:6c4eb7d867ed91cb61e6514cb4f457aa01d7b0fd663089df60a69f3d38b69d4c"}, + {file = "orjson-3.10.4.tar.gz", hash = "sha256:c912ed25b787c73fe994a5decd81c3f3b256599b8a87d410d799d5d52013af2a"}, ] [[package]] @@ -2187,128 +2237,68 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "parso" -version = "0.8.3" -description = "A Python Parser" -optional = true -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, -] - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = true +name = "phonenumbers" +version = "8.13.38" +description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." +optional = false python-versions = "*" files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, + {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, + {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, ] [[package]] name = "platformdirs" -version = "3.10.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "pluggy" -version = "1.2.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pre-commit" -version = "3.3.3" -description = "A framework for managing and maintaining multi-language pre-commit hooks." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pre_commit-3.3.3-py2.py3-none-any.whl", hash = "sha256:10badb65d6a38caff29703362271d7dca483d01da88f9d7e05d0b97171c136cb"}, - {file = "pre_commit-3.3.3.tar.gz", hash = "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023"}, -] - -[package.dependencies] -cfgv = ">=2.0.0" -identify = ">=1.0.0" -nodeenv = ">=0.11.1" -pyyaml = ">=5.1" -virtualenv = ">=20.10.0" - -[[package]] -name = "prompt-toolkit" -version = "3.0.39" -description = "Library for building powerful interactive command lines in Python" -optional = true -python-versions = ">=3.7.0" -files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "proto-plus" -version = "1.22.3" +version = "1.23.0" description = "Beautiful, Pythonic protocol buffers." optional = true python-versions = ">=3.6" files = [ - {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, - {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, ] [package.dependencies] @@ -2319,101 +2309,85 @@ testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.24.1" +version = "4.25.3" description = "" -optional = true -python-versions = ">=3.7" -files = [ - {file = "protobuf-4.24.1-cp310-abi3-win32.whl", hash = "sha256:d414199ca605eeb498adc4d2ba82aedc0379dca4a7c364ff9bc9a179aa28e71b"}, - {file = "protobuf-4.24.1-cp310-abi3-win_amd64.whl", hash = "sha256:5906c5e79ff50fe38b2d49d37db5874e3c8010826f2362f79996d83128a8ed9b"}, - {file = "protobuf-4.24.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:970c701ee16788d74f3de20938520d7a0aebc7e4fff37096a48804c80d2908cf"}, - {file = "protobuf-4.24.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fc361148e902949dcb953bbcb148c99fe8f8854291ad01107e4120361849fd0e"}, - {file = "protobuf-4.24.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:5d32363d14aca6e5c9e9d5918ad8fb65b091b6df66740ae9de50ac3916055e43"}, - {file = "protobuf-4.24.1-cp37-cp37m-win32.whl", hash = "sha256:df015c47d6855b8efa0b9be706c70bf7f050a4d5ac6d37fb043fbd95157a0e25"}, - {file = "protobuf-4.24.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d4af4fd9e9418e819be30f8df2a16e72fbad546a7576ac7f3653be92a6966d30"}, - {file = "protobuf-4.24.1-cp38-cp38-win32.whl", hash = "sha256:302e8752c760549ed4c7a508abc86b25d46553c81989343782809e1a062a2ef9"}, - {file = "protobuf-4.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:06437f0d4bb0d5f29e3d392aba69600188d4be5ad1e0a3370e581a9bf75a3081"}, - {file = "protobuf-4.24.1-cp39-cp39-win32.whl", hash = "sha256:0b2b224e9541fe9f046dd7317d05f08769c332b7e4c54d93c7f0f372dedb0b1a"}, - {file = "protobuf-4.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd39b9094a4cc003a1f911b847ab379f89059f478c0b611ba1215053e295132e"}, - {file = "protobuf-4.24.1-py3-none-any.whl", hash = "sha256:55dd644adc27d2a624339332755fe077c7f26971045b469ebb9732a69ce1f2ca"}, - {file = "protobuf-4.24.1.tar.gz", hash = "sha256:44837a5ed9c9418ad5d502f89f28ba102e9cd172b6668bc813f21716f9273348"}, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = true -python-versions = "*" +optional = false +python-versions = ">=3.8" files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" +name = "pvkoala" +version = "2.0.1" +description = "Koala Noise Suppression Engine." optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pvkoala-2.0.1-py3-none-any.whl", hash = "sha256:8b153e076b4d14adccdcb4d800aa84e8d2f91e0640b959677582d3128cbcb249"}, + {file = "pvkoala-2.0.1.tar.gz", hash = "sha256:5e017c671fc1338d42dc20f9dee003d0144bbba1757b6f1fcd6272c5308da242"}, ] -[package.extras] -tests = ["pytest"] - [[package]] name = "pyasn1" -version = "0.5.0" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "2.6.0" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"}, - {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.16.1" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -2421,100 +2395,119 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.1" -description = "" +version = "2.18.4" +description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"}, - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"}, - {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"}, - {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"}, - {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"}, - {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"}, - {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"}, - {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"}, - {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"}, - {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"}, - {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"}, - {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"}, - {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"}, - {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"}, - {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.3.3" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.3-py3-none-any.whl", hash = "sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de"}, + {file = "pydantic_settings-2.3.3.tar.gz", hash = "sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -optional = false +optional = true python-versions = "*" files = [ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, @@ -2523,28 +2516,48 @@ files = [ [[package]] name = "pydub-stubs" -version = "0.25.1.0" +version = "0.25.1.1" description = "Stub-only package containing type information for pydub" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "pydub-stubs-0.25.1.0.tar.gz", hash = "sha256:57ff97da5faf221eda0f508e62a187766342490e07a450c63a76ca7e970da4da"}, - {file = "pydub_stubs-0.25.1.0-py3-none-any.whl", hash = "sha256:7ff185c40838dfdfb344222ad6d962e99682fa2787557d771023af8c24593ddc"}, + {file = "pydub_stubs-0.25.1.1-py3-none-any.whl", hash = "sha256:8cd0c0b73c8d89c8273e3a500b542a8cf150346a61f35191e9d59cc2f5ba6c1b"}, + {file = "pydub_stubs-0.25.1.1.tar.gz", hash = "sha256:4a7a783e0455d2b7dcc3034f3dc21aaee284413751aa9705357017931d257bd1"}, ] +[package.dependencies] +typing-extensions = ">=4.0.0" + [[package]] name = "pygments" -version = "2.16.1" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." -optional = true -python-versions = ">=3.7" +optional = false +python-versions = ">=3.8" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyht" +version = "0.0.28" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pyht-0.0.28-py3-none-any.whl", hash = "sha256:ad8801acaa906eff5d6b39ce5ca76a08c154f705a2d0b2b6e841b219ef7875be"}, + {file = "pyht-0.0.28.tar.gz", hash = "sha256:00792e8c068fc905557525de9db0dbd7dcb651e15f05c6cc49490340b95a444a"}, +] + +[package.dependencies] +filelock = ">=3.12.4,<4.0.0" +grpcio = ">=1.58.0,<2.0.0" +protobuf = ">=4.24.3,<5.0.0" +requests = ">=2.31.0,<3.0.0" [[package]] name = "pyjwt" @@ -2568,13 +2581,13 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.2.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, ] [package.dependencies] @@ -2582,70 +2595,110 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "0.21.1" +version = "0.23.7" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, - {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, ] [package.dependencies] -pytest = ">=7.0.0" +pytest = ">=7.0.0,<9" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] -name = "pytest-mock" -version = "3.12.0" -description = "Thin-wrapper around the mock package for easier use with pytest" +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] -pytest = ">=5.0" +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" [package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-env" +version = "1.1.3" +description = "pytest plugin that allows you to add environment variables." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_env-1.1.3-py3-none-any.whl", hash = "sha256:aada77e6d09fcfb04540a6e462c58533c37df35fa853da78707b17ec04d17dfc"}, + {file = "pytest_env-1.1.3.tar.gz", hash = "sha256:fcd7dc23bb71efd3d35632bde1bbe5ee8c8dc4489d6617fb010674880d96216b"}, +] + +[package.dependencies] +pytest = ">=7.4.3" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +test = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "pytest-mock (>=3.12)"] + +[[package]] +name = "pytest-httpx" +version = "0.30.0" +description = "Send responses to httpx." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest-httpx-0.30.0.tar.gz", hash = "sha256:755b8edca87c974dd4f3605c374fda11db84631de3d163b99c0df5807023a19a"}, + {file = "pytest_httpx-0.30.0-py3-none-any.whl", hash = "sha256:6d47849691faf11d2532565d0c8e0e02b9f4ee730da31687feae315581d7520c"}, +] + +[package.dependencies] +httpx = "==0.27.*" +pytest = ">=7,<9" + +[package.extras] +testing = ["pytest-asyncio (==0.23.*)", "pytest-cov (==4.*)"] [[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -six = ">=1.5" +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -2653,27 +2706,27 @@ cli = ["click (>=5.0)"] [[package]] name = "python-multipart" -version = "0.0.6" +version = "0.0.9" description = "A streaming multipart parser for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.6-py3-none-any.whl", hash = "sha256:ee698bab5ef148b0a760751c261902cd096e57e10558e11aca17646b74ee1c18"}, - {file = "python_multipart-0.0.6.tar.gz", hash = "sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132"}, + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, ] [package.extras] -dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +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 = "2023.3" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = true python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2727,128 +2780,134 @@ files = [ [[package]] name = "redis" -version = "4.6.0" +version = "5.0.6" description = "Python client for Redis database and key-value store" -optional = true +optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, - {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "regex" -version = "2023.8.8" +version = "2024.5.15" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, + {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"}, ] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -2861,6 +2920,132 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[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 = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + [[package]] name = "rsa" version = "4.9" @@ -2876,166 +3061,101 @@ files = [ pyasn1 = ">=0.1.3" [[package]] -name = "s3transfer" -version = "0.6.2" -description = "An Amazon S3 Transfer Manager" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "s3transfer-0.6.2-py3-none-any.whl", hash = "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084"}, - {file = "s3transfer-0.6.2.tar.gz", hash = "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861"}, -] - -[package.dependencies] -botocore = ">=1.12.36,<2.0a.0" - -[package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] - -[[package]] -name = "scipy" -version = "1.10.1" -description = "Fundamental algorithms for scientific computing in Python" +name = "sentry-sdk" +version = "2.5.1" +description = "Python client for Sentry (https://sentry.io)" optional = false -python-versions = "<3.12,>=3.8" +python-versions = ">=3.6" files = [ - {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, - {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, - {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, - {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, - {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, - {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, - {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, - {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, - {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, - {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, - {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, - {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, - {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, - {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, + {file = "sentry_sdk-2.5.1-py2.py3-none-any.whl", hash = "sha256:1f87acdce4a43a523ae5aa21a3fc37522d73ebd9ec04b1dbf01aa3d173852def"}, + {file = "sentry_sdk-2.5.1.tar.gz", hash = "sha256:fbc40a78a8a9c6675133031116144f0d0940376fa6e4e1acd5624c90b0aaf58b"}, ] [package.dependencies] -numpy = ">=1.19.5,<1.27.0" +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +urllib3 = ">=1.26.11" [package.extras] -dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "setuptools" -version = "68.1.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +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-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +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 (>=5)"] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"}, - {file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"}, + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] -name = "shapely" -version = "1.8.5.post1" -description = "Geometric objects, predicates, and operations" -optional = true -python-versions = ">=3.6" -files = [ - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d048f93e42ba578b82758c15d8ae037d08e69d91d9872bca5a1895b118f4e2b0"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99ab0ddc05e44acabdbe657c599fdb9b2d82e86c5493bdae216c0c4018a82dee"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:99a2f0da0109e81e0c101a2b4cd8412f73f5f299e7b5b2deaf64cd2a100ac118"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6fe855e7d45685926b6ba00aaeb5eba5862611f7465775dacd527e081a8ced6d"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec14ceca36f67cb48b34d02d7f65a9acae15cd72b48e303531893ba4a960f3ea"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a2b2a65fa7f97115c1cd989fe9d6f39281ca2a8a014f1d4904c1a6e34d7f25"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-win32.whl", hash = "sha256:21776184516a16bf82a0c3d6d6a312b3cd15a4cabafc61ee01cf2714a82e8396"}, - {file = "Shapely-1.8.5.post1-cp310-cp310-win_amd64.whl", hash = "sha256:a354199219c8d836f280b88f2c5102c81bb044ccea45bd361dc38a79f3873714"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:783bad5f48e2708a0e2f695a34ed382e4162c795cb2f0368b39528ac1d6db7ed"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a23ef3882d6aa203dd3623a3d55d698f59bfbd9f8a3bfed52c2da05a7f0f8640"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab38f7b5196ace05725e407cb8cab9ff66edb8e6f7bb36a398e8f73f52a7aaa2"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d086591f744be483b34628b391d741e46f2645fe37594319e0a673cc2c26bcf"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4728666fff8cccc65a07448cae72c75a8773fea061c3f4f139c44adc429b18c3"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-win32.whl", hash = "sha256:84010db15eb364a52b74ea8804ef92a6a930dfc1981d17a369444b6ddec66efd"}, - {file = "Shapely-1.8.5.post1-cp311-cp311-win_amd64.whl", hash = "sha256:48dcfffb9e225c0481120f4bdf622131c8c95f342b00b158cdbe220edbbe20b6"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2fd15397638df291c427a53d641d3e6fd60458128029c8c4f487190473a69a91"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a74631e511153366c6dbe3229fa93f877e3c87ea8369cd00f1d38c76b0ed9ace"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:66bdac74fbd1d3458fa787191a90fa0ae610f09e2a5ec398c36f968cc0ed743f"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-win32.whl", hash = "sha256:6d388c0c1bd878ed1af4583695690aa52234b02ed35f93a1c8486ff52a555838"}, - {file = "Shapely-1.8.5.post1-cp36-cp36m-win_amd64.whl", hash = "sha256:be9423d5a3577ac2e92c7e758bd8a2b205f5e51a012177a590bc46fc51eb4834"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5d7f85c2d35d39ff53c9216bc76b7641c52326f7e09aaad1789a3611a0f812f2"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:adcf8a11b98af9375e32bff91de184f33a68dc48b9cb9becad4f132fa25cfa3c"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:753ed0e21ab108bd4282405b9b659f2e985e8502b1a72b978eaa51d3496dee19"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-win32.whl", hash = "sha256:65b21243d8f6bcd421210daf1fabb9de84de2c04353c5b026173b88d17c1a581"}, - {file = "Shapely-1.8.5.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:370b574c78dc5af3a198a6da5d9b3d7c04654bd2ef7e80e80a3a0992dfb2d9cd"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:532a55ee2a6c52d23d6f7d1567c8f0473635f3b270262c44e1b0c88096827e22"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3480657460e939f45a7d359ef0e172a081f249312557fe9aa78c4fd3a362d993"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b65f5d530ba91e49ffc7c589255e878d2506a8b96ffce69d3b7c4500a9a9eaf8"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:147066da0be41b147a61f8eb805dea3b13709dbc873a431ccd7306e24d712bc0"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2822111ddc5bcfb116e6c663e403579d0fe3f147d2a97426011a191c43a7458"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b47bb6f9369e8bf3e6dbd33e6a25a47ee02b2874792a529fe04a49bf8bc0df6"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-win32.whl", hash = "sha256:2e0a8c2e55f1be1312b51c92b06462ea89e6bb703fab4b114e7a846d941cfc40"}, - {file = "Shapely-1.8.5.post1-cp38-cp38-win_amd64.whl", hash = "sha256:0d885cb0cf670c1c834df3f371de8726efdf711f18e2a75da5cfa82843a7ab65"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0b4ee3132ee90f07d63db3aea316c4c065ed7a26231458dda0874414a09d6ba3"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02dd5d7dc6e46515d88874134dc8fcdc65826bca93c3eecee59d1910c42c1b17"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6a9a4a31cd6e86d0fbe8473ceed83d4fe760b19d949fb557ef668defafea0f6"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:38f0fbbcb8ca20c16451c966c1f527cc43968e121c8a048af19ed3e339a921cd"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78fb9d929b8ee15cfd424b6c10879ce1907f24e05fb83310fc47d2cd27088e40"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89164e7a9776a19e29f01369a98529321994e2e4d852b92b7e01d4d9804c55bf"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-win32.whl", hash = "sha256:8e59817b0fe63d34baedaabba8c393c0090f061917d18fc0bcc2f621937a8f73"}, - {file = "Shapely-1.8.5.post1-cp39-cp39-win_amd64.whl", hash = "sha256:e9c30b311de2513555ab02464ebb76115d242842b29c412f5a9aa0cac57be9f6"}, - {file = "Shapely-1.8.5.post1.tar.gz", hash = "sha256:ef3be705c3eac282a28058e6c6e5503419b250f482320df2172abcbea642c831"}, -] - -[package.extras] -all = ["numpy", "pytest", "pytest-cov"] -test = ["pytest", "pytest-cov"] -vectorized = ["numpy"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] [[package]] name = "sounddevice" -version = "0.4.6" +version = "0.4.7" description = "Play and Record Sound with Python" optional = false python-versions = ">=3.7" files = [ - {file = "sounddevice-0.4.6-py3-none-any.whl", hash = "sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20"}, - {file = "sounddevice-0.4.6-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8"}, - {file = "sounddevice-0.4.6-py3-none-win32.whl", hash = "sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b"}, - {file = "sounddevice-0.4.6-py3-none-win_amd64.whl", hash = "sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c"}, - {file = "sounddevice-0.4.6.tar.gz", hash = "sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9"}, + {file = "sounddevice-0.4.7-py3-none-any.whl", hash = "sha256:1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7"}, + {file = "sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a"}, + {file = "sounddevice-0.4.7-py3-none-win32.whl", hash = "sha256:1ec1df094c468a210113aa22c4f390d5b4d9c7a73e41a6cb6ecfec83db59b380"}, + {file = "sounddevice-0.4.7-py3-none-win_amd64.whl", hash = "sha256:0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548"}, + {file = "sounddevice-0.4.7.tar.gz", hash = "sha256:69b386818d50a2d518607d4b973442e8d524760c7cd6c8b8be03d8c98fc4bce7"}, ] [package.dependencies] @@ -3044,80 +3164,72 @@ CFFI = ">=1.0" [package.extras] numpy = ["NumPy"] -[[package]] -name = "speechrecognition" -version = "3.10.0" -description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." -optional = false -python-versions = ">=3.8" -files = [ - {file = "SpeechRecognition-3.10.0-py2.py3-none-any.whl", hash = "sha256:7ae9966887d9909ce3e5a0c27ecc3eacfca16fd0c0829f77f552919418e86306"}, - {file = "SpeechRecognition-3.10.0.tar.gz", hash = "sha256:14131155e8a8ba00ead1b7b9b1a2fa71c845e4db5f9a5f66a33a1bd6c55c6c35"}, -] - -[package.dependencies] -requests = ">=2.26.0" - -[package.extras] -whisper-api = ["openai"] - [[package]] name = "sqlalchemy" -version = "2.0.20" +version = "2.0.30" description = "Database Abstraction Library" -optional = false +optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759b51346aa388c2e606ee206c0bc6f15a5299f6174d1e10cadbe4530d3c7a98"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1506e988ebeaaf316f183da601f24eedd7452e163010ea63dbe52dc91c7fc70e"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5768c268df78bacbde166b48be788b83dddaa2a5974b8810af422ddfe68a9bc8"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3f0dd6d15b6dc8b28a838a5c48ced7455c3e1fb47b89da9c79cc2090b072a50"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:243d0fb261f80a26774829bc2cee71df3222587ac789b7eaf6555c5b15651eed"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6d77c31e1bf4268b4d61b549c341cbff9842f8e115ba6904249c20cb78a61"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-win32.whl", hash = "sha256:bcb04441f370cbe6e37c2b8d79e4af9e4789f626c595899d94abebe8b38f9a4d"}, - {file = "SQLAlchemy-2.0.20-cp310-cp310-win_amd64.whl", hash = "sha256:d32b5ffef6c5bcb452723a496bad2d4c52b346240c59b3e6dba279f6dcc06c14"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd81466bdbc82b060c3c110b2937ab65ace41dfa7b18681fdfad2f37f27acdd7"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fe7d61dc71119e21ddb0094ee994418c12f68c61b3d263ebaae50ea8399c4d4"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4e571af672e1bb710b3cc1a9794b55bce1eae5aed41a608c0401885e3491179"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3364b7066b3c7f4437dd345d47271f1251e0cfb0aba67e785343cdbdb0fff08c"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1be86ccea0c965a1e8cd6ccf6884b924c319fcc85765f16c69f1ae7148eba64b"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1d35d49a972649b5080557c603110620a86aa11db350d7a7cb0f0a3f611948a0"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-win32.whl", hash = "sha256:27d554ef5d12501898d88d255c54eef8414576f34672e02fe96d75908993cf53"}, - {file = "SQLAlchemy-2.0.20-cp311-cp311-win_amd64.whl", hash = "sha256:411e7f140200c02c4b953b3dbd08351c9f9818d2bd591b56d0fa0716bd014f1e"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c6aceebbc47db04f2d779db03afeaa2c73ea3f8dcd3987eb9efdb987ffa09a3"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d3f175410a6db0ad96b10bfbb0a5530ecd4fcf1e2b5d83d968dd64791f810ed"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8186be85da6587456c9ddc7bf480ebad1a0e6dcbad3967c4821233a4d4df57"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c3d99ba99007dab8233f635c32b5cd24fb1df8d64e17bc7df136cedbea427897"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:76fdfc0f6f5341987474ff48e7a66c3cd2b8a71ddda01fa82fedb180b961630a"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-win32.whl", hash = "sha256:d3793dcf5bc4d74ae1e9db15121250c2da476e1af8e45a1d9a52b1513a393459"}, - {file = "SQLAlchemy-2.0.20-cp37-cp37m-win_amd64.whl", hash = "sha256:79fde625a0a55220d3624e64101ed68a059c1c1f126c74f08a42097a72ff66a9"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:599ccd23a7146e126be1c7632d1d47847fa9f333104d03325c4e15440fc7d927"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a58052b5a93425f656675673ef1f7e005a3b72e3f2c91b8acca1b27ccadf5f4"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79543f945be7a5ada9943d555cf9b1531cfea49241809dd1183701f94a748624"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63e73da7fb030ae0a46a9ffbeef7e892f5def4baf8064786d040d45c1d6d1dc5"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3ce5e81b800a8afc870bb8e0a275d81957e16f8c4b62415a7b386f29a0cb9763"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb0d3e94c2a84215532d9bcf10229476ffd3b08f481c53754113b794afb62d14"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-win32.whl", hash = "sha256:8dd77fd6648b677d7742d2c3cc105a66e2681cc5e5fb247b88c7a7b78351cf74"}, - {file = "SQLAlchemy-2.0.20-cp38-cp38-win_amd64.whl", hash = "sha256:6f8a934f9dfdf762c844e5164046a9cea25fabbc9ec865c023fe7f300f11ca4a"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:26a3399eaf65e9ab2690c07bd5cf898b639e76903e0abad096cd609233ce5208"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4cde2e1096cbb3e62002efdb7050113aa5f01718035ba9f29f9d89c3758e7e4e"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b09ba72e4e6d341bb5bdd3564f1cea6095d4c3632e45dc69375a1dbe4e26ec"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b74eeafaa11372627ce94e4dc88a6751b2b4d263015b3523e2b1e57291102f0"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:77d37c1b4e64c926fa3de23e8244b964aab92963d0f74d98cbc0783a9e04f501"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eefebcc5c555803065128401a1e224a64607259b5eb907021bf9b175f315d2a6"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-win32.whl", hash = "sha256:3423dc2a3b94125094897118b52bdf4d37daf142cbcf26d48af284b763ab90e9"}, - {file = "SQLAlchemy-2.0.20-cp39-cp39-win_amd64.whl", hash = "sha256:5ed61e3463021763b853628aef8bc5d469fe12d95f82c74ef605049d810f3267"}, - {file = "SQLAlchemy-2.0.20-py3-none-any.whl", hash = "sha256:63a368231c53c93e2b67d0c5556a9836fdcd383f7e3026a39602aad775b14acf"}, - {file = "SQLAlchemy-2.0.20.tar.gz", hash = "sha256:ca8a5ff2aa7f3ade6c498aaafce25b1eaeabe4e42b73e25519183e4566a16fc6"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, + {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, + {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, + {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, + {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, + {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, + {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, + {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, + {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, ] [package.dependencies] greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.2.0" +typing-extensions = ">=4.6.0" [package.extras] aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -3127,7 +3239,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -3137,112 +3249,208 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "stack-data" -version = "0.6.2" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = true -python-versions = "*" -files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "starlette" -version = "0.27.0" +version = "0.37.2" description = "The little ASGI library that shines." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [package.dependencies] anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] [[package]] name = "tenacity" -version = "8.2.3" +version = "8.3.0" description = "Retry code until it succeeds" +optional = true +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, + {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, - {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, ] +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +blobfile = ["blobfile (>=2)"] [[package]] name = "tokenizers" -version = "0.13.3" -description = "Fast and Customizable Tokenizers" +version = "0.19.1" +description = "" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "tokenizers-0.13.3-cp310-cp310-macosx_10_11_x86_64.whl", hash = "sha256:f3835c5be51de8c0a092058a4d4380cb9244fb34681fd0a295fbf0a52a5fdf33"}, - {file = "tokenizers-0.13.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4ef4c3e821730f2692489e926b184321e887f34fb8a6b80b8096b966ba663d07"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fd1a6a25353e9aa762e2aae5a1e63883cad9f4e997c447ec39d071020459bc"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee0b1b311d65beab83d7a41c56a1e46ab732a9eed4460648e8eb0bd69fc2d059"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ef4215284df1277dadbcc5e17d4882bda19f770d02348e73523f7e7d8b8d396"}, - {file = "tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4d53976079cff8a033f778fb9adca2d9d69d009c02fa2d71a878b5f3963ed30"}, - {file = "tokenizers-0.13.3-cp310-cp310-win32.whl", hash = "sha256:1f0e3b4c2ea2cd13238ce43548959c118069db7579e5d40ec270ad77da5833ce"}, - {file = "tokenizers-0.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:89649c00d0d7211e8186f7a75dfa1db6996f65edce4b84821817eadcc2d3c79e"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_10_11_universal2.whl", hash = "sha256:56b726e0d2bbc9243872b0144515ba684af5b8d8cd112fb83ee1365e26ec74c8"}, - {file = "tokenizers-0.13.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc5c022ce692e1f499d745af293ab9ee6f5d92538ed2faf73f9708c89ee59ce6"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55c981ac44ba87c93e847c333e58c12abcbb377a0c2f2ef96e1a266e4184ff2"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f247eae99800ef821a91f47c5280e9e9afaeed9980fc444208d5aa6ba69ff148"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e3215d048e94f40f1c95802e45dcc37c5b05eb46280fc2ccc8cd351bff839"}, - {file = "tokenizers-0.13.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ba2b0bf01777c9b9bc94b53764d6684554ce98551fec496f71bc5be3a03e98b"}, - {file = "tokenizers-0.13.3-cp311-cp311-win32.whl", hash = "sha256:cc78d77f597d1c458bf0ea7c2a64b6aa06941c7a99cb135b5969b0278824d808"}, - {file = "tokenizers-0.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:ecf182bf59bd541a8876deccf0360f5ae60496fd50b58510048020751cf1724c"}, - {file = "tokenizers-0.13.3-cp37-cp37m-macosx_10_11_x86_64.whl", hash = "sha256:0527dc5436a1f6bf2c0327da3145687d3bcfbeab91fed8458920093de3901b44"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07cbb2c307627dc99b44b22ef05ff4473aa7c7cc1fec8f0a8b37d8a64b1a16d2"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4560dbdeaae5b7ee0d4e493027e3de6d53c991b5002d7ff95083c99e11dd5ac0"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64064bd0322405c9374305ab9b4c07152a1474370327499911937fd4a76d004b"}, - {file = "tokenizers-0.13.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8c6e2ab0f2e3d939ca66aa1d596602105fe33b505cd2854a4c1717f704c51de"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win32.whl", hash = "sha256:6cc29d410768f960db8677221e497226e545eaaea01aa3613fa0fdf2cc96cff4"}, - {file = "tokenizers-0.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fc2a7fdf864554a0dacf09d32e17c0caa9afe72baf9dd7ddedc61973bae352d8"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_10_11_x86_64.whl", hash = "sha256:8791dedba834c1fc55e5f1521be325ea3dafb381964be20684b92fdac95d79b7"}, - {file = "tokenizers-0.13.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:d607a6a13718aeb20507bdf2b96162ead5145bbbfa26788d6b833f98b31b26e1"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3791338f809cd1bf8e4fee6b540b36822434d0c6c6bc47162448deee3f77d425"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2f35f30e39e6aab8716f07790f646bdc6e4a853816cc49a95ef2a9016bf9ce6"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310204dfed5aa797128b65d63538a9837cbdd15da2a29a77d67eefa489edda26"}, - {file = "tokenizers-0.13.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f9b92ea052305166559f38498b3b0cae159caea712646648aaa272f7160963"}, - {file = "tokenizers-0.13.3-cp38-cp38-win32.whl", hash = "sha256:9a3fa134896c3c1f0da6e762d15141fbff30d094067c8f1157b9fdca593b5806"}, - {file = "tokenizers-0.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:8e7b0cdeace87fa9e760e6a605e0ae8fc14b7d72e9fc19c578116f7287bb873d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_10_11_x86_64.whl", hash = "sha256:00cee1e0859d55507e693a48fa4aef07060c4bb6bd93d80120e18fea9371c66d"}, - {file = "tokenizers-0.13.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a23ff602d0797cea1d0506ce69b27523b07e70f6dda982ab8cf82402de839088"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ce07445050b537d2696022dafb115307abdffd2a5c106f029490f84501ef97"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:280ffe95f50eaaf655b3a1dc7ff1d9cf4777029dbbc3e63a74e65a056594abc3"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97acfcec592f7e9de8cadcdcda50a7134423ac8455c0166b28c9ff04d227b371"}, - {file = "tokenizers-0.13.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7730c98a3010cd4f523465867ff95cd9d6430db46676ce79358f65ae39797b"}, - {file = "tokenizers-0.13.3-cp39-cp39-win32.whl", hash = "sha256:48625a108029cb1ddf42e17a81b5a3230ba6888a70c9dc14e81bc319e812652d"}, - {file = "tokenizers-0.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:bc0a6f1ba036e482db6453571c9e3e60ecd5489980ffd95d11dc9f960483d783"}, - {file = "tokenizers-0.13.3.tar.gz", hash = "sha256:2e546dbb68b623008a5442353137fbb0123d311a6d7ba52f2667c8862a75af2e"}, -] - -[package.extras] -dev = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] -testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" @@ -3257,13 +3465,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.4" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, ] [package.dependencies] @@ -3275,62 +3483,78 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.9.0" -description = "Traitlets Python configuration system" -optional = true -python-versions = ">=3.7" -files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] - [[package]] name = "twilio" -version = "8.5.0" +version = "9.1.1" description = "Twilio API client and TwiML generator" optional = true python-versions = ">=3.7.0" files = [ - {file = "twilio-8.5.0-py2.py3-none-any.whl", hash = "sha256:a6fdea2252cb7a8a47b5750d58abe1888bba9777482bac8e9bc3be47970facc7"}, - {file = "twilio-8.5.0.tar.gz", hash = "sha256:f55da9b485f9070aef09836e56230d0e6fd83811d2e6668f20d9057dd3668143"}, + {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, + {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, ] [package.dependencies] aiohttp = ">=3.8.4" aiohttp-retry = ">=2.8.3" PyJWT = ">=2.0.0,<3.0.0" -pytz = "*" requests = ">=2.0.0" +[[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 = "types-cffi" +version = "1.16.0.20240331" +description = "Typing stubs for cffi" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-cffi-1.16.0.20240331.tar.gz", hash = "sha256:b8b20d23a2b89cfed5f8c5bc53b0cb8677c3aac6d970dbc771e28b9c698f5dee"}, + {file = "types_cffi-1.16.0.20240331-py3-none-any.whl", hash = "sha256:a363e5ea54a4eb6a4a105d800685fde596bc318089b025b27dee09849fe41ff0"}, +] + +[package.dependencies] +types-setuptools = "*" + [[package]] name = "types-pyopenssl" -version = "23.2.0.2" +version = "24.1.0.20240425" description = "Typing stubs for pyOpenSSL" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-pyOpenSSL-23.2.0.2.tar.gz", hash = "sha256:6a010dac9ecd42b582d7dd2cc3e9e40486b79b3b64bb2fffba1474ff96af906d"}, - {file = "types_pyOpenSSL-23.2.0.2-py3-none-any.whl", hash = "sha256:19536aa3debfbe25a918cf0d898e9f5fbbe6f3594a429da7914bf331deb1b342"}, + {file = "types-pyOpenSSL-24.1.0.20240425.tar.gz", hash = "sha256:0a7e82626c1983dc8dc59292bf20654a51c3c3881bcbb9b337c1da6e32f0204e"}, + {file = "types_pyOpenSSL-24.1.0.20240425-py3-none-any.whl", hash = "sha256:f51a156835555dd2a1f025621e8c4fbe7493470331afeef96884d1d29bf3a473"}, ] [package.dependencies] cryptography = ">=35.0.0" +types-cffi = "*" [[package]] name = "types-redis" -version = "4.6.0.4" +version = "4.6.0.20240425" description = "Typing stubs for redis" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-redis-4.6.0.4.tar.gz", hash = "sha256:c475a9d3cf73dd696c3887d30644323fc56f5e00af96151035b3b5b52875c9b3"}, - {file = "types_redis-4.6.0.4-py3-none-any.whl", hash = "sha256:03a1e1659ae4d8f6543bc2b8b11e94b1ee53937f313b1dc6f67dc7bde7d38fe0"}, + {file = "types-redis-4.6.0.20240425.tar.gz", hash = "sha256:9402a10ee931d241fdfcc04592ebf7a661d7bb92a8dea631279f0d8acbcf3a22"}, + {file = "types_redis-4.6.0.20240425-py3-none-any.whl", hash = "sha256:ac5bc19e8f5997b9e76ad5d9cf15d0392d9f28cf5fc7746ea4a64b989c45c6a8"}, ] [package.dependencies] @@ -3339,56 +3563,56 @@ types-pyOpenSSL = "*" [[package]] name = "types-regex" -version = "2023.8.8.0" +version = "2024.5.15.20240519" description = "Typing stubs for regex" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-regex-2023.8.8.0.tar.gz", hash = "sha256:ec87fbb69802b7224d8067bf65048fbfa7bc061efde65cfe471471c0c4d561e0"}, - {file = "types_regex-2023.8.8.0-py3-none-any.whl", hash = "sha256:52cc3e7748292fc0157388166e23b6d7b661459ae9dda8cec3c6a85ead3b1f98"}, + {file = "types-regex-2024.5.15.20240519.tar.gz", hash = "sha256:ef3f594a95a95d6b9b5704a1facf3511a73e4731209ddb8868461db4c42dc12b"}, + {file = "types_regex-2024.5.15.20240519-py3-none-any.whl", hash = "sha256:d5895079cc66f91ae8818aeef14e9337c492ceb87ad0ff3df8c1c04d418cb9dd"}, ] [[package]] name = "types-requests" -version = "2.31.0.2" +version = "2.32.0.20240602" description = "Typing stubs for requests" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.2.tar.gz", hash = "sha256:6aa3f7faf0ea52d728bb18c0a0d1522d9bfd8c72d26ff6f61bfc3d06a411cf40"}, - {file = "types_requests-2.31.0.2-py3-none-any.whl", hash = "sha256:56d181c85b5925cbc59f4489a57e72a8b2166f18273fd8ba7b6fe0c0b986f12a"}, + {file = "types-requests-2.32.0.20240602.tar.gz", hash = "sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06"}, + {file = "types_requests-2.32.0.20240602-py3-none-any.whl", hash = "sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8"}, ] [package.dependencies] -types-urllib3 = "*" +urllib3 = ">=2" [[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" +name = "types-setuptools" +version = "70.0.0.20240524" +description = "Typing stubs for setuptools" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, + {file = "types-setuptools-70.0.0.20240524.tar.gz", hash = "sha256:e31fee7b9d15ef53980526579ac6089b3ae51a005a281acf97178e90ac71aff6"}, + {file = "types_setuptools-70.0.0.20240524-py3-none-any.whl", hash = "sha256:8f5379b9948682d72a9ab531fbe52932e84c4f38deda570255f9bae3edd766bc"}, ] [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] name = "typing-inspect" version = "0.9.0" description = "Runtime inspection utilities for typing module." -optional = false +optional = true python-versions = "*" files = [ {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, @@ -3400,78 +3624,188 @@ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" [[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, ] -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - [[package]] -name = "urlobject" -version = "2.4.3" -description = "A utility class for manipulating URLs." -optional = true -python-versions = "*" +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" files = [ - {file = "URLObject-2.4.3.tar.gz", hash = "sha256:47b2e20e6ab9c8366b2f4a3566b6ff4053025dad311c4bb71279bbcfa2430caa"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.30.1" description = "The lightning-fast ASGI server." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, - {file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, ] [package.dependencies] click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] [[package]] -name = "virtualenv" -version = "20.24.3" -description = "Virtual Python Environment builder" +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" optional = false -python-versions = ">=3.7" -files = [ - {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, - {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, ] -[package.dependencies] -distlib = ">=0.3.7,<1" -filelock = ">=3.12.2,<4" -platformdirs = ">=3.9.1,<4" - [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "vonage" -version = "3.13.0" +version = "3.16.0" description = "Vonage Server SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "vonage-3.13.0-py2.py3-none-any.whl", hash = "sha256:f84e74f4c2dd8c8f97bffecda9016d503de1d4b9df98efcbd6e7ddfb1a3359dc"}, - {file = "vonage-3.13.0.tar.gz", hash = "sha256:1e82fa51b6d9d0af300b85f3ee25a3ef2f96c4f3ab753f20ba4b38e164b06db8"}, + {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, + {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, ] [package.dependencies] @@ -3483,287 +3817,392 @@ vonage-jwt = ">=1.1.0" [[package]] name = "vonage-jwt" -version = "1.1.0" -description = "A JWT Generator for Python. Creates JWTs for use with Vonage APIs." +version = "1.1.1" +description = "Tooling for working with JWTs for Vonage APIs in Python." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "vonage_jwt-1.1.0-py3-none-any.whl", hash = "sha256:f41d2fc51f80cebddff1d65ec2146527ee83ca95f3e8a8fe9cda2263a435e2ed"}, - {file = "vonage_jwt-1.1.0.tar.gz", hash = "sha256:ed6af2bf82dc7cffe42ad453295472b86e02852baaaa3f2b97cd49fcb4e9019d"}, + {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, + {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, ] [package.dependencies] pyjwt = {version = ">=1.6.4", extras = ["crypto"]} +vonage-utils = ">=1.1.2" [[package]] -name = "wcwidth" -version = "0.2.6" -description = "Measures the displayed width of unicode strings in a terminal" +name = "vonage-utils" +version = "1.1.2" +description = "Utils package containing objects for use with Vonage APIs" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, + {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, ] +[package.dependencies] +pydantic = ">=2.7.1" +typing-extensions = ">=4.9.0" + [[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -optional = true -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +name = "watchfiles" +version = "0.22.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, ] [package.dependencies] -six = "*" +anyio = ">=3.0.0" [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +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 = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -3772,28 +4211,27 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.19.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +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)"] [extras] -actions = ["nylas"] -agents = ["google-cloud-aiplatform"] -all = ["elevenlabs", "google-cloud-aiplatform", "google-cloud-speech", "google-cloud-texttospeech", "gtts", "nylas", "redis", "twilio", "vonage"] -synthesizers = ["elevenlabs", "google-cloud-texttospeech", "gtts"] -telephony = ["redis", "twilio", "vonage"] +all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-community", "miniaudio", "nltk", "pvkoala", "pydub", "twilio", "vonage"] +misc = ["langchain", "langchain-community"] +synthesizers = ["cartesia", "google-cloud-texttospeech", "miniaudio", "pvkoala", "pydub"] +telephony = ["twilio", "vonage"] transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" -python-versions = ">=3.8.1,<3.12" -content-hash = "69f7c4477423f9ac80c4ad74767eb35a1b001498da8d9b207c3d00f0cab832ff" +python-versions = ">=3.10,<4.0" +content-hash = "6a94ac4f14452e6e73f6d5984455bf7935a15f6812dfe6214a38ebd1be30adb9" diff --git a/pyproject.toml b/pyproject.toml index e43119d8bb..b613eb7bfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,79 +7,124 @@ license = "MIT License" readme = "README.md" homepage = "https://github.com/vocodedev/vocode-python" + [tool.poetry.dependencies] -python = ">=3.8.1,<3.12" -pydub = "^0.25.1" -nltk = "^3.8.1" -openai = "^0.27.8" -sounddevice = "^0.4.6" -azure-cognitiveservices-speech = "^1.27.0" -websockets = "^11.0.2" -requests = "^2.28.2" -uvicorn = "^0.21.1" -fastapi = "^0.100.1" -jinja2 = "^3.1.2" -python-multipart = "^0.0.6" -six = "^1.16.0" -opentelemetry-sdk = "^1.17.0" +python = ">=3.10,<4.0" +aiohttp = "^3.9.5" +anthropic = "^0.28.0" +azure-cognitiveservices-speech = "^1.37.0" +elevenlabs = "^1.2.2" +fastapi = "^0.111.0" janus = "^1.0.0" -scipy = "^1.10.1" -anthropic = "^0.7.1" +jinja2 = "^3.1.4" +jsonschema = "^4.22.0" +loguru = "^0.7.2" +numpy = "^1.26.4" +openai = "^1.30.5" +opentelemetry-sdk = "^1.24.0" +phonenumbers = "^8.13.37" +pydantic = "^2.7.2" +pydantic-settings = "^2.3.0" +pyht = "^0.0.28" +redis = "^5.0.4" +requests = "^2.32.3" +sentry-sdk = { extras = ["fastapi"], version = "^2.3.1" } +sounddevice = "^0.4.7" +tiktoken = "^0.7.0" +uvicorn = "^0.30.0" +websockets = "^12.0" +nltk = "^3.8.1" -elevenlabs = {version = "^0.2.6", optional = true} -google-cloud-texttospeech = {version = "^2.16.1", optional = true} -gtts = {version = "^2.3.1", optional = true} +# Synthesizers +google-cloud-texttospeech = { version = "^2.16.3", optional = true } +miniaudio = { version = "^1.59", optional = true } +pvkoala = { version = "^2.0.1", optional = true } +pydub = { version = "^0.25.1", optional = true } +cartesia = { version = "^0.1.1", optional = true } -google-cloud-speech = {version = "^2.19.0", optional = true} +# Transcribers +google-cloud-speech = { version = "^2.26.0", optional = true } -redis = {version = "^4.5.4", optional = true} -twilio = {version = "^8.1.0", optional = true} -vonage = {version = "^3.5.1", optional = true} -nylas = {version = "^5.14.0", optional = true} -speechrecognition = "^3.10.0" -aiohttp = "^3.8.4" -langchain = "^0.1.4" -google-cloud-aiplatform = {version = "^1.26.0", optional = true} -miniaudio = "^1.59" -boto3 = "^1.28.28" -pydantic = "^2.0" -langchain-community = "^0.0.16" +# Telephony +twilio = { version = "^9.1.0", optional = true } +vonage = { version = "^3.14.0", optional = true } +# Misc +langchain = { version = "^0.2.1", optional = true } +langchain-community = { version = "^0.2.1", optional = true } [tool.poetry.group.lint.dependencies] black = "^24.4.2" +isort = "^5.13.2" +[tool.poetry.group.typing.dependencies] +mypy = "^1.10.0" +pydub-stubs = "^0.25.1.0" +types-redis = "^4.6.0" +types-regex = "^2024.5.15.20240519" +types-requests = "^2.32.0.20240523" [tool.poetry.group.dev.dependencies] -python-dotenv = "^1.0.0" -pytest = "^7.4.3" -pytest-asyncio = "^0.21.0" -aioresponses = "^0.7.4" -pre-commit = "^3.3.3" -pytest-mock = "^3.12.0" - +aioresponses = "^0.7.6" +coverage = "^7.5.3" +fakeredis = "^2.23.2" +pytest = "^8.2.1" +pytest-asyncio = "^0.23.7" +pytest-cov = "^5.0.0" +pytest-env = "^1.1.3" +pytest-httpx = "^0.30.0" +pytest-mock = "^3.14.0" -[tool.poetry.group.typing.dependencies] -mypy = "^1.8.0" -pydub-stubs = "^0.25.1.0" -types-requests = "^2.30.0.0" -types-regex = "^2023.5.5.0" -types-redis = "^4.5.5.2" +[tool.poetry.extras] +synthesizers = [ + "google-cloud-texttospeech", + "miniaudio", + "pvkoala", + "pydub", + "cartesia", +] +transcribers = ["google-cloud-speech"] +telephony = ["twilio", "vonage"] +misc = ["langchain", "langchain-community"] +all = [ + "google-cloud-texttospeech", + "miniaudio", + "nltk", + "pvkoala", + "pydub", + "google-cloud-speech", + "twilio", + "vonage", + "langchain", + "langchain-community", + "cartesia" +] [tool.mypy] -ignore_missing_imports = "True" +ignore_missing_imports = true exclude = ["venv", ".venv"] -explicit_package_bases = "True" +explicit_package_bases = true -[tool.poetry.extras] -synthesizers = ["gtts", "google-cloud-texttospeech", "elevenlabs"] -transcribers = ["google-cloud-speech"] -telephony = ["twilio", "redis", "vonage"] -agents = ["google-cloud-aiplatform"] -actions = ["nylas"] -all = ["gtts", "google-cloud-texttospeech", "elevenlabs", "google-cloud-speech", "google-cloud-aiplatform", "twilio", "redis", "nylas", "vonage"] +[tool.pytest.ini_options] +addopts = "--basetemp=/tmp/pytest" +testpaths = ["tests"] + +[tool.pytest_env] +ENVIRONMENT = "test" +AZURE_OPENAI_API_BASE_EAST_US = "https://api.openai.com" +AZURE_OPENAI_API_KEY_EAST_US = "test" + +[tool.coverage.run] +omit = ["tests/*"] + +[tool.black] +line-length = 100 + +[tool.isort] +profile = "black" +line_length = 100 [build-system] diff --git a/quickstarts/streaming_conversation.py b/quickstarts/streaming_conversation.py index d02124a6b4..9a482299fc 100644 --- a/quickstarts/streaming_conversation.py +++ b/quickstarts/streaming_conversation.py @@ -1,25 +1,46 @@ import asyncio -import logging import signal -from dotenv import load_dotenv +from pydantic_settings import BaseSettings, SettingsConfigDict -load_dotenv() - -from vocode.streaming.streaming_conversation import StreamingConversation from vocode.helpers import create_streaming_microphone_input_and_speaker_output -from vocode.streaming.transcriber import * -from vocode.streaming.agent import * -from vocode.streaming.synthesizer import * -from vocode.streaming.models.transcriber import * -from vocode.streaming.models.agent import * -from vocode.streaming.models.synthesizer import * +from vocode.logging import configure_pretty_logging +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import ( + DeepgramTranscriberConfig, + PunctuationEndpointingConfig, +) +from vocode.streaming.streaming_conversation import StreamingConversation +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber + +configure_pretty_logging() + + +class Settings(BaseSettings): + """ + Settings for the streaming conversation quickstart. + These parameters can be configured with environment variables. + """ + openai_api_key: str = "ENTER_YOUR_OPENAI_API_KEY_HERE" + azure_speech_key: str = "ENTER_YOUR_AZURE_KEY_HERE" + deepgram_api_key: str = "ENTER_YOUR_DEEPGRAM_API_KEY_HERE" -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) + azure_speech_region: str = "eastus" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) + + +settings = Settings() async def main(): @@ -28,7 +49,6 @@ async def main(): speaker_output, ) = create_streaming_microphone_input_and_speaker_output( use_default_devices=False, - logger=logger, use_blocking_speaker_output=True, # this moves the playback to a separate thread, set to False to use the main thread ) @@ -38,24 +58,25 @@ async def main(): DeepgramTranscriberConfig.from_input_device( microphone_input, endpointing_config=PunctuationEndpointingConfig(), - ) + api_key=settings.deepgram_api_key, + ), ), agent=ChatGPTAgent( ChatGPTAgentConfig( + openai_api_key=settings.openai_api_key, initial_message=BaseMessage(text="What up"), prompt_preamble="""The AI is having a pleasant conversation about life""", ) ), synthesizer=AzureSynthesizer( - AzureSynthesizerConfig.from_output_device(speaker_output) + AzureSynthesizerConfig.from_output_device(speaker_output), + azure_speech_key=settings.azure_speech_key, + azure_speech_region=settings.azure_speech_region, ), - logger=logger, ) await conversation.start() print("Conversation started, press Ctrl+C to end") - signal.signal( - signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate()) - ) + signal.signal(signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate())) while conversation.is_active(): chunk = await microphone_input.get_audio() conversation.receive_audio(chunk) diff --git a/quickstarts/turn_based_conversation.py b/quickstarts/turn_based_conversation.py index 4afaaeb9b1..73cfb0f0ca 100644 --- a/quickstarts/turn_based_conversation.py +++ b/quickstarts/turn_based_conversation.py @@ -1,21 +1,32 @@ -import logging -from dotenv import load_dotenv -from vocode import getenv +from pydantic_settings import BaseSettings, SettingsConfigDict + from vocode.helpers import create_turn_based_microphone_input_and_speaker_output from vocode.turn_based.agent.chat_gpt_agent import ChatGPTAgent from vocode.turn_based.synthesizer.azure_synthesizer import AzureSynthesizer -from vocode.turn_based.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer from vocode.turn_based.transcriber.whisper_transcriber import WhisperTranscriber from vocode.turn_based.turn_based_conversation import TurnBasedConversation -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) -load_dotenv() +class Settings(BaseSettings): + """ + Settings for the turn-based conversation quickstart. + These parameters can be configured with environment variables. + """ + + openai_api_key: str = "ENTER_YOUR_OPENAI_API_KEY_HERE" + azure_speech_key: str = "ENTER_YOUR_AZURE_KEY_HERE" + + azure_speech_region: str = "eastus" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) + -# See https://api.elevenlabs.io/v1/voices -ADAM_VOICE_ID = "pNInz6obpgDQGcFmaJgB" +settings = Settings() if __name__ == "__main__": ( @@ -23,24 +34,22 @@ speaker_output, ) = create_turn_based_microphone_input_and_speaker_output( use_default_devices=False, - logger=logger, ) conversation = TurnBasedConversation( input_device=microphone_input, output_device=speaker_output, - transcriber=WhisperTranscriber(api_key=getenv("OPENAI_API_KEY")), + transcriber=WhisperTranscriber(api_key=settings.openai_api_key), agent=ChatGPTAgent( system_prompt="The AI is having a pleasant conversation about life", initial_message="Hello!", - api_key=getenv("OPENAI_API_KEY"), + api_key=settings.openai_api_key, ), synthesizer=AzureSynthesizer( - api_key=getenv("AZURE_SPEECH_KEY"), - region=getenv("AZURE_SPEECH_REGION"), + api_key=settings.azure_speech_key, + region=settings.azure_speech_region, voice_name="en-US-SteffanNeural", ), - logger=logger, ) print("Starting conversation. Press Ctrl+C to exit.") while True: diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000000..59e0c43589 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,66 @@ +import os +from typing import Generator +from unittest import mock + +import pytest +from fakeredis import FakeAsyncRedis +from pytest import FixtureRequest, MonkeyPatch + + +@pytest.fixture(scope="session") +def default_env_vars() -> dict[str, str]: + """ + Defines default environment variables for the test session. + + This fixture provides a dictionary of default environment variables that are + commonly used across tests. It can be overridden in submodule scoped `conftest.py` + files or directly in tests. + + :return: A dictionary of default environment variables. + """ + return { + "ENVIRONMENT": "test", + "AZURE_OPENAI_API_BASE_EAST_US": "https://api.openai.com", + "AZURE_OPENAI_API_KEY_EAST_US": "test", + } + + +@pytest.fixture() +def mock_env( + monkeypatch: MonkeyPatch, request: pytest.FixtureRequest, default_env_vars: dict[str, str] +) -> Generator[None, None, None]: + """ + Temporarily sets environment variables for testing. + + This fixture allows tests to run with a modified set of environment variables, + either using the default set provided by `default_env_vars` or overridden by + test-specific parameters. It ensures that changes to environment variables do + not leak between tests. + + :param monkeypatch: The pytest monkeypatch fixture for modifying environment variables. + :param request: The pytest FixtureRequest object for accessing test-specific overrides. + :param default_env_vars: A dictionary of default environment variables. + :yield: None. This is a setup-teardown fixture that cleans up after itself. + """ + envvars = default_env_vars.copy() + if hasattr(request, "param") and isinstance(request.param, dict): + envvars.update(request.param) + + with mock.patch.dict(os.environ, envvars): + yield + + +@pytest.fixture +def redis_client(request: FixtureRequest) -> FakeAsyncRedis: + """ + Provides a fake Redis client for asynchronous operations. + + This fixture can be used in tests that require a Redis client but should not + interact with a real Redis instance. It leverages fakeredis to simulate Redis + operations in memory without any external dependencies. + + :param request: The pytest request object, used here for potential future extensions. + :return: An instance of a fake Redis client. + """ + redis_client = FakeAsyncRedis() + return redis_client diff --git a/tests/fakedata/conversation.py b/tests/fakedata/conversation.py new file mode 100644 index 0000000000..c538b45aef --- /dev/null +++ b/tests/fakedata/conversation.py @@ -0,0 +1,85 @@ +from typing import Optional + +from pytest_mock import MockerFixture + +from vocode.streaming.agent.base_agent import BaseAgent +from vocode.streaming.models.agent import AgentConfig, ChatGPTAgentConfig +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig, SynthesizerConfig +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, TranscriberConfig +from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.streaming_conversation import StreamingConversation +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer +from vocode.streaming.telephony.constants import DEFAULT_CHUNK_SIZE, DEFAULT_SAMPLING_RATE +from vocode.streaming.transcriber.base_transcriber import BaseTranscriber +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramEndpointingConfig +from vocode.streaming.utils.events_manager import EventsManager + +DEFAULT_DEEPGRAM_TRANSCRIBER_CONFIG = DeepgramTranscriberConfig( + chunk_size=DEFAULT_CHUNK_SIZE, + sampling_rate=DEFAULT_SAMPLING_RATE, + audio_encoding=AudioEncoding.MULAW, + endpointing_config=DeepgramEndpointingConfig(), + model="2-phonecall", + tier="nova", +) + +DEFAULT_SYNTHESIZER_CONFIG = PlayHtSynthesizerConfig( + sampling_rate=DEFAULT_SAMPLING_RATE, + audio_encoding=AudioEncoding.MULAW, +) + +DEFAULT_CHAT_GPT_AGENT_CONFIG = ChatGPTAgentConfig( + prompt_preamble="You are an agent of chaos", initial_message=BaseMessage(text="Hi there!") +) + + +class DummyOutputDevice(BaseOutputDevice): + def consume_nonblocking(self, chunk: bytes): + pass + + +def create_fake_transcriber(mocker: MockerFixture, transcriber_config: TranscriberConfig): + transcriber = mocker.MagicMock() + transcriber.get_transcriber_config = mocker.MagicMock(return_value=transcriber_config) + return transcriber + + +def create_fake_agent(mocker: MockerFixture, agent_config: AgentConfig): + agent = mocker.MagicMock() + agent.get_agent_config = mocker.MagicMock(return_value=agent_config) + return agent + + +def create_fake_synthesizer(mocker: MockerFixture, synthesizer_config: SynthesizerConfig): + synthesizer = mocker.MagicMock() + synthesizer.get_synthesizer_config = mocker.MagicMock(return_value=synthesizer_config) + return synthesizer + + +def create_fake_streaming_conversation( + mocker: MockerFixture, + transcriber: Optional[BaseTranscriber[TranscriberConfig]] = None, + agent: Optional[BaseAgent] = None, + synthesizer: Optional[BaseSynthesizer] = None, + speed_coefficient: float = 1.0, + conversation_id: Optional[str] = None, + events_manager: Optional[EventsManager] = None, +): + transcriber = transcriber or create_fake_transcriber( + mocker, DEFAULT_DEEPGRAM_TRANSCRIBER_CONFIG + ) + agent = agent or create_fake_agent(mocker, DEFAULT_CHAT_GPT_AGENT_CONFIG) + synthesizer = synthesizer or create_fake_synthesizer(mocker, DEFAULT_SYNTHESIZER_CONFIG) + return StreamingConversation( + output_device=DummyOutputDevice( + sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=AudioEncoding.MULAW + ), + transcriber=transcriber, + agent=agent, + synthesizer=synthesizer, + speed_coefficient=speed_coefficient, + conversation_id=conversation_id, + events_manager=events_manager, + ) diff --git a/tests/fakedata/id.py b/tests/fakedata/id.py new file mode 100644 index 0000000000..7117ba458b --- /dev/null +++ b/tests/fakedata/id.py @@ -0,0 +1,5 @@ +import uuid + + +def generate_uuid() -> uuid.UUID: + return uuid.uuid4() diff --git a/tests/streaming/__init__.py b/tests/streaming/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/streaming/action/conftest.py b/tests/streaming/action/conftest.py new file mode 100644 index 0000000000..622af9fa30 --- /dev/null +++ b/tests/streaming/action/conftest.py @@ -0,0 +1,31 @@ +import pytest + + +@pytest.fixture(scope="session") +def default_env_vars(default_env_vars: dict[str, str]) -> dict[str, str]: + """ + Extends the `default_env_vars` fixture specifically for the submodule. + + This fixture takes the session-scoped `default_env_vars` fixture from the parent conftest.py + and extends or overrides it with additional or modified environment variables specific to + the submodule. + + :param default_env_vars: The inherited `default_env_vars` fixture from the parent conftest. + :return: A modified dictionary of default environment variables for the submodule. + """ + submodule_env_vars = default_env_vars.copy() + + submodule_env_vars.update( + { + "VONAGE_API_KEY": "test", + "VONAGE_API_SECRET": "test", + "VONAGE_APPLICATION_ID": "test", + "VONAGE_PRIVATE_KEY": """-----BEGIN PRIVATE KEY----- +fake_key +-----END PRIVATE KEY-----""", + "BASE_URL": "test", + "CALL_SERVER_BASE_URL": "test2", + } + ) + + return submodule_env_vars diff --git a/tests/streaming/action/test_dtmf.py b/tests/streaming/action/test_dtmf.py new file mode 100644 index 0000000000..1f7097086a --- /dev/null +++ b/tests/streaming/action/test_dtmf.py @@ -0,0 +1,77 @@ +import pytest +from aioresponses import aioresponses +from tests.fakedata.id import generate_uuid + +from vocode.streaming.action.dtmf import ( + DTMFParameters, + DTMFVocodeActionConfig, + TwilioDTMF, + VonageDTMF, +) +from vocode.streaming.models.actions import ( + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.models.telephony import VonageConfig +from vocode.streaming.utils import create_conversation_id +from vocode.streaming.utils.state_manager import VonagePhoneConversationStateManager + + +@pytest.mark.asyncio +async def test_vonage_dtmf_press_digits(mocker, mock_env): + action = VonageDTMF(action_config=DTMFVocodeActionConfig()) + vonage_uuid = generate_uuid() + digits = "1234" + + vonage_phone_conversation_mock = mocker.MagicMock() + vonage_config = VonageConfig( + api_key="api_key", + api_secret="api_secret", + application_id="application_id", + private_key="-----BEGIN PRIVATE KEY-----\nasdf\n-----END PRIVATE KEY-----", + ) + vonage_phone_conversation_mock.vonage_config = vonage_config + mocker.patch("vonage.Client._create_jwt_auth_string", return_value=b"asdf") + + action.attach_conversation_state_manager( + VonagePhoneConversationStateManager(vonage_phone_conversation_mock) + ) + + assert ( + action.conversation_state_manager.create_vonage_client().get_telephony_config() + == vonage_config + ) + + with aioresponses() as m: + m.put( + f"https://api.nexmo.com/v1/calls/{vonage_uuid}/dtmf", + status=200, + ) + action_output = await action.run( + action_input=VonagePhoneConversationActionInput( + action_config=DTMFVocodeActionConfig(), + conversation_id=create_conversation_id(), + params=DTMFParameters(buttons=digits), + vonage_uuid=str(vonage_uuid), + ) + ) + + assert action_output.response.success is True + + +@pytest.mark.asyncio +async def test_twilio_dtmf_press_digits(mocker, mock_env): + action = TwilioDTMF(action_config=DTMFVocodeActionConfig()) + digits = "1234" + twilio_sid = "twilio_sid" + + action_output = await action.run( + action_input=TwilioPhoneConversationActionInput( + action_config=DTMFVocodeActionConfig(), + conversation_id=create_conversation_id(), + params=DTMFParameters(buttons=digits), + twilio_sid=twilio_sid, + ) + ) + + assert action_output.response.success is False # Twilio does not support DTMF diff --git a/tests/streaming/action/test_end_conversation.py b/tests/streaming/action/test_end_conversation.py new file mode 100644 index 0000000000..44cfb5109d --- /dev/null +++ b/tests/streaming/action/test_end_conversation.py @@ -0,0 +1,132 @@ +import asyncio +from typing import Generator, Type +from unittest.mock import MagicMock +from uuid import UUID + +import pytest +from pydantic.v1 import BaseModel +from pytest_mock import MockerFixture +from tests.fakedata.id import generate_uuid + +from vocode.streaming.action.end_conversation import ( + EndConversation, + EndConversationParameters, + EndConversationVocodeActionConfig, +) +from vocode.streaming.models.actions import ( + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.models.transcript import Transcript +from vocode.streaming.utils import create_conversation_id + + +class EndConversationActionTestCase(BaseModel): + class Config: + arbitrary_types_allowed = True + + action: EndConversation + vonage_uuid: UUID + twilio_sid: str + conversation_id: str + + +@pytest.fixture +def end_conversation_action_test_case(mocker: MockerFixture) -> EndConversationActionTestCase: + action = EndConversation(action_config=EndConversationVocodeActionConfig()) + return EndConversationActionTestCase( + action=action, + vonage_uuid=generate_uuid(), + twilio_sid="twilio_sid", + conversation_id=create_conversation_id(), + ) + + +@pytest.fixture +def conversation_state_manager_mock(mocker: MockerFixture) -> MagicMock: + mock = mocker.MagicMock() + mock.terminate_conversation = mocker.AsyncMock() + mock.transcript = Transcript() + return mock + + +@pytest.fixture +def user_message_tracker() -> asyncio.Event: + tracker = asyncio.Event() + tracker.set() + return tracker + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "action_input_class, identifier", + [ + (VonagePhoneConversationActionInput, "vonage_uuid"), + (TwilioPhoneConversationActionInput, "twilio_sid"), + ], +) +async def test_end_conversation_success( + mocker: MockerFixture, + mock_env: Generator, + end_conversation_action_test_case: EndConversationActionTestCase, + conversation_state_manager_mock: MagicMock, + user_message_tracker: asyncio.Event, + action_input_class: Type[BaseModel], + identifier: str, +): + end_conversation_action_test_case.action.attach_conversation_state_manager( + conversation_state_manager_mock + ) + + identifier_value = getattr(end_conversation_action_test_case, identifier) + action_input = action_input_class( + action_config=EndConversationVocodeActionConfig(), + conversation_id=end_conversation_action_test_case.conversation_id, + params=EndConversationParameters(), + **{identifier: str(identifier_value)}, + user_message_tracker=user_message_tracker, + ) + + response = await end_conversation_action_test_case.action.run(action_input=action_input) + + assert response.response.success + assert conversation_state_manager_mock.terminate_conversation.call_count == 1 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "action_input_class, identifier", + [ + (VonagePhoneConversationActionInput, "vonage_uuid"), + (TwilioPhoneConversationActionInput, "twilio_sid"), + ], +) +async def test_end_conversation_fails_if_interrupted( + mocker: MockerFixture, + mock_env: Generator, + end_conversation_action_test_case: EndConversationActionTestCase, + conversation_state_manager_mock: MagicMock, + user_message_tracker: asyncio.Event, + action_input_class: Type[BaseModel], + identifier: str, +): + conversation_state_manager_mock.transcript.add_bot_message( + "Unfinished", conversation_id=end_conversation_action_test_case.conversation_id + ) + end_conversation_action_test_case.action.attach_conversation_state_manager( + conversation_state_manager_mock + ) + + identifier_value = getattr(end_conversation_action_test_case, identifier) + action_input = action_input_class( + action_config=EndConversationVocodeActionConfig(), + conversation_id=end_conversation_action_test_case.conversation_id, + params=EndConversationParameters(), + **{identifier: str(identifier_value)}, + user_message_tracker=user_message_tracker, + ) + + response = await end_conversation_action_test_case.action.run(action_input=action_input) + + assert not response.response.success + assert conversation_state_manager_mock.terminate_conversation.call_count == 0 diff --git a/tests/streaming/action/test_external_actions.py b/tests/streaming/action/test_external_actions.py new file mode 100644 index 0000000000..53eb3a4775 --- /dev/null +++ b/tests/streaming/action/test_external_actions.py @@ -0,0 +1,122 @@ +import base64 +import json +import os + +import pytest +from tests.fakedata.id import generate_uuid + +from vocode.streaming.action.execute_external_action import ( + ExecuteExternalAction, + ExecuteExternalActionParameters, + ExecuteExternalActionVocodeActionConfig, +) +from vocode.streaming.action.external_actions_requester import ExternalActionResponse +from vocode.streaming.models.actions import ( + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.utils import create_conversation_id +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, +) + +ACTION_INPUT_SCHEMA: dict = { + "type": "object", + "properties": { + "length": {"type": "string", "enum": ["30m", "1hr"]}, + "time": {"type": "string", "pattern": r"^\d{2}:\d0[ap]m$"}, + }, +} + + +@pytest.fixture +def action_config() -> dict: + """Provides a common action configuration for tests.""" + return { + "processing_mode": "muted", + "name": "name", + "description": "A description", + "url": "https://example.com", + "input_schema": json.dumps(ACTION_INPUT_SCHEMA), + "speak_on_send": True, + "speak_on_receive": True, + "signature_secret": base64.b64encode(os.urandom(32)).decode(), + } + + +@pytest.fixture +def execute_action_setup(mocker, action_config) -> ExecuteExternalAction: + """Common setup for creating an ExecuteExternalAction instance.""" + action = ExecuteExternalAction( + action_config=ExecuteExternalActionVocodeActionConfig(**action_config), + ) + mocked_requester = mocker.AsyncMock() + mocked_requester.send_request.return_value = ExternalActionResponse( + result={"test": "test"}, + agent_message="message!", + success=True, + ) + action.external_actions_requester = mocked_requester + return action + + +@pytest.fixture +def mock_twilio_conversation_state_manager(mocker) -> TwilioPhoneConversationStateManager: + """Fixture to mock TwilioPhoneConversationStateManager.""" + manager = mocker.MagicMock(spec=TwilioPhoneConversationStateManager) + manager.mute_agent = mocker.MagicMock() + # Add any other necessary mock setup here + return manager + + +@pytest.fixture +def mock_vonage_conversation_state_manager(mocker) -> VonagePhoneConversationStateManager: + """Fixture to mock VonagePhoneConversationStateManager.""" + manager = mocker.MagicMock(spec=VonagePhoneConversationStateManager) + manager.mute_agent = mocker.MagicMock() + # Add any other necessary mock setup here + return manager + + +@pytest.mark.asyncio +async def test_vonage_execute_external_action_success( + mocker, + mock_vonage_conversation_state_manager: VonagePhoneConversationStateManager, + execute_action_setup: ExecuteExternalAction, +): + execute_action_setup.attach_conversation_state_manager(mock_vonage_conversation_state_manager) + vonage_uuid = generate_uuid() + + response = await execute_action_setup.run( + action_input=VonagePhoneConversationActionInput( + action_config=execute_action_setup.action_config, + conversation_id=create_conversation_id(), + params=ExecuteExternalActionParameters(payload={}), + vonage_uuid=str(vonage_uuid), + ), + ) + + assert response.response.success + assert response.response.result == {"test": "test"} + + +@pytest.mark.asyncio +async def test_twilio_execute_external_action_success( + mocker, + mock_twilio_conversation_state_manager: TwilioPhoneConversationStateManager, + execute_action_setup: ExecuteExternalAction, +): + execute_action_setup.attach_conversation_state_manager(mock_twilio_conversation_state_manager) + + response = await execute_action_setup.run( + action_input=TwilioPhoneConversationActionInput( + action_config=execute_action_setup.action_config, + conversation_id=create_conversation_id(), + params=ExecuteExternalActionParameters(payload={}), + twilio_sid="twilio_sid", + ), + ) + + assert response.response.success + assert response.response.result == {"test": "test"} diff --git a/tests/streaming/action/test_external_actions_requester.py b/tests/streaming/action/test_external_actions_requester.py new file mode 100644 index 0000000000..c9d2f8b359 --- /dev/null +++ b/tests/streaming/action/test_external_actions_requester.py @@ -0,0 +1,82 @@ +import base64 +import hashlib +import hmac +import json +import os +from typing import Any, Callable, Dict + +import pytest +from httpx import Request, Response +from pytest_httpx import HTTPXMock + +from vocode.streaming.action.external_actions_requester import ExternalActionsRequester + +JSON_SCHEMA = { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"], + }, + "time": { + "type": "string", + "pattern": r"^\d{2}:\d0[ap]m$", + }, + }, +} + + +@pytest.fixture +def mock_async_client_post(status_code: int, json_response: Dict[str, Any]) -> Callable: + async def mock_post(self, url: str, content: str, headers: Dict[str, str] = None) -> Response: + request = Request(method="POST", url=url, headers=headers, content=content) + return Response(status_code, json=json_response, request=request) + + return mock_post + + +@pytest.fixture +def requester() -> ExternalActionsRequester: + return ExternalActionsRequester("http://test.com") + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "status_code,json_response,expected_success", + [ + (200, {"result": {"key": "value"}, "agent_message": "Success", "success": True}, True), + (400, {"detail": "Bad Request"}, False), + (401, {"detail": "Unauthorized"}, False), + (403, {"detail": "Forbidden"}, False), + (500, {"detail": "Server Error"}, False), + ], +) +async def test_send_request_responses( + httpx_mock: HTTPXMock, + status_code: int, + json_response: Dict[str, Any], + expected_success: bool, +) -> None: + url = "http://test.com" + httpx_mock.add_response(status_code=status_code, json=json_response, method="POST", url=url) + + requester = ExternalActionsRequester(url) + response = await requester.send_request( + JSON_SCHEMA, + base64.b64encode(os.urandom(32)).decode(), + additional_payload_values={"call_id": "call_id"}, + ) + + assert response.success is expected_success + + +@pytest.mark.asyncio +async def test_requester_encodes_signature_correctly(requester: ExternalActionsRequester): + payload = json.dumps({"test": "test"}).encode("utf-8") + signature_as_bytes = os.urandom(32) + signature = base64.b64encode(signature_as_bytes).decode() + + encoded_payload = requester._encode_payload(payload, signature) + decoded_digest = base64.b64decode(encoded_payload) + calculated_digest = hmac.new(signature_as_bytes, payload, hashlib.sha256).digest() + assert hmac.compare_digest(decoded_digest, calculated_digest) diff --git a/tests/streaming/action/test_record_email.py b/tests/streaming/action/test_record_email.py new file mode 100644 index 0000000000..1b66dc156c --- /dev/null +++ b/tests/streaming/action/test_record_email.py @@ -0,0 +1,77 @@ +import pytest +from tests.fakedata.id import generate_uuid + +from vocode.streaming.action.record_email import ( + RecordEmail, + RecordEmailParameters, + RecordEmailVocodeActionConfig, +) +from vocode.streaming.models.actions import ( + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.utils import create_conversation_id + +# id is just a description of the parameterized test case's input +EMAIL_TEST_CASES = [ + pytest.param("kian@vocode.dev", True, id="valid_email_with_dev"), + pytest.param("kian+tester@vocode.net", True, id="valid_email_with_plus_in_local_part"), + pytest.param("kian-tester@vocode.org", True, id="valid_email_with_dash_in_local_part"), + pytest.param("kian.vocode@dev.com", True, id="valid_email_with_dot_in_local_part"), + pytest.param("kian@vocode", False, id="missing_tld"), + pytest.param("kian", False, id="missing_at_and_tld"), + pytest.param("kian@", False, id="missing_domain"), + pytest.param("@vocode.dev", False, id="missing_local_part"), + pytest.param(".kian@vocode.dev", False, id="leading_dot_in_local_part"), + pytest.param("kian.@vocode.dev", False, id="trailing_dot_in_local_part"), + pytest.param("kian..tester@vocode.com", False, id="consecutive_dots_in_local_part"), + pytest.param("kian@vo..code.com", False, id="consecutive_dots_in_domain"), + pytest.param("kian@vocode.com.", False, id="trailing_dot_in_domain"), + pytest.param("ki'an@vocode.net", False, id="apostrophe_in_local_part"), + pytest.param("kian@vocode..org", False, id="consecutive_dots_in_tld"), + pytest.param("kian@.vocode.net", False, id="leading_dot_in_domain"), +] + + +@pytest.fixture +def record_email_action() -> RecordEmail: + return RecordEmail(action_config=RecordEmailVocodeActionConfig()) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("email_input,expected_success", EMAIL_TEST_CASES) +async def test_vonage_email_validation( + record_email_action: RecordEmail, email_input: str, expected_success: bool +): + vonage_uuid = generate_uuid() + res = await record_email_action.run( + action_input=VonagePhoneConversationActionInput( + action_config=RecordEmailVocodeActionConfig(), + conversation_id=create_conversation_id(), + params=RecordEmailParameters( + raw_value="", + formatted_value=email_input, + ), + vonage_uuid=str(vonage_uuid), + ), + ) + assert res.response.success == expected_success + + +@pytest.mark.asyncio +@pytest.mark.parametrize("email_input,expected_success", EMAIL_TEST_CASES) +async def test_twilio_email_validation( + record_email_action: RecordEmail, email_input: str, expected_success: bool +): + res = await record_email_action.run( + action_input=TwilioPhoneConversationActionInput( + action_config=RecordEmailVocodeActionConfig(), + conversation_id=create_conversation_id(), + params=RecordEmailParameters( + raw_value="", + formatted_value=email_input, + ), + twilio_sid="twilio_sid", + ), + ) + assert res.response.success == expected_success diff --git a/tests/streaming/action/test_transfer_call.py b/tests/streaming/action/test_transfer_call.py new file mode 100644 index 0000000000..59c6ea35ce --- /dev/null +++ b/tests/streaming/action/test_transfer_call.py @@ -0,0 +1,222 @@ +import asyncio +from typing import Any +from unittest.mock import MagicMock + +import aiohttp +import pytest +from aioresponses import aioresponses +from pytest_mock import MockerFixture +from tests.fakedata.id import generate_uuid + +from vocode.streaming.action.transfer_call import ( + TransferCallParameters, + TransferCallVocodeActionConfig, + TwilioTransferCall, + VonageTransferCall, +) +from vocode.streaming.models.actions import ( + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.models.events import Sender +from vocode.streaming.models.telephony import TwilioConfig, VonageConfig +from vocode.streaming.models.transcript import Message, Transcript +from vocode.streaming.utils import create_conversation_id +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, +) + +TRANSFER_PHONE_NUMBER = "12345678920" + + +@pytest.fixture +def mock_twilio_config(): + return TwilioConfig( + account_sid="account_sid", + auth_token="auth_token", + ) + + +@pytest.fixture +def mock_vonage_config(): + return VonageConfig( + api_key="api_key", + api_secret="api_secret", + application_id="application_id", + private_key="-----BEGIN PRIVATE KEY-----\nasdf\n-----END PRIVATE KEY-----", + ) + + +@pytest.fixture +def mock_twilio_phone_conversation(mock_twilio_config) -> MagicMock: + twilio_phone_conversation = MagicMock() + twilio_phone_conversation.twilio_config = mock_twilio_config + return twilio_phone_conversation + + +@pytest.fixture +def mock_vonage_phone_conversation(mock_vonage_config) -> MagicMock: + vonage_phone_conversation = MagicMock() + vonage_phone_conversation.vonage_config = mock_vonage_config + return vonage_phone_conversation + + +@pytest.fixture +def mock_twilio_conversation_state_manager( + mocker: Any, mock_twilio_phone_conversation: MagicMock +) -> TwilioPhoneConversationStateManager: + return TwilioPhoneConversationStateManager(mock_twilio_phone_conversation) + + +@pytest.fixture +def mock_vonage_conversation_state_manager( + mocker: Any, mock_vonage_phone_conversation: MagicMock +) -> VonagePhoneConversationStateManager: + return VonagePhoneConversationStateManager(mock_vonage_phone_conversation) + + +@pytest.mark.asyncio +async def test_twilio_transfer_call_succeeds( + mocker: Any, + mock_twilio_conversation_state_manager: TwilioPhoneConversationStateManager, + mock_twilio_phone_conversation: MagicMock, + mock_twilio_config: TwilioConfig, +): + action = TwilioTransferCall( + action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), + ) + user_message_tracker = asyncio.Event() + user_message_tracker.set() + action.attach_conversation_state_manager(mock_twilio_conversation_state_manager) + conversation_id = create_conversation_id() + + twilio_sid = "twilio_sid" + action_input = TwilioPhoneConversationActionInput( + action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), + conversation_id=conversation_id, + params=TransferCallParameters(), + twilio_sid=twilio_sid, + user_message_tracker=user_message_tracker, + ) + + mock_twilio_phone_conversation.transcript = Transcript(event_logs=[]) + + with aioresponses() as m: + m.post( + "https://api.twilio.com/2010-04-01/Accounts/{twilio_account_sid}/Calls/{twilio_call_sid}.json".format( + twilio_account_sid=mock_twilio_config.account_sid, + twilio_call_sid=twilio_sid, + ), + status=200, + ) + action_output = await action.run(action_input=action_input) + assert action_output.response.success, "Expected action response to be successful" + m.assert_called_once_with( + f"https://api.twilio.com/2010-04-01/Accounts/{mock_twilio_config.account_sid}/Calls/{twilio_sid}.json", + method="POST", + auth=aiohttp.BasicAuth( + login=mock_twilio_config.account_sid, + password=mock_twilio_config.auth_token, + ), + data={"Twiml": f"{TRANSFER_PHONE_NUMBER}"}, + ) + + +@pytest.mark.asyncio +async def test_twilio_transfer_call_fails_if_interrupted( + mocker: Any, + mock_twilio_conversation_state_manager: TwilioPhoneConversationStateManager, + mock_twilio_phone_conversation: MagicMock, +) -> None: + action = TwilioTransferCall( + action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), + ) + user_message_tracker = asyncio.Event() + user_message_tracker.set() + action.attach_conversation_state_manager(mock_twilio_conversation_state_manager) + conversation_id = create_conversation_id() + + inner_transfer_call_mock = mocker.patch( + "vocode.streaming.action.transfer_call.TwilioTransferCall.transfer_call", + autospec=True, + ) + + mock_twilio_phone_conversation.transcript = Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="Please hold while I transfer you", + is_end_of_turn=False, + ) + ] + ) + + action_input = TwilioPhoneConversationActionInput( + action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), + conversation_id=conversation_id, + params=TransferCallParameters(), + twilio_sid="twilio_sid", + user_message_tracker=user_message_tracker, + ) + + action_output = await action.run(action_input=action_input) + + assert inner_transfer_call_mock.call_count == 0, "Expected transfer_call to not be called" + assert not action_output.response.success, "Expected action response to be unsuccessful" + + +@pytest.mark.asyncio +async def test_vonage_transfer_call_inbound( + mocker: MockerFixture, + mock_env, + mock_vonage_conversation_state_manager: VonagePhoneConversationStateManager, +) -> None: + transfer_phone_number = "12345678920" + action = VonageTransferCall( + action_config=TransferCallVocodeActionConfig(phone_number=transfer_phone_number), + ) + + mocker.patch("vonage.Client._create_jwt_auth_string", return_value=b"asdf") + + vonage_uuid = generate_uuid() + + mock_vonage_conversation_state_manager._vonage_phone_conversation.direction = "inbound" + mock_vonage_conversation_state_manager._vonage_phone_conversation.to_phone = "1234567894" + mock_vonage_conversation_state_manager._vonage_phone_conversation.from_phone = "1234567895" + + conversation_id = create_conversation_id() + + action.attach_conversation_state_manager(mock_vonage_conversation_state_manager) + + user_message_tracker = asyncio.Event() + user_message_tracker.set() + + with aioresponses() as m: + m.put( + f"https://api.nexmo.com/v1/calls/{vonage_uuid}", + payload={}, + status=200, + ) + + action_input = VonagePhoneConversationActionInput( + action_config=TransferCallVocodeActionConfig(phone_number=transfer_phone_number), + conversation_id=conversation_id, + params=TransferCallParameters(), + vonage_uuid=str(vonage_uuid), + user_message_tracker=user_message_tracker, + ) + action_output = await action.run(action_input=action_input) + + assert action_output.response.success + assert action_output.action_type == "action_transfer_call" + + call = list(m.requests.values())[0][0] + + ncco = call.kwargs["json"]["destination"]["ncco"] + + assert ncco[0]["endpoint"][0]["number"] == transfer_phone_number + assert ( + ncco[0]["from"] + == mock_vonage_conversation_state_manager._vonage_phone_conversation.to_phone # if inbound, the agent number is the to_phone + ) diff --git a/tests/streaming/action/test_wait.py b/tests/streaming/action/test_wait.py new file mode 100644 index 0000000000..bea3acc9ac --- /dev/null +++ b/tests/streaming/action/test_wait.py @@ -0,0 +1,23 @@ +import pytest + +from vocode.streaming.action.wait import Wait, WaitParameters, WaitVocodeActionConfig +from vocode.streaming.models.actions import ActionInput +from vocode.streaming.utils import create_conversation_id + + +@pytest.mark.asyncio +async def test_wait_action_success_without_user_message_tracker(): + action_config = WaitVocodeActionConfig() + wait_action = Wait(action_config=action_config) + action_input = ActionInput[WaitParameters]( + action_config=action_config, + conversation_id=create_conversation_id(), + user_message_tracker=None, + params=WaitParameters(), + ) + + action_output = await wait_action.run(action_input) + + assert ( + action_output.response.success is True + ), "Expected the wait action to succeed without a user message tracker" diff --git a/tests/streaming/agent/test_base_agent.py b/tests/streaming/agent/test_base_agent.py new file mode 100644 index 0000000000..c6a0adb952 --- /dev/null +++ b/tests/streaming/agent/test_base_agent.py @@ -0,0 +1,179 @@ +import asyncio +from typing import List, Optional + +import pytest +from pytest_mock import MockerFixture + +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.agent.base_agent import ( + AgentResponse, + AgentResponseMessage, + BaseAgent, + GeneratedResponse, + TranscriptionAgentInput, +) +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.models.actions import EndOfTurn +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.transcriber import Transcription +from vocode.streaming.models.transcript import Transcript +from vocode.streaming.utils.state_manager import ConversationStateManager +from vocode.streaming.utils.worker import InterruptibleEvent + + +@pytest.fixture(autouse=True) +def mock_env(mocker: MockerFixture): + mocker.patch.dict( + "os.environ", + { + "OPENAI_API_KEY": "openai_api_key", + }, + ) + + +def _create_agent( + mocker: MockerFixture, + agent_config: ChatGPTAgentConfig, + transcript: Optional[Transcript] = None, + action_factory: Optional[AbstractActionFactory] = None, + conversation_state_manager: Optional[ConversationStateManager] = None, +) -> ChatGPTAgent: + agent = ChatGPTAgent(agent_config, action_factory=action_factory) + if transcript: + agent.attach_transcript(transcript) + else: + agent.attach_transcript(Transcript()) + if conversation_state_manager: + agent.attach_conversation_state_manager(conversation_state_manager) + else: + agent.attach_conversation_state_manager(mocker.MagicMock()) + return agent + + +async def _consume_until_end_of_turn(agent: BaseAgent, timeout: float = 0.1) -> List[AgentResponse]: + agent_responses = [] + try: + while True: + agent_response = await asyncio.wait_for(agent.output_queue.get(), timeout=timeout) + agent_responses.append(agent_response.payload) + if isinstance(agent_response.payload, AgentResponseMessage) and isinstance( + agent_response.payload.message, EndOfTurn + ): + break + except asyncio.TimeoutError: + pass + return agent_responses + + +def _send_transcription( + agent: BaseAgent, + transcription: Transcription, + agent_response_tracker: Optional[asyncio.Event] = None, + is_interruptible: bool = False, +): + agent.consume_nonblocking( + InterruptibleEvent( + payload=TranscriptionAgentInput( + conversation_id="conversation_id", transcription=transcription + ), + is_interruptible=is_interruptible, + ) + ) + + +def _send_action_output( + agent: BaseAgent, + action_output: str, + agent_response_tracker: Optional[asyncio.Event] = None, + is_interruptible: bool = False, +): + agent.consume_nonblocking( + InterruptibleEvent( + payload=action_output, + is_interruptible=is_interruptible, + agent_response_tracker=agent_response_tracker, + ) + ) + + +def _mock_generate_response( + mocker: MockerFixture, agent: BaseAgent, generated_responses: List[GeneratedResponse] +): + async def mock_generate_response(*args, **kwargs): + for response in generated_responses: + yield response + + mocker.patch.object(agent, "generate_response", mock_generate_response) + + +@pytest.mark.asyncio +async def test_generate_responses(mocker: MockerFixture): + agent_config = ChatGPTAgentConfig( + prompt_preamble="Have a pleasant conversation about life", + generate_responses=True, + ) + agent = _create_agent(mocker, agent_config) + _mock_generate_response( + mocker, + agent, + [ + GeneratedResponse( + message=BaseMessage(text="Hi, how are you doing today?"), is_interruptible=True + ) + ], + ) + _send_transcription( + agent, + Transcription(message="Hello?", confidence=1.0, is_final=True), + ) + agent.start() + agent_responses = await _consume_until_end_of_turn(agent) + agent.terminate() + + messages = [response.message for response in agent_responses] + + assert messages == [BaseMessage(text="Hi, how are you doing today?"), EndOfTurn()] + + +@pytest.mark.asyncio +async def test_generate_response(mocker: MockerFixture): + agent_config = ChatGPTAgentConfig( + prompt_preamble="Have a pleasant conversation about life", + generate_responses=True, + ) + agent = _create_agent(mocker, agent_config) + _mock_generate_response( + mocker, + agent, + [ + GeneratedResponse( + message=BaseMessage(text="Hi, how are you doing today?"), is_interruptible=True + ) + ], + ) + _send_transcription( + agent, + Transcription(message="Hello?", confidence=1.0, is_final=True), + ) + agent.start() + agent_responses = await _consume_until_end_of_turn(agent) + agent.terminate() + + messages = [response.message for response in agent_responses] + + assert messages == [BaseMessage(text="Hi, how are you doing today?"), EndOfTurn()] + + +@pytest.mark.asyncio +async def test_function_call(mocker: MockerFixture): + # TODO: assert that when we return a function call with a user message, it sends out a message alongside + # an end of turn with the same agent response tracker + pass + + +@pytest.mark.asyncio +async def test_action_response_agent_input(mocker: MockerFixture): + # TODO: assert that the canned response is optionally sent if the action is not quiet + # and that it goes through the normal flow when the action is not quiet + pass diff --git a/tests/streaming/agent/test_openai_utils.py b/tests/streaming/agent/test_openai_utils.py new file mode 100644 index 0000000000..4858c92943 --- /dev/null +++ b/tests/streaming/agent/test_openai_utils.py @@ -0,0 +1,303 @@ +from vocode.streaming.agent.openai_utils import format_openai_chat_messages_from_transcript +from vocode.streaming.models.actions import ( + ACTION_FINISHED_FORMAT_STRING, + ActionConfig, + ActionInput, + ActionOutput, + PhraseBasedActionTrigger, + PhraseBasedActionTriggerConfig, +) +from vocode.streaming.models.events import Sender +from vocode.streaming.models.transcript import ActionFinish, ActionStart, Message, Transcript + + +class WeatherActionConfig(ActionConfig, type="weather"): + pass + + +def create_fake_vocode_phrase_trigger(): + return PhraseBasedActionTrigger(config=PhraseBasedActionTriggerConfig(phrase_triggers=[])) + + +def test_format_openai_chat_messages_from_transcript(): + test_action_input_nophrase = ActionInput( + action_config=WeatherActionConfig(), + conversation_id="asdf", + params={}, + ) + test_action_input_phrase = ActionInput( + action_config=WeatherActionConfig(action_trigger=create_fake_vocode_phrase_trigger()), + conversation_id="asdf", + params={}, + ) + + test_cases = [ + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message( + sender=Sender.BOT, + text="How are you doing today?", + is_final=True, + ), + Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), + ] + ), + "gpt-3.5-turbo-0613", + None, + "prompt preamble", + ), + [ + {"role": "system", "content": "prompt preamble"}, + {"role": "assistant", "content": "Hello! How are you doing today?"}, + {"role": "user", "content": "I'm doing well, thanks!"}, + ], + ), + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message(sender=Sender.BOT, text="How are", is_final=False), + ] + ), + "gpt-3.5-turbo-0613", + None, + "prompt preamble", + ), + [ + {"role": "system", "content": "prompt preamble"}, + {"role": "assistant", "content": "Hello! How are-"}, + ], + ), + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message(sender=Sender.HUMAN, text="Hello, what's the weather like?"), + ActionStart( + action_type="weather", + action_input=test_action_input_nophrase, + ), + ActionFinish( + action_type="weather", + action_input=test_action_input_nophrase, + action_output=ActionOutput(action_type="weather", response={}), + ), + ] + ), + "gpt-3.5-turbo-0613", + None, + "some prompt", + ), + [ + {"role": "system", "content": "some prompt"}, + {"role": "assistant", "content": "Hello!"}, + { + "role": "user", + "content": "Hello, what's the weather like?", + }, + { + "role": "assistant", + "content": None, + "function_call": {"name": "weather", "arguments": "{}"}, + }, + { + "role": "function", + "name": "weather", + "content": ACTION_FINISHED_FORMAT_STRING.format( + action_name="weather", action_output="{}" + ), + }, + ], + ), + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message(sender=Sender.HUMAN, text="Hello, what's the weather like?"), + ActionStart( + action_type="weather", + action_input=test_action_input_phrase, + ), + ActionFinish( + action_type="weather", + action_input=test_action_input_phrase, + action_output=ActionOutput(action_type="weather", response={}), + ), + ] + ), + "gpt-3.5-turbo-0613", + None, + "some prompt", + ), + [ + {"role": "system", "content": "some prompt"}, + {"role": "assistant", "content": "Hello!"}, + { + "role": "user", + "content": "Hello, what's the weather like?", + }, + { + "role": "function", + "name": "weather", + "content": ACTION_FINISHED_FORMAT_STRING.format( + action_name="weather", action_output="{}" + ), + }, + ], + ), + ] + + for params, expected_output in test_cases: + assert format_openai_chat_messages_from_transcript(*params) == expected_output + + +def test_format_openai_chat_messages_from_transcript_context_limit(): + test_cases = [ + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message( + sender=Sender.BOT, + text="How are you doing today? I'm doing amazing thank you so much for asking!", + ), + Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), + ] + ), + "gpt-3.5-turbo-0613", + None, + "aaaa " * 1862, + ), + [ + {"role": "system", "content": "aaaa " * 1862}, + {"role": "user", "content": "I'm doing well, thanks!"}, + ], + ), + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!"), + Message( + sender=Sender.BOT, + text="How are you doing today? I'm doing amazing thank you so much for asking!", + is_final=True, + ), + Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), + Message(sender=Sender.BOT, text="aaaa " * 1862), + Message(sender=Sender.HUMAN, text="What? What did you just say???"), + Message( + sender=Sender.BOT, + text="My apologies, there was an error. Please ignore my previous message", + is_final=True, + ), + Message( + sender=Sender.HUMAN, + text="Don't worry I ignored all 1862 * 5 characters of it.", + ), + ] + ), + "gpt-3.5-turbo-0613", + None, + "prompt preamble", + ), + [ + {"role": "system", "content": "prompt preamble"}, + { + "content": "What? What did you just say???", + "role": "user", + }, + { + "role": "assistant", + "content": "My apologies, there was an error. Please ignore my previous message", + }, + { + "role": "user", + "content": "Don't worry I ignored all 1862 * 5 characters of it.", + }, + ], + ), + ] + + for params, expected_output in test_cases: + assert format_openai_chat_messages_from_transcript(*params) == expected_output + + +def test_format_openai_chat_messages_from_transcript_context_limit(): + test_cases = [ + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!", is_final=True), + Message( + sender=Sender.BOT, + text="How are you doing today? I'm doing amazing thank you so much for asking!", + ), + Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), + ] + ), + "gpt-3.5-turbo-0613", + None, + "aaaa " * 1862, + ), + [ + {"role": "system", "content": "aaaa " * 1862}, + {"role": "user", "content": "I'm doing well, thanks!"}, + ], + ), + ( + ( + Transcript( + event_logs=[ + Message(sender=Sender.BOT, text="Hello!"), + Message( + sender=Sender.BOT, + text="How are you doing today? I'm doing amazing thank you so much for asking!", + is_final=True, + ), + Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), + Message(sender=Sender.BOT, text="aaaa " * 1862), + Message(sender=Sender.HUMAN, text="What? What did you just say???"), + Message( + sender=Sender.BOT, + text="My apologies, there was an error. Please ignore my previous message", + is_final=True, + ), + Message( + sender=Sender.HUMAN, + text="Don't worry I ignored all 1862 * 5 characters of it.", + ), + ] + ), + "gpt-3.5-turbo-0613", + None, + "prompt preamble", + ), + [ + {"role": "system", "content": "prompt preamble"}, + { + "content": "What? What did you just say???", + "role": "user", + }, + { + "role": "assistant", + "content": "My apologies, there was an error. Please ignore my previous message", + }, + { + "role": "user", + "content": "Don't worry I ignored all 1862 * 5 characters of it.", + }, + ], + ), + ] + + for params, expected_output in test_cases: + assert format_openai_chat_messages_from_transcript(*params) == expected_output diff --git a/tests/streaming/agent/test_utils.py b/tests/streaming/agent/test_streaming_utils.py similarity index 71% rename from tests/streaming/agent/test_utils.py rename to tests/streaming/agent/test_streaming_utils.py index 1eb0f30e5c..db46c4a2a9 100644 --- a/tests/streaming/agent/test_utils.py +++ b/tests/streaming/agent/test_streaming_utils.py @@ -1,28 +1,17 @@ -from typing import Any, Dict, List, Optional, Union -from openai.openai_object import OpenAIObject -from pydantic.v1 import BaseModel -from vocode.streaming.models.actions import ( - ActionConfig, - ActionInput, - ActionOutput, - FunctionCall, -) +from typing import Any, AsyncGenerator, Dict, List, Optional, Union + import pytest -from vocode.streaming.agent.utils import ( - collate_response_async, - format_openai_chat_messages_from_transcript, - openai_get_tokens, -) -from vocode.streaming.models.events import Sender -from vocode.streaming.models.transcript import ( - ActionFinish, - ActionStart, - Message, - Transcript, -) +from openai.types.chat.chat_completion_chunk import ChatCompletionChunk +from pydantic.v1 import BaseModel + +from vocode.streaming.agent.openai_utils import openai_get_tokens +from vocode.streaming.agent.streaming_utils import collate_response_async +from vocode.streaming.models.actions import FunctionCall -async def _agen_from_list(l): +async def _agen_from_chunk_list( + l: List[ChatCompletionChunk], +) -> AsyncGenerator[ChatCompletionChunk, Any]: for item in l: yield item @@ -31,21 +20,30 @@ def create_chatgpt_openai_object( delta: Optional[Dict[str, str]] = None, finish_reason: Optional[Any] = None, prompt_annotations=None, -): - inner_obj = {} +) -> ChatCompletionChunk: + inner_obj = { + "id": "test_id", + "created": 1423143, + "model": "gpt-3.5-turbo-0613", + "object": "chat.completion.chunk", + "choices": [], + } if prompt_annotations: inner_obj["prompt_annotations"] = prompt_annotations inner_obj["choices"] = [] elif delta: - inner_obj["choices"] = [{"delta": delta, "finish_reason": finish_reason}] - return OpenAIObject.construct_from(inner_obj) + inner_obj["choices"] = [{"index": 0, "delta": delta, "finish_reason": finish_reason}] + return ChatCompletionChunk.parse_obj(inner_obj) class StreamOpenAIResponseTestCase(BaseModel): - openai_objects: List[OpenAIObject] + openai_objects: List[ChatCompletionChunk] expected_sentences: List[Union[str, FunctionCall]] get_functions: bool + class Config: + arbitrary_types_allowed = True + OPENAI_OBJECTS = [ [ @@ -233,11 +231,57 @@ class StreamOpenAIResponseTestCase(BaseModel): }, {"delta": {}, "finish_reason": "function_call"}, ], + [ + {"delta": {"role": "assistant"}, "finish_reason": None}, + {"delta": {"content": "Yes"}, "finish_reason": None}, + {"delta": {"content": "."}, "finish_reason": None}, + {"delta": {"content": " Hi"}, "finish_reason": None}, + {"delta": {"content": "."}, "finish_reason": None}, + {"delta": {"content": " Ok"}, "finish_reason": None}, + {"delta": {"content": "."}, "finish_reason": None}, + {"delta": {"content": " What"}, "finish_reason": None}, + {"delta": {"content": " is"}, "finish_reason": None}, + {"delta": {"content": " it"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {}, "finish_reason": "stop"}, + ], + [ + {"delta": {"role": "assistant"}, "finish_reason": None}, + {"delta": {"content": "Ok"}, "finish_reason": None}, + {"delta": {"content": " gotcha"}, "finish_reason": None}, + {"delta": {"content": "."}, "finish_reason": None}, + {"delta": {"content": " What"}, "finish_reason": None}, + {"delta": {"content": " is"}, "finish_reason": None}, + {"delta": {"content": " up"}, "finish_reason": None}, + {"delta": {"content": " man"}, "finish_reason": None}, + {"delta": {"content": "."}, "finish_reason": None}, + {"delta": {"content": " Nothing"}, "finish_reason": None}, + {"delta": {"content": " much"}, "finish_reason": None}, + {"delta": {"content": " how"}, "finish_reason": None}, + {"delta": {"content": " are"}, "finish_reason": None}, + {"delta": {"content": " you"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {}, "finish_reason": "stop"}, + ], + [ + {"delta": {"role": "assistant"}, "finish_reason": None}, + {"delta": {"content": "Hello"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {"content": " Yes"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {"content": " Hello"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {"content": "Is"}, "finish_reason": None}, + {"delta": {"content": " this"}, "finish_reason": None}, + {"delta": {"content": " Bob"}, "finish_reason": None}, + {"delta": {"content": "?"}, "finish_reason": None}, + {"delta": {}, "finish_reason": "stop"}, + ], ] EXPECTED_SENTENCES = [ - ["Hello!", "How are you doing today?"], - ["Hello.", "What do you want to talk about?"], + ["Hello! How are you doing today?"], + ["Hello. What do you want to talk about?"], ["This is a test sentence.", "Want to hear a joke?"], [ "Sure, here are three possible things we could talk about:", @@ -249,18 +293,15 @@ class StreamOpenAIResponseTestCase(BaseModel): "$1 + $3.20 is equal to $4.20.", "And $1.40 plus $2.80 is equal to $4.20 as well.", ], + ["$2 + $3.00 is equal to $5.", "$6 + $4 is equal to $10."], [ - "$2 + $3.00 is equal to $5.", - "$6 + $4 is equal to $10.", - ], - [ - "Hello.", - "What do you want to talk about", - FunctionCall(name="wave_hello", arguments='{\n "name": "user"\n}'), - ], - [ + "Hello. What do you want to talk about", FunctionCall(name="wave_hello", arguments='{\n "name": "user"\n}'), ], + [FunctionCall(name="wave_hello", arguments='{\n "name": "user"\n}')], + ["Yes. Hi. Ok. What is it?"], + ["Ok gotcha. What is up man.", "Nothing much how are you?"], + ["Hello? Yes? Hello?", "Is this Bob?"], ] FUNCTIONS_INPUT = [ @@ -313,130 +354,22 @@ class StreamOpenAIResponseTestCase(BaseModel): @pytest.mark.asyncio -async def test_collate_response_async(): +async def test_collate_response_async(mocker): test_cases = [ StreamOpenAIResponseTestCase( - openai_objects=[ - create_chatgpt_openai_object(**obj) for obj in openai_objects - ], + openai_objects=[create_chatgpt_openai_object(**obj) for obj in openai_objects], expected_sentences=expected_sentences, - get_functions=any( - isinstance(item, FunctionCall) for item in expected_sentences - ), - ) - for openai_objects, expected_sentences in zip( - OPENAI_OBJECTS, EXPECTED_SENTENCES + get_functions=any(isinstance(item, FunctionCall) for item in expected_sentences), ) + for openai_objects, expected_sentences in zip(OPENAI_OBJECTS, EXPECTED_SENTENCES) ] for test_case in test_cases: actual_sentences = [] async for sentence in collate_response_async( - openai_get_tokens(_agen_from_list(test_case.openai_objects)), + conversation_id="test", + gen=openai_get_tokens(_agen_from_chunk_list(test_case.openai_objects)), get_functions=test_case.get_functions, ): actual_sentences.append(sentence) assert actual_sentences == test_case.expected_sentences - - -def test_format_openai_chat_messages_from_transcript(): - test_cases = [ - ( - ( - Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="Hello!"), - Message(sender=Sender.BOT, text="How are you doing today?"), - Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), - ] - ), - "prompt preamble", - ), - [ - {"role": "system", "content": "prompt preamble"}, - {"role": "assistant", "content": "Hello! How are you doing today?"}, - {"role": "user", "content": "I'm doing well, thanks!"}, - ], - ), - ( - ( - Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="Hello!"), - Message(sender=Sender.BOT, text="How are you doing today?"), - Message(sender=Sender.HUMAN, text="I'm doing well, thanks!"), - ] - ), - None, - ), - [ - {"role": "assistant", "content": "Hello! How are you doing today?"}, - {"role": "user", "content": "I'm doing well, thanks!"}, - ], - ), - ( - ( - Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="Hello!"), - Message(sender=Sender.BOT, text="How are you doing today?"), - ] - ), - "prompt preamble", - ), - [ - {"role": "system", "content": "prompt preamble"}, - {"role": "assistant", "content": "Hello! How are you doing today?"}, - ], - ), - ( - ( - Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="Hello!"), - Message( - sender=Sender.HUMAN, text="Hello, what's the weather like?" - ), - ActionStart( - action_type="weather", - action_input=ActionInput( - action_config=ActionConfig(), - conversation_id="asdf", - params={}, - ), - ), - ActionFinish( - action_type="weather", - action_output=ActionOutput( - action_type="weather", response={} - ), - ), - ] - ), - None, - ), - [ - {"role": "assistant", "content": "Hello!"}, - { - "role": "user", - "content": "Hello, what's the weather like?", - }, - { - "role": "assistant", - "content": None, - "function_call": { - "name": "weather", - "arguments": "{}", - }, - }, - { - "role": "function", - "name": "weather", - "content": "{}", - }, - ], - ), - ] - - for params, expected_output in test_cases: - assert format_openai_chat_messages_from_transcript(*params) == expected_output diff --git a/tests/streaming/data/__init__.py b/tests/streaming/data/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/streaming/data/fake_audio.mp3 b/tests/streaming/data/fake_audio.mp3 deleted file mode 100644 index ecb1351d30c40a4c717aa6e52c19f18d6a20085b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11593 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 diff --git a/tests/streaming/data/fake_audio.wav b/tests/streaming/data/fake_audio.wav deleted file mode 100644 index 7104a18c4e2c021894240b328bbb8ca7ff3d2ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63564 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 SynthesisResult: - return self.create_synthesis_result_from_wav( - message=message, - chunk_size=chunk_size, - file=get_audio_path("fake_audio.wav"), - ) diff --git a/tests/streaming/fixtures/transcriber.py b/tests/streaming/fixtures/transcriber.py deleted file mode 100644 index a78e3de269..0000000000 --- a/tests/streaming/fixtures/transcriber.py +++ /dev/null @@ -1,26 +0,0 @@ -import asyncio - -import pytest -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, - Transcription, -) - - -class TestTranscriberConfig(TranscriberConfig, type="transcriber_test"): - __test__ = False - - -class TestAsyncTranscriber(BaseAsyncTranscriber): - __test__ = False - - async def _run_loop(self): - while True: - try: - self.output_queue.put_nowait( - Transcription(message="test", confidence=1, is_final=True) - ) - await asyncio.sleep(1) - except asyncio.CancelledError: - return diff --git a/tests/streaming/models/test_transcript.py b/tests/streaming/models/test_transcript.py deleted file mode 100644 index 39b1ae6698..0000000000 --- a/tests/streaming/models/test_transcript.py +++ /dev/null @@ -1,96 +0,0 @@ -import asyncio -from vocode.streaming.models.actions import ( - ActionInput, - ActionOutput, - TwilioPhoneCallActionInput, -) -from vocode.streaming.models.transcript import ActionStart, ActionFinish -from vocode.streaming.models.events import Sender -from vocode.streaming.models.transcript import Message -from vocode.streaming.models.transcript import Transcript -from vocode.streaming.action.nylas_send_email import ( - NylasSendEmailActionConfig, - NylasSendEmailParameters, - NylasSendEmailResponse, -) - - -def test_transcript_to_string(): - transcript = Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="What up"), - Message( - sender=Sender.HUMAN, - text="Send me an email you bot. My email is du@de.com", - ), - ActionStart( - action_type="action_nylas_send_email", - action_input=TwilioPhoneCallActionInput( - action_config=NylasSendEmailActionConfig(), - conversation_id="123", - params=NylasSendEmailParameters( - recipient_email="du@de.com", - body="What up", - subject="This is the bot", - ), - _user_message_tracker=asyncio.Event(), - twilio_sid="123", - ), - ), - ActionFinish( - action_type="action_nylas_send_email", - action_output=ActionOutput( - action_type="action_nylas_send_email", - response=NylasSendEmailResponse(success=True), - ), - ), - ] - ) - - assert ( - transcript.to_string() - == """BOT: What up -HUMAN: Send me an email you bot. My email is du@de.com -ACTION_WORKER: params={'recipient_email': 'du@de.com', 'body': 'What up', 'subject': 'This is the bot'} -ACTION_WORKER: action_type='action_nylas_send_email' response={'success': True}""" - ) - - -def test_transcript_to_string_no_phone_input(): - transcript = Transcript( - event_logs=[ - Message(sender=Sender.BOT, text="What up"), - Message( - sender=Sender.HUMAN, - text="Send me an email you bot. My email is du@de.com", - ), - ActionStart( - action_type="action_nylas_send_email", - action_input=ActionInput( - action_config=NylasSendEmailActionConfig(), - conversation_id="123", - params=NylasSendEmailParameters( - recipient_email="du@de.com", - body="What up", - subject="This is the bot", - ), - _user_message_tracker=asyncio.Event(), - ), - ), - ActionFinish( - action_type="action_nylas_send_email", - action_output=ActionOutput( - action_type="action_nylas_send_email", - response=NylasSendEmailResponse(success=True), - ), - ), - ] - ) - - assert ( - transcript.to_string() - == """BOT: What up -HUMAN: Send me an email you bot. My email is du@de.com -ACTION_WORKER: params={'recipient_email': 'du@de.com', 'body': 'What up', 'subject': 'This is the bot'} -ACTION_WORKER: action_type='action_nylas_send_email' response={'success': True}""" - ) diff --git a/tests/streaming/synthesizer/conftest.py b/tests/streaming/synthesizer/conftest.py new file mode 100644 index 0000000000..01a42f63d3 --- /dev/null +++ b/tests/streaming/synthesizer/conftest.py @@ -0,0 +1,26 @@ +import pytest + + +@pytest.fixture(scope="session") +def default_env_vars(default_env_vars: dict[str, str]) -> dict[str, str]: + """ + Extends the `default_env_vars` fixture specifically for the submodule. + + This fixture takes the session-scoped `default_env_vars` fixture from the parent conftest.py + and extends or overrides it with additional or modified environment variables specific to + the submodule. + + :param default_env_vars: The inherited `default_env_vars` fixture from the parent conftest. + :return: A modified dictionary of default environment variables for the submodule. + """ + submodule_env_vars = default_env_vars.copy() + + submodule_env_vars.update( + { + "VOCODE_PLAYHT_ON_PREM_ADDR": "test", + "BASE_URL": "test", + "CALL_SERVER_BASE_URL": "test2", + } + ) + + return submodule_env_vars diff --git a/tests/streaming/synthesizer/test_audio_cache.py b/tests/streaming/synthesizer/test_audio_cache.py new file mode 100644 index 0000000000..5bc9efc7c3 --- /dev/null +++ b/tests/streaming/synthesizer/test_audio_cache.py @@ -0,0 +1,61 @@ +import pytest +from fakeredis import FakeAsyncRedis, FakeServer +from pytest_mock import MockerFixture + +from vocode.streaming.utils.singleton import Singleton + + +@pytest.fixture(autouse=True) +def cleanup_singleton_audio_cache(): + from vocode.streaming.synthesizer.audio_cache import AudioCache + + if AudioCache in Singleton._instances: + del Singleton._instances[AudioCache] + yield + + +@pytest.mark.asyncio +async def test_set_and_get(mocker: MockerFixture): + from vocode.streaming.synthesizer.audio_cache import AudioCache + + fake_redis = FakeAsyncRedis() + + mocker.patch( + "vocode.streaming.synthesizer.audio_cache.initialize_redis_bytes", return_value=fake_redis + ) + + cache = await AudioCache.safe_create() + voice_identifier = "voice_id" + text = "text" + audio_data = b"chunk" + + assert await cache.get_audio(voice_identifier, text) is None + + await cache.set_audio(voice_identifier, text, audio_data) + assert await cache.get_audio(voice_identifier, text) == b"chunk" + + +@pytest.mark.asyncio +async def test_safe_create_set_and_get_disabled(mocker: MockerFixture): + from vocode.streaming.synthesizer.audio_cache import AudioCache + + # will fail the ping + server = FakeServer() + server.connected = False + + fake_redis = FakeAsyncRedis(server=server) + + mocker.patch( + "vocode.streaming.synthesizer.audio_cache.initialize_redis_bytes", return_value=fake_redis + ) + + cache = await AudioCache.safe_create() + voice_identifier = "voice_id" + text = "text" + audio_data = b"chunk" + + assert await cache.get_audio(voice_identifier, text) is None + + await cache.set_audio(voice_identifier, text, audio_data) + + assert await cache.get_audio(voice_identifier, text) is None diff --git a/tests/streaming/synthesizer/test_factory.py b/tests/streaming/synthesizer/test_factory.py new file mode 100644 index 0000000000..9ee262a161 --- /dev/null +++ b/tests/streaming/synthesizer/test_factory.py @@ -0,0 +1,87 @@ +from unittest.mock import MagicMock, patch + +from pyht import AsyncClient +from pyht.client import CongestionCtrl +from pytest_mock import MockerFixture + +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig +from vocode.streaming.synthesizer.default_factory import DefaultSynthesizerFactory + +DEFAULT_PARAMS = { + "sampling_rate": 16000, + "audio_encoding": AudioEncoding.LINEAR16, + "voice_id": "s3://manifest.json", +} + + +def test_get_play_ht_synthesizer_v2_or_v1(mocker: MockerFixture): + factory = DefaultSynthesizerFactory() + + v1_constructor = mocker.patch("vocode.streaming.synthesizer.default_factory.PlayHtSynthesizer") + v2_constructor = mocker.patch( + "vocode.streaming.synthesizer.default_factory.PlayHtSynthesizerV2" + ) + + factory.create_synthesizer( + PlayHtSynthesizerConfig(version="2", **DEFAULT_PARAMS.copy()), + ), + v2_constructor.assert_called_once() + v2_constructor.reset_mock() + + factory.create_synthesizer( + PlayHtSynthesizerConfig(version="1", **DEFAULT_PARAMS.copy()), + ) + v1_constructor.assert_called_once() + v1_constructor.reset_mock() + + factory.create_synthesizer( + PlayHtSynthesizerConfig(**DEFAULT_PARAMS.copy()), + ) + v2_constructor.assert_called_once() + + +def test_create_play_ht_synthesizer_on_prem(mocker: MockerFixture): + with patch( + "vocode.streaming.synthesizer.play_ht_synthesizer_v2.AsyncClient", + new_callable=MagicMock, + ) as MockOSClient: + MockOSClient.AdvancedOptions = AsyncClient.AdvancedOptions + + user_id = "user_id" + api_key = "api_key" + factory = DefaultSynthesizerFactory() + + factory.create_synthesizer( + PlayHtSynthesizerConfig( + version="2", **DEFAULT_PARAMS.copy(), user_id=user_id, api_key=api_key + ), + ) + + MockOSClient.assert_called_once_with(user_id=user_id, api_key=api_key) + + MockOSClient.reset_mock() + + factory.create_synthesizer( + PlayHtSynthesizerConfig( + version="2", + on_prem=True, + on_prem_provider="aws", + **DEFAULT_PARAMS.copy(), + user_id=user_id, + api_key=api_key + ), + ) + + advanced_options = AsyncClient.AdvancedOptions( + grpc_addr=None, + fallback_enabled=True, + congestion_ctrl=CongestionCtrl.STATIC_MAR_2023, + ) + + MockOSClient.assert_called_with( + user_id=user_id, + api_key=api_key, + advanced=advanced_options, + ) + MockOSClient.reset_mock() diff --git a/tests/streaming/test_streaming_conversation.py b/tests/streaming/test_streaming_conversation.py index bfc8ee25ad..e38b6efadc 100644 --- a/tests/streaming/test_streaming_conversation.py +++ b/tests/streaming/test_streaming_conversation.py @@ -1,51 +1,453 @@ import asyncio -import logging +from typing import List +from unittest.mock import MagicMock + import pytest -from tests.streaming.fixtures.output_device import SilentOutputDevice -from tests.streaming.fixtures.synthesizer import TestSynthesizer, TestSynthesizerConfig -from tests.streaming.fixtures.transcriber import ( - TestAsyncTranscriber, - TestTranscriberConfig, +from pydantic.v1 import BaseModel +from pytest_mock import MockerFixture +from tests.fakedata.conversation import ( + DEFAULT_CHAT_GPT_AGENT_CONFIG, + create_fake_agent, + create_fake_streaming_conversation, +) + +from vocode.streaming.models.actions import ActionInput +from vocode.streaming.models.agent import InterruptSensitivity +from vocode.streaming.models.events import Sender +from vocode.streaming.models.transcriber import Transcription +from vocode.streaming.models.transcript import ActionStart, Message, Transcript +from vocode.streaming.utils.worker import AsyncWorker + + +class ShouldIgnoreUtteranceTestCase(BaseModel): + transcript: Transcript + human_transcription: str + expected: bool + + +async def _consume_worker_output(worker: AsyncWorker, timeout: float = 0.1): + try: + return await asyncio.wait_for(worker.output_queue.get(), timeout=timeout) + except asyncio.TimeoutError: + return None + + +def test_interrupt_sensitivity(mocker: MockerFixture): + from vocode.streaming.streaming_conversation import StreamingConversation + + mock_instance = mocker.MagicMock(spec=StreamingConversation.TranscriptionsWorker) + mocker.patch.object( + mock_instance, + "is_transcription_backchannel", + wraps=StreamingConversation.TranscriptionsWorker.is_transcription_backchannel, + ) + mock_instance.conversation = mocker.MagicMock() + mock_instance.conversation.agent = mocker.MagicMock() + + mock_instance.conversation.agent.get_agent_config = mocker.MagicMock( + return_value=mocker.MagicMock(interrupt_sensitivity="high") + ) + + test_transcription = Transcription(message="test", confidence=1.0, is_final=True) + assert mock_instance.is_transcription_backchannel(mock_instance, test_transcription) is False + + mock_instance.conversation.agent.get_agent_config = mocker.MagicMock( + return_value=mocker.MagicMock(interrupt_sensitivity="low") + ) + assert mock_instance.is_transcription_backchannel(mock_instance, test_transcription) is True + + +@pytest.mark.parametrize( + "test_case", + [ + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[], + ), + human_transcription="hi", + expected=False, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=True, + is_end_of_turn=True, + ), + ], + ), + human_transcription="hi", + expected=False, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=False, + is_end_of_turn=False, + ), + ], + ), + human_transcription="one two three four", + expected=False, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=False, + is_end_of_turn=False, + ), + ], + ), + human_transcription="hello?", + expected=True, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=True, + is_end_of_turn=True, + ), + Message( + sender=Sender.HUMAN, + text="hi there", + ), + ], + ), + human_transcription="hello?", + expected=False, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=False, + ), + ActionStart( + action_type="action", + action_input=MagicMock(spec=ActionInput), + ), + ], + ), + human_transcription="hello?", + expected=True, + ), + ShouldIgnoreUtteranceTestCase( + transcript=Transcript( + event_logs=[ + Message( + sender=Sender.BOT, + text="hi there", + is_final=True, + is_end_of_turn=True, + ), + ActionStart( + action_type="action", + action_input=MagicMock(spec=ActionInput), + ), + ], + ), + human_transcription="hello?", + expected=False, + ), + ], ) -from vocode.streaming.agent.echo_agent import EchoAgent -from vocode.streaming.models.agent import EchoAgentConfig -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.streaming_conversation import StreamingConversation +def test_should_ignore_utterance( + mocker: MockerFixture, + test_case: ShouldIgnoreUtteranceTestCase, +): + from vocode.streaming.streaming_conversation import StreamingConversation + + conversation = mocker.MagicMock() + transcriptions_worker = StreamingConversation.TranscriptionsWorker( + input_queue=mocker.MagicMock(), + output_queue=mocker.MagicMock(), + conversation=conversation, + interruptible_event_factory=mocker.MagicMock(), + ) + conversation = mocker.MagicMock() + conversation.interrupt_sensitivity = "low" + transcriptions_worker.has_associated_ignored_utterance = False + + transcriptions_worker.conversation.transcript = test_case.transcript + assert ( + transcriptions_worker.should_ignore_utterance( + Transcription(message=test_case.human_transcription, confidence=1.0, is_final=True), + ) + == test_case.expected + ) + + +class TranscriptionsWorkerTestCase(BaseModel): + transcriptions: List[Transcription] + transcript: Transcript + should_broadcast_interrupt: bool + initial_message_ongoing: bool + should_kick_off_pipeline: bool + interrupt_sensitivity: InterruptSensitivity + + +async def _mock_streaming_conversation_constructor( + mocker: MockerFixture, + interrupt_sensitivity: InterruptSensitivity = "low", +): + + streaming_conversation = create_fake_streaming_conversation( + mocker, + agent=create_fake_agent( + mocker, + DEFAULT_CHAT_GPT_AGENT_CONFIG.copy( + update={"interrupt_sensitivity": interrupt_sensitivity} + ), + ), + ) + streaming_conversation.broadcast_interrupt = mocker.MagicMock( + wraps=streaming_conversation.broadcast_interrupt + ) + return streaming_conversation + + +@pytest.mark.asyncio +async def test_transcriptions_worker_ignores_utterances_before_initial_message( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor( + mocker, + ) + + streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.start() + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="sup", + confidence=1.0, + is_final=True, + ), + ) + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="hi, who is", + confidence=1.0, + is_final=False, + ), + ) + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="hi, who is calling?", + confidence=1.0, + is_final=True, + ), + ) + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert not streaming_conversation.broadcast_interrupt.called + + streaming_conversation.transcript.add_bot_message( + text="hi there", is_final=True, conversation_id="test" + ) + streaming_conversation.initial_message_tracker.set() + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="hi, who is this?", + confidence=1.0, + is_final=True, + ), + ) + + transcription_agent_input = await _consume_worker_output( + streaming_conversation.transcriptions_worker + ) + assert transcription_agent_input.payload.transcription.message == "hi, who is this?" + assert streaming_conversation.broadcast_interrupt.called -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) + assert streaming_conversation.transcript.event_logs[0].sender == Sender.BOT + + human_backchannels = streaming_conversation.transcript.event_logs[1:] + assert all( + backchannel.sender == Sender.HUMAN and backchannel.is_backchannel + for backchannel in human_backchannels + ) + streaming_conversation.transcriptions_worker.terminate() + + +@pytest.mark.asyncio +async def test_transcriptions_worker_ignores_associated_ignored_utterance( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor( + mocker, + ) + + streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.start() + streaming_conversation.initial_message_tracker.set() + streaming_conversation.transcript.add_bot_message( + text="Hi, I was wondering", + is_final=False, + conversation_id="test", + ) + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="i'm listening", + confidence=1.0, + is_final=False, + ), + ) + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert not streaming_conversation.broadcast_interrupt.called # ignored for length of response + + streaming_conversation.transcript.event_logs[-1].text = ( + "Hi, I was wondering if you had a chance to look at my email?" + ) + streaming_conversation.transcript.event_logs[-1].is_final = True + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="I'm listening.", + confidence=1.0, + is_final=True, + ), + ) + + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert not streaming_conversation.broadcast_interrupt.called # ignored for length of response + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="I have not yet gotten a chance.", + confidence=1.0, + is_final=True, + ), + ) + + transcription_agent_input = await _consume_worker_output( + streaming_conversation.transcriptions_worker + ) + assert ( + transcription_agent_input.payload.transcription.message == "I have not yet gotten a chance." + ) + assert streaming_conversation.broadcast_interrupt.called + assert [message.text for message in streaming_conversation.transcript.event_logs] == [ + "Hi, I was wondering if you had a chance to look at my email?", + "I'm listening.", + ] + assert streaming_conversation.transcript.event_logs[-1].is_backchannel + streaming_conversation.transcriptions_worker.terminate() @pytest.mark.asyncio -async def test_streaming_conversation(): - sampling_rate = 16000 - audio_encoding = AudioEncoding.LINEAR16 - chunk_size = 2048 - silent_output_device = SilentOutputDevice( - sampling_rate=sampling_rate, audio_encoding=audio_encoding - ) - - conversation = StreamingConversation( - output_device=silent_output_device, - transcriber=TestAsyncTranscriber( - TestTranscriberConfig( - sampling_rate=sampling_rate, - audio_encoding=audio_encoding, - chunk_size=chunk_size, - ) - ), - agent=EchoAgent( - EchoAgentConfig( - initial_message=BaseMessage(text="test"), - ) - ), - synthesizer=TestSynthesizer( - TestSynthesizerConfig.from_output_device(silent_output_device) - ), - logger=logger, - ) - await conversation.start() - await asyncio.sleep(1) - await conversation.terminate() +async def test_transcriptions_worker_interrupts_on_interim_transcripts( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor( + mocker, + ) + + streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.start() + streaming_conversation.initial_message_tracker.set() + streaming_conversation.transcript.add_bot_message( + text="Hi, I was wondering", + is_final=False, + conversation_id="test", + ) + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="Sorry, could you stop", + confidence=1.0, + is_final=False, + ), + ) + + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert streaming_conversation.broadcast_interrupt.called + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="Sorry, could you stop talking please?", + confidence=1.0, + is_final=True, + ), + ) + + transcription_agent_input = await _consume_worker_output( + streaming_conversation.transcriptions_worker + ) + assert ( + transcription_agent_input.payload.transcription.message + == "Sorry, could you stop talking please?" + ) + + assert streaming_conversation.transcript.event_logs[-1].sender == Sender.BOT + assert streaming_conversation.transcript.event_logs[-1].text == "Hi, I was wondering" + streaming_conversation.transcriptions_worker.terminate() + + +@pytest.mark.asyncio +async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun_turn( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor( + mocker, + ) + + streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() + streaming_conversation.transcriptions_worker.start() + streaming_conversation.initial_message_tracker.set() + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="Sorry,", + confidence=1.0, + is_final=False, + ), + ) + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert streaming_conversation.broadcast_interrupt.called + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="Sorry, what?", + confidence=1.0, + is_final=True, + ), + ) + transcription_agent_input = await _consume_worker_output( + streaming_conversation.transcriptions_worker + ) + assert transcription_agent_input.payload.transcription.message == "Sorry, what?" + assert streaming_conversation.broadcast_interrupt.called + + streaming_conversation.transcript.add_bot_message( + text="", is_final=False, conversation_id="test" + ) + + streaming_conversation.transcriptions_worker.consume_nonblocking( + Transcription( + message="Couldn't", + confidence=1.0, + is_final=False, + ), + ) + + assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert streaming_conversation.broadcast_interrupt.called + + streaming_conversation.transcriptions_worker.terminate() diff --git a/tests/streaming/utils/test_events_manager.py b/tests/streaming/utils/test_events_manager.py index d6bfaf4aba..75cb02f32f 100644 --- a/tests/streaming/utils/test_events_manager.py +++ b/tests/streaming/utils/test_events_manager.py @@ -1,7 +1,8 @@ -import pytest import asyncio -from vocode.streaming.models.events import PhoneCallEndedEvent, EventType +import pytest + +from vocode.streaming.models.events import EventType, PhoneCallEndedEvent from vocode.streaming.utils.events_manager import EventsManager CONVERSATION_ID = "1" @@ -34,6 +35,21 @@ async def test_handle_event_default_implementation(): await manager.handle_event(event) +@pytest.mark.asyncio +async def test_handle_event_non_async_override(mocker): + event = PhoneCallEndedEvent(conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED) + manager = EventsManager([EventType.PHONE_CALL_ENDED]) + manager.publish_event(event) + + error_logger_mock = mocker.patch("vocode.streaming.utils.events_manager.logger.error") + manager.handle_event = lambda event: None + await manager.flush() + assert manager.queue.empty() + error_logger_mock.assert_called_once_with( + "Handle event was overridden with non-async function. Please override with async function." + ) + + @pytest.mark.asyncio async def test_start_and_active_loop(): event = PhoneCallEndedEvent( @@ -48,18 +64,16 @@ async def test_start_and_active_loop(): @pytest.mark.asyncio async def test_flush_method(): - event = PhoneCallEndedEvent( - conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED - ) + event = PhoneCallEndedEvent(conversation_id=CONVERSATION_ID, type=EventType.PHONE_CALL_ENDED) manager = EventsManager([EventType.PHONE_CALL_ENDED]) for _ in range(5): manager.publish_event(event) - await manager.flush(timeout=2) + await manager.flush() assert manager.queue.empty() @pytest.mark.asyncio async def test_queue_empty_and_timeout(): manager = EventsManager([EventType.TRANSCRIPT]) - await manager.flush(timeout=0) + await manager.flush() assert manager.queue.empty() diff --git a/tests/streaming/utils/test_phone_numbers.py b/tests/streaming/utils/test_phone_numbers.py new file mode 100644 index 0000000000..3edfdd9fc3 --- /dev/null +++ b/tests/streaming/utils/test_phone_numbers.py @@ -0,0 +1,49 @@ +import re + +import pytest + +from vocode.streaming.utils.phone_numbers import NUMBER_PARSE_ERROR, sanitize_phone_number + + +def test_sanitize_phone_number_valid_number_without_region(): + phone = "14155552671" # This is a valid US number + expected_result = "14155552671" + result = sanitize_phone_number(phone) + assert result == expected_result + + +def test_sanitize_phone_number_valid_number_with_plus(): + phone = "+14155552671" + expected_result = "14155552671" + result = sanitize_phone_number(phone) + assert result == expected_result + + +def test_sanitize_phone_number_invalid_number_without_region(): + phone = "gibberish" + with pytest.raises(ValueError, match=re.escape(NUMBER_PARSE_ERROR)): + sanitize_phone_number(phone) + + +def test_sanitize_phone_number_invalid_number_with_region(): + phone = "+1911" + with pytest.raises(ValueError, match=re.escape(NUMBER_PARSE_ERROR)): + sanitize_phone_number(phone) + + +def test_sanitize_phone_number_valid_number_with_non_us_region(): + phone = "+443031237301" # This is a valid GB number for Buckingham Palace + expected_result = "443031237301" + result = sanitize_phone_number(phone) + assert result == expected_result + + # test same number with no + + result = sanitize_phone_number(phone[1:]) + assert result == expected_result + + +def test_sanitize_phone_number_adds_country_code(): + phone = "4155552222" + expected_result = "14155552222" + result = sanitize_phone_number(phone) + assert result == expected_result diff --git a/tests/streaming/utils/test_utils.py b/tests/streaming/utils/test_utils.py new file mode 100644 index 0000000000..04c7575df5 --- /dev/null +++ b/tests/streaming/utils/test_utils.py @@ -0,0 +1,54 @@ +import pytest + +from vocode.streaming.utils import generate_from_async_iter_with_lookahead, generate_with_is_last + + +@pytest.mark.asyncio +async def test_generate_with_is_last(): + async def async_gen(): + yield 1 + yield 2 + yield 3 + + async_iter = generate_with_is_last(async_gen()).__aiter__() + + assert await async_iter.__anext__() == (1, False) + assert await async_iter.__anext__() == (2, False) + assert await async_iter.__anext__() == (3, True) + + +@pytest.mark.asyncio +async def test_generate_with_lookahead_long(): + async def async_gen(): + yield 1 + yield 2 + yield 3 + yield 4 + yield 5 + + async_iter = generate_from_async_iter_with_lookahead(async_gen(), 2).__aiter__() + + expected_gen = [ + [1, 2, 3], + [2, 3, 4], + [3, 4, 5], + ] + idx = 0 + async for buffer in async_iter: + assert buffer == expected_gen[idx] + idx += 1 + + +@pytest.mark.asyncio +async def test_generate_with_lookahead_short(): + async def async_gen(): + yield 1 + yield 2 + + async_iter = generate_from_async_iter_with_lookahead(async_gen(), 2).__aiter__() + + expected_gen = [[1, 2]] + idx = 0 + async for buffer in async_iter: + assert buffer == expected_gen[idx] + idx += 1 diff --git a/tests/synthesizer/conftest.py b/tests/synthesizer/conftest.py deleted file mode 100644 index 2a09b36d26..0000000000 --- a/tests/synthesizer/conftest.py +++ /dev/null @@ -1,128 +0,0 @@ -import pytest -from aioresponses import aioresponses, CallbackResult -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.synthesizer import ( - ElevenLabsSynthesizerConfig, - PlayHtSynthesizerConfig, -) -import re -from vocode.streaming.synthesizer.eleven_labs_synthesizer import ( - ElevenLabsSynthesizer, - ELEVEN_LABS_BASE_URL, -) -from vocode.streaming.synthesizer.play_ht_synthesizer import ( - PlayHtSynthesizer, - TTS_ENDPOINT, -) - -import re -from tests.streaming.data.loader import get_audio_path - -import asyncio -import pytest - -DEFAULT_PARAMS = {"sampling_rate": 16000, "audio_encoding": AudioEncoding.LINEAR16} - -MOCK_API_KEY = "my_api_key" -MOCK_USER_ID = "my_user_id" - - -def create_eleven_labs_request_handler(optimize_streaming_latency=False): - def request_handler(url, headers, **kwargs): - if optimize_streaming_latency and not re.search( - r"optimize_streaming_latency=\d", url - ): - raise Exception("optimize_streaming_latency not found in url") - if headers["xi-api-key"] != MOCK_API_KEY: - return CallbackResult(status=401) - with open(get_audio_path("fake_audio.mp3"), "rb") as audio_file: - return CallbackResult(content_type="audio/mpeg", body=audio_file.read()) - - return request_handler - - -@pytest.fixture -def mock_eleven_labs_api(): - with aioresponses() as m: - pattern = re.compile(rf"{re.escape(ELEVEN_LABS_BASE_URL)}text-to-speech/\w+") - m.post(pattern, callback=create_eleven_labs_request_handler()) - yield m - - -@pytest.fixture(scope="module") -async def fixture_eleven_labs_synthesizer_with_api_key(): - params = DEFAULT_PARAMS.copy() - params["api_key"] = MOCK_API_KEY - return ElevenLabsSynthesizer(ElevenLabsSynthesizerConfig(**params)) - - -@pytest.fixture(scope="module") -async def fixture_eleven_labs_synthesizer_wrong_api_key(): - params = DEFAULT_PARAMS.copy() - params["api_key"] = "wrong_api_key" - return ElevenLabsSynthesizer(ElevenLabsSynthesizerConfig(**params)) - - -@pytest.fixture(scope="module") -async def fixture_eleven_labs_synthesizer_env_api_key(): - params = DEFAULT_PARAMS.copy() - import os - - os.environ["ELEVEN_LABS_API_KEY"] = MOCK_API_KEY - return ElevenLabsSynthesizer(ElevenLabsSynthesizerConfig(**params)) - - -# PlayHT Setup - - -def create_play_ht_request_handler(): - def request_handler(url, headers, **kwargs): - if headers["AUTHORIZATION"] != f"Bearer {MOCK_API_KEY}": - return CallbackResult(status=401) - if headers["X-USER-ID"] != MOCK_USER_ID: - return CallbackResult(status=401) - with open(get_audio_path("fake_audio.mp3"), "rb") as audio_file: - return CallbackResult(content_type="audio/mpeg", body=audio_file.read()) - - return request_handler - - -@pytest.fixture -def mock_play_ht_api(): - with aioresponses() as m: - m.post(TTS_ENDPOINT, callback=create_play_ht_request_handler()) - yield m - - -@pytest.fixture(scope="module") -async def fixture_play_ht_synthesizer_with_api_key(): - params = DEFAULT_PARAMS.copy() - params["api_key"] = MOCK_API_KEY - params["user_id"] = MOCK_USER_ID - return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) - - -@pytest.fixture(scope="module") -async def fixture_play_ht_synthesizer_wrong_api_key(): - params = DEFAULT_PARAMS.copy() - params["api_key"] = "wrong_api_key" - params["user_id"] = MOCK_USER_ID - return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) - - -@pytest.fixture(scope="module") -async def fixture_play_ht_synthesizer_wrong_user_id(): - params = DEFAULT_PARAMS.copy() - params["api_key"] = MOCK_API_KEY - params["user_id"] = "wrong_api_key" - return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) - - -@pytest.fixture(scope="module") -async def fixture_play_ht_synthesizer_env_api_key(): - params = DEFAULT_PARAMS.copy() - import os - - os.environ["PLAY_HT_API_KEY"] = MOCK_API_KEY - os.environ["PLAY_HT_USER_ID"] = MOCK_USER_ID - return PlayHtSynthesizer(PlayHtSynthesizerConfig(**params)) diff --git a/tests/synthesizer/test_eleven_labs.py b/tests/synthesizer/test_eleven_labs.py deleted file mode 100644 index 24304d19b0..0000000000 --- a/tests/synthesizer/test_eleven_labs.py +++ /dev/null @@ -1,51 +0,0 @@ -import asyncio -from pydantic import ValidationError -import pytest -from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult -from vocode.streaming.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer -from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig -from aioresponses import aioresponses -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.audio_encoding import AudioEncoding -from pydub import AudioSegment - - -async def assert_synthesis_result_valid(synthesizer: ElevenLabsSynthesizer): - response = await synthesizer.create_speech(BaseMessage(text="Hello, world!"), 1024) - assert isinstance(response, SynthesisResult) - assert response.chunk_generator is not None - audio = AudioSegment.empty() - async for chunk in response.chunk_generator: - audio += AudioSegment( - chunk.chunk, - frame_rate=synthesizer.synthesizer_config.sampling_rate, - sample_width=2, - channels=1, - ) - - -@pytest.mark.asyncio -async def test_with_api_key( - fixture_eleven_labs_synthesizer_with_api_key: ElevenLabsSynthesizer, - mock_eleven_labs_api: aioresponses, -): - await assert_synthesis_result_valid(await fixture_eleven_labs_synthesizer_with_api_key) - - -@pytest.mark.asyncio -async def test_with_wrong_api_key( - fixture_eleven_labs_synthesizer_wrong_api_key: ElevenLabsSynthesizer, - mock_eleven_labs_api: aioresponses, -): - with pytest.raises(Exception, match="ElevenLabs API returned 401 status code"): - await (await fixture_eleven_labs_synthesizer_wrong_api_key).create_speech( - BaseMessage(text="Hello, world!"), 1024 - ) - - -@pytest.mark.asyncio -async def test_with_env_api_key( - fixture_eleven_labs_synthesizer_env_api_key: ElevenLabsSynthesizer, - mock_eleven_labs_api: aioresponses, -): - await assert_synthesis_result_valid(await fixture_eleven_labs_synthesizer_env_api_key) diff --git a/tests/synthesizer/test_play_ht.py b/tests/synthesizer/test_play_ht.py deleted file mode 100644 index 59b78cfebb..0000000000 --- a/tests/synthesizer/test_play_ht.py +++ /dev/null @@ -1,61 +0,0 @@ -import asyncio - -from aioresponses import aioresponses -from pydub import AudioSegment -import pytest - -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult -from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer - - -async def assert_synthesis_result_valid(synthesizer: PlayHtSynthesizer): - response = await synthesizer.create_speech(BaseMessage(text="Hello, world!"), 1024) - assert isinstance(response, SynthesisResult) - assert response.chunk_generator is not None - audio = AudioSegment.empty() - async for chunk in response.chunk_generator: - audio += AudioSegment( - chunk.chunk, - frame_rate=synthesizer.synthesizer_config.sampling_rate, - sample_width=2, - channels=1, - ) - - -@pytest.mark.asyncio -async def test_with_api_key( - fixture_play_ht_synthesizer_with_api_key: PlayHtSynthesizer, - mock_play_ht_api: aioresponses, -): - await assert_synthesis_result_valid(await fixture_play_ht_synthesizer_with_api_key) - - -@pytest.mark.asyncio -async def test_with_wrong_api_key( - fixture_play_ht_synthesizer_wrong_api_key: PlayHtSynthesizer, - mock_play_ht_api: aioresponses, -): - with pytest.raises(Exception, match="Play.ht API error status code 401"): - await (await fixture_play_ht_synthesizer_wrong_api_key).create_speech( - BaseMessage(text="Hello, world!"), 1024 - ) - -@pytest.mark.asyncio -async def test_with_wrong_user_id( - fixture_play_ht_synthesizer_wrong_user_id: PlayHtSynthesizer, - mock_play_ht_api: aioresponses, -): - with pytest.raises(Exception, match="Play.ht API error status code 401"): - await (await fixture_play_ht_synthesizer_wrong_user_id).create_speech( - BaseMessage(text="Hello, world!"), 1024 - ) - - - -@pytest.mark.asyncio -async def test_with_env_api_key( - fixture_play_ht_synthesizer_env_api_key: PlayHtSynthesizer, - mock_play_ht_api: aioresponses, -): - await assert_synthesis_result_valid(await fixture_play_ht_synthesizer_env_api_key) diff --git a/vocode/__init__.py b/vocode/__init__.py index b2c8af7b07..c895c2e458 100644 --- a/vocode/__init__.py +++ b/vocode/__init__.py @@ -1,7 +1,69 @@ import os +from contextvars import ContextVar, Token +from typing import Any +from uuid import UUID +import sentry_sdk +from loguru import logger + +from vocode.meta import ensure_punkt_installed environment = {} +logger.disable("vocode") + +ensure_punkt_installed() + + +class ContextWrapper: + """Context Variable Wrapper.""" + + _instances: list = [] + + def __init__(self, value: ContextVar) -> None: + self.__value: ContextVar = value + self.__token: Token + ContextWrapper._instances.append(self) + + def set(self, value: Any) -> Token: + """Set a context variable.""" + self.__token = self.__value.set(value) + if isinstance(value, str): + sentry_sdk.set_tag(self.__value.name, value) + if isinstance(value, UUID): + sentry_sdk.set_tag(self.__value.name, str(value)) + + return self.__token + + def reset(self, token: Token | None = None) -> None: + """Reset a context variable.""" + if not hasattr(self, "__token"): + return + + if not token: + token = self.__token + self.__value.reset(token) + return + + def __module__(self) -> Any: # type: ignore + return self.__value.get() + + @property + def value(self) -> Any: + """Gets the value of a context variable.""" + return self.__value.get() + + @classmethod + def serialize_instances(cls) -> dict: + """Gathers all instances of ContextWrapper.""" + instances = {} + for instance in cls._instances: + value = instance.__value.get() + if isinstance(value, UUID): + value = str(value) + + if isinstance(value, str): + instances[instance.__value.name] = value + return instances def setenv(**kwargs): @@ -15,3 +77,10 @@ def getenv(key, default=None): api_key = getenv("VOCODE_API_KEY") base_url = getenv("VOCODE_BASE_URL", "api.vocode.dev") + + +conversation_id: ContextWrapper = ContextWrapper( + ContextVar("conversation_id", default=None), +) +sentry_span_tags: ContextWrapper = ContextWrapper(ContextVar("sentry_span_tags", default=None)) +get_serialized_ctx_wrappers = ContextWrapper.serialize_instances diff --git a/vocode/helpers.py b/vocode/helpers.py index ac95014ffc..c7088f64d4 100644 --- a/vocode/helpers.py +++ b/vocode/helpers.py @@ -1,31 +1,27 @@ -from typing import List, Optional, Tuple, Union import typing +from typing import List, Optional, Tuple, Union + import sounddevice as sd +from loguru import logger + from vocode.streaming.input_device.microphone_input import ( MicrophoneInput as StreamingMicrophoneInput, ) from vocode.streaming.output_device.blocking_speaker_output import ( BlockingSpeakerOutput as BlockingStreamingSpeakerOutput, ) -from vocode.streaming.output_device.speaker_output import ( - SpeakerOutput as StreamingSpeakerOutput, -) +from vocode.streaming.output_device.speaker_output import SpeakerOutput as StreamingSpeakerOutput from vocode.turn_based.input_device.microphone_input import ( MicrophoneInput as TurnBasedMicrophoneInput, ) -from vocode.turn_based.output_device.speaker_output import ( - SpeakerOutput as TurnBasedSpeakerOutput, -) -import logging +from vocode.turn_based.output_device.speaker_output import SpeakerOutput as TurnBasedSpeakerOutput def _get_device_prompt(device_infos: List[dict]) -> str: return """Please select a device: {} Choice: """.format( - "\n".join( - f"{index}: {device['name']}" for index, device in enumerate(device_infos) - ) + "\n".join(f"{index}: {device['name']}" for index, device in enumerate(device_infos)) ) @@ -36,7 +32,6 @@ def create_streaming_microphone_input_and_speaker_output( mic_sampling_rate=None, speaker_sampling_rate=None, use_blocking_speaker_output=False, - logger: Optional[logging.Logger] = None, ): return _create_microphone_input_and_speaker_output( microphone_class=StreamingMicrophoneInput, @@ -50,7 +45,6 @@ def create_streaming_microphone_input_and_speaker_output( output_device_name=output_device_name, mic_sampling_rate=mic_sampling_rate, speaker_sampling_rate=speaker_sampling_rate, - logger=logger, ) @@ -60,7 +54,6 @@ def create_turn_based_microphone_input_and_speaker_output( output_device_name: Optional[str] = None, mic_sampling_rate=None, speaker_sampling_rate=None, - logger: Optional[logging.Logger] = None, ): return _create_microphone_input_and_speaker_output( microphone_class=TurnBasedMicrophoneInput, @@ -70,14 +63,11 @@ def create_turn_based_microphone_input_and_speaker_output( output_device_name=output_device_name, mic_sampling_rate=mic_sampling_rate, speaker_sampling_rate=speaker_sampling_rate, - logger=logger, ) def _create_microphone_input_and_speaker_output( - microphone_class: typing.Type[ - Union[StreamingMicrophoneInput, TurnBasedMicrophoneInput] - ], + microphone_class: typing.Type[Union[StreamingMicrophoneInput, TurnBasedMicrophoneInput]], speaker_class: typing.Type[ Union[ StreamingSpeakerOutput, @@ -90,7 +80,6 @@ def _create_microphone_input_and_speaker_output( output_device_name: Optional[str], mic_sampling_rate=None, speaker_sampling_rate=None, - logger: Optional[logging.Logger] = None, ) -> Union[ Tuple[ StreamingMicrophoneInput, @@ -111,42 +100,32 @@ def _create_microphone_input_and_speaker_output( output_device_info = sd.query_devices(kind="output") else: if input_device_name is not None: - input_device_info = _find_device_with_name( - input_device_infos, input_device_name - ) + input_device_info = _find_device_with_name(input_device_infos, input_device_name) else: input_device_info = input_device_infos[ int(input(_get_device_prompt(input_device_infos))) ] if output_device_name is not None: - output_device_info = _find_device_with_name( - output_device_infos, output_device_name - ) + output_device_info = _find_device_with_name(output_device_infos, output_device_name) else: output_device_info = output_device_infos[ int(input(_get_device_prompt(output_device_infos))) ] if logger is not None: - logger.info("Using microphone input device: %s", input_device_info["name"]) + logger.info(f"Using microphone input device: {input_device_info['name']}") - microphone_input = microphone_class( - input_device_info, sampling_rate=mic_sampling_rate - ) + microphone_input = microphone_class(input_device_info, sampling_rate=mic_sampling_rate) if logger is not None: - logger.info("Using speaker output device: %s", output_device_info["name"]) + logger.info(f"Using speaker output device: {output_device_info['name']}") - speaker_output = speaker_class( - output_device_info, sampling_rate=speaker_sampling_rate - ) + speaker_output = speaker_class(output_device_info, sampling_rate=speaker_sampling_rate) return microphone_input, speaker_output # type: ignore def _find_device_with_name(device_infos: List[dict], name: str) -> dict: try: - return next( - filter(lambda device_info: name == device_info["name"], device_infos) - ) + return next(filter(lambda device_info: name == device_info["name"], device_infos)) except StopIteration: raise Exception("Could not find device with name: {}".format(name)) diff --git a/vocode/logging.py b/vocode/logging.py new file mode 100644 index 0000000000..b33ba4e311 --- /dev/null +++ b/vocode/logging.py @@ -0,0 +1,185 @@ +import json +import logging +import sys + +from loguru import logger +from loguru._handler import Handler + +from vocode import get_serialized_ctx_wrappers + + +def _patched_serialize_record(text: str, record: dict) -> str: + """ + This function takes a text string and a record dictionary as input and returns a serialized + string representation of the record. + + The record dictionary is expected to contain various keys related to logging information such as + 'level', 'time', 'elapsed', 'exception', 'extra', 'file', 'function', 'line', 'message', + 'module', 'name', 'process', 'thread'. Each key's value is processed and added to a new + dictionary 'serializable'. + + If the 'exception' key in the record is not None, it is further processed to extract 'type', + 'value', and 'traceback' information. + + The 'serializable' dictionary is then converted to a JSON string using json.dumps. The 'default' + parameter is set to str to convert any non-serializable types to string. The 'ensure_ascii' + parameter is set to False so that the function can output non-ASCII characters as they are. + + The function finally returns the serialized string with a newline character appended at the end. + + Args: + text (str): A text string. record (dict): A dictionary containing logging information. + + Returns: + str: A serialized string representation of the record dictionary. + """ + exception = record["exception"] + + if exception is not None: + exception = { + "type": None if exception.type is None else exception.type.__name__, + "value": exception.value, + "traceback": bool(exception.traceback), + } + + serializable = { + "severity": record["level"].name, + "text": text, + "timestamp": record["time"].timestamp(), + "elapsed": { + "repr": record["elapsed"], + "seconds": record["elapsed"].total_seconds(), + }, + "exception": exception, + "ctx": get_serialized_ctx_wrappers(), + "extra": record["extra"], + "file": {"name": record["file"].name, "path": record["file"].path}, + "function": record["function"], + "level": { + "icon": record["level"].icon, + "name": record["level"].name, + "no": record["level"].no, + }, + "line": record["line"], + "message": record["message"], + "module": record["module"], + "name": record["name"], + "process": {"id": record["process"].id, "name": record["process"].name}, + "thread": {"id": record["thread"].id, "name": record["thread"].name}, + "time": {"repr": record["time"], "timestamp": record["time"].timestamp()}, + } + + return json.dumps(serializable, default=str, ensure_ascii=False) + "\n" + + +Handler._serialize_record = staticmethod(_patched_serialize_record) # type: ignore + + +class InterceptHandler(logging.Handler): + """ + Default handler from examples in loguru documentation. + + This handler intercepts all log requests and + passes them to loguru. + + For more info see: + https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging + """ + + def emit(self, record: logging.LogRecord) -> None: # pragma: no cover + """ + Propagates logs to loguru. + + :param record: record to log. + """ + try: + level: str | int = logger.level(record.levelname).name + except ValueError: + level = record.levelno + + # Find caller from where originated the logged message + frame, depth = logging.currentframe(), 2 + while ( + frame.f_code.co_filename == logging.__file__ + or frame.f_code.co_filename == __file__ + or "sentry_sdk/integrations" in frame.f_code.co_filename + ): + frame = frame.f_back # type: ignore + depth += 1 + logger.opt(depth=depth, exception=record.exc_info).log( + level, + record.getMessage(), + ) + + +def configure_intercepter() -> None: + """ + Configures the logging system to intercept log messages. + + This function sets up an InterceptHandler instance as the main handler for the root logger. + It sets the logging level to INFO, meaning that all messages with severity INFO and above will be handled. + + It then iterates over all the loggers in the logging system. If a logger's name starts with "uvicorn.", + it removes all handlers from that logger. This is done to prevent uvicorn's default logging configuration + from interfering with our custom configuration. + + Finally, it sets the InterceptHandler instance as the sole handler for the "uvicorn" and "uvicorn.access" loggers. + This ensures that all log messages from uvicorn and its access logger are intercepted by our custom handler. + """ + intercept_handler = InterceptHandler() + logging.basicConfig(handlers=[intercept_handler], level=logging.INFO) + + for logger_name in logging.root.manager.loggerDict: + if logger_name.startswith("uvicorn."): + logging.getLogger(logger_name).handlers = [] + + logging.getLogger("uvicorn").handlers = [intercept_handler] + logging.getLogger("uvicorn.access").handlers = [intercept_handler] + + +def configure_pretty_logging() -> None: + """ + Configures the logging system to output pretty logs. + + This function enables the 'vocode' logger, sets up an intercept handler to + capture logs from the standard logging module, removes all existing handlers + from the 'loguru' logger, and adds a new handler that outputs to stdout with + pretty formatting (colored, not serialized, no backtrace or diagnosis information). + """ + logger.enable("vocode") + + configure_intercepter() + + logger.remove() + logger.add( + sys.stdout, + level=logging.DEBUG, + backtrace=False, + diagnose=False, + serialize=False, + colorize=True, + ) + + +def configure_json_logging() -> None: + """ + Configures the logging system to output logs in JSON format. + + This function enables the 'vocode' logger, sets up an intercept handler to + capture logs from the standard logging module, removes all existing handlers + from the 'loguru' logger, and adds a new handler that outputs to stdout with + JSON formatting (serialized, no backtrace or diagnosis information). + """ + logger.enable("vocode") + + configure_intercepter() + + logger.remove() + logger.add( + sys.stdout, + format="{message}", + level=logging.DEBUG, + backtrace=False, + diagnose=False, + serialize=True, + ) diff --git a/vocode/meta.py b/vocode/meta.py new file mode 100644 index 0000000000..f3f455b547 --- /dev/null +++ b/vocode/meta.py @@ -0,0 +1,15 @@ +from loguru import logger + + +def ensure_punkt_installed(): + try: + from nltk.data import find + + find("tokenizers/punkt") + except LookupError: + from nltk import download + + # If not installed, download 'punkt' + logger.info("Downloading 'punkt' tokenizer...") + download("punkt") + logger.info("'punkt' tokenizer downloaded successfully.") diff --git a/vocode/streaming/action/abstract_factory.py b/vocode/streaming/action/abstract_factory.py new file mode 100644 index 0000000000..7e7ace050e --- /dev/null +++ b/vocode/streaming/action/abstract_factory.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.models.actions import ActionConfig + + +class AbstractActionFactory(ABC): + @abstractmethod + def create_action(self, action_config: ActionConfig) -> BaseAction: + pass diff --git a/vocode/streaming/action/utils.py b/vocode/streaming/action/action_utils.py similarity index 100% rename from vocode/streaming/action/utils.py rename to vocode/streaming/action/action_utils.py diff --git a/vocode/streaming/action/base_action.py b/vocode/streaming/action/base_action.py index 2ba8012275..e1e07f028b 100644 --- a/vocode/streaming/action/base_action.py +++ b/vocode/streaming/action/base_action.py @@ -1,30 +1,34 @@ import asyncio -from typing import Any, Dict, Generic, Optional, Type, TypeVar, TYPE_CHECKING -from vocode.streaming.action.utils import exclude_keys_recursive +from typing import TYPE_CHECKING, Any, Dict, Generic, List, Literal, Optional, Type, TypeVar + +import jsonschema +from jsonschema import Draft202012Validator as SchemaValidator + +from vocode.streaming.action.action_utils import exclude_keys_recursive from vocode.streaming.models.actions import ( ActionConfig, ActionInput, ActionOutput, - ActionType, ParametersType, ResponseType, ) if TYPE_CHECKING: - from vocode.streaming.utils.state_manager import ConversationStateManager + from vocode.streaming.utils.state_manager import AbstractConversationStateManager ActionConfigType = TypeVar("ActionConfigType", bound=ActionConfig) -class BaseAction(Generic[ActionConfigType, ParametersType, ResponseType]): +class BaseAction(Generic[ActionConfigType, ParametersType, ResponseType]): # type: ignore description: str = "" def __init__( self, action_config: ActionConfigType, - should_respond: bool = False, + should_respond: Literal["always", "sometimes", "never"] = "never", quiet: bool = False, is_interruptible: bool = True, + **kwargs, ): self.action_config = action_config self.should_respond = should_respond @@ -32,13 +36,11 @@ def __init__( self.is_interruptible = is_interruptible def attach_conversation_state_manager( - self, conversation_state_manager: "ConversationStateManager" + self, conversation_state_manager: "AbstractConversationStateManager" ): self.conversation_state_manager = conversation_state_manager - async def run( - self, action_input: ActionInput[ParametersType] - ) -> ActionOutput[ResponseType]: + async def run(self, action_input: ActionInput[ParametersType]) -> ActionOutput[ResponseType]: raise NotImplementedError @property @@ -49,23 +51,35 @@ def parameters_type(self) -> Type[ParametersType]: def response_type(self) -> Type[ResponseType]: raise NotImplementedError + def get_parameters_schema(self) -> Dict[str, Any]: + return self.parameters_type.schema() + + def get_function_name(self) -> str: + return self.action_config.type + def get_openai_function(self): - parameters_schema = self.parameters_type.schema() + parameters_schema = self.get_parameters_schema() parameters_schema = exclude_keys_recursive(parameters_schema, {"title"}) - if self.should_respond: - parameters_schema["properties"][ - "user_message" - ] = self._user_message_param_info() - required = parameters_schema.get("required", []) - required.append("user_message") - parameters_schema["required"] = required + if self.should_respond != "never": + parameters_schema["properties"]["user_message"] = self._user_message_param_info() + if self.should_respond == "always": + required: List[str] = parameters_schema.get("required", []) + required.append("user_message") + parameters_schema["required"] = required + try: + SchemaValidator.check_schema(parameters_schema) + except jsonschema.exceptions.SchemaError as e: + raise ValueError(f"Invalid parameters schema for {self.action_config.type}: {e}") from e return { - "name": self.action_config.type, + "name": self.get_function_name(), "description": self.description, "parameters": parameters_schema, } + def create_action_params(self, params: Dict[str, Any]) -> ParametersType: + return self.parameters_type(**params) + def create_action_input( self, conversation_id: str, @@ -77,14 +91,14 @@ def create_action_input( return ActionInput( action_config=self.action_config, conversation_id=conversation_id, - params=self.parameters_type(**params), + params=self.create_action_params(params), user_message_tracker=user_message_tracker, ) def _user_message_param_info(self): return { "type": "string", - "description": """A message to reply to the user with BEFORE we make the function call. + "description": """A message to reply to the user with BEFORE we make the function call. Essentially a live response informing them that the function is about to happen. Eg Let me check the weather in San Francisco CA for you """, } diff --git a/vocode/streaming/action/default_factory.py b/vocode/streaming/action/default_factory.py new file mode 100644 index 0000000000..227ed56c42 --- /dev/null +++ b/vocode/streaming/action/default_factory.py @@ -0,0 +1,47 @@ +from typing import Dict, Sequence, Type + +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.action.dtmf import TwilioDTMF, VonageDTMF +from vocode.streaming.action.end_conversation import EndConversation +from vocode.streaming.action.execute_external_action import ExecuteExternalAction +from vocode.streaming.action.phone_call_action import ( + TwilioPhoneConversationAction, + VonagePhoneConversationAction, +) +from vocode.streaming.action.record_email import RecordEmail +from vocode.streaming.action.transfer_call import TwilioTransferCall, VonageTransferCall +from vocode.streaming.action.wait import Wait +from vocode.streaming.models.actions import ActionConfig, ActionType + +CONVERSATION_ACTIONS: Dict[ActionType, Type[BaseAction]] = { + ActionType.END_CONVERSATION: EndConversation, + ActionType.RECORD_EMAIL: RecordEmail, + ActionType.WAIT: Wait, + ActionType.EXECUTE_EXTERNAL_ACTION: ExecuteExternalAction, +} + +VONAGE_ACTIONS: Dict[ActionType, Type[VonagePhoneConversationAction]] = { + ActionType.TRANSFER_CALL: VonageTransferCall, + ActionType.DTMF: VonageDTMF, +} + +TWILIO_ACTIONS: Dict[ActionType, Type[TwilioPhoneConversationAction]] = { + ActionType.TRANSFER_CALL: TwilioTransferCall, + ActionType.DTMF: TwilioDTMF, +} + + +class DefaultActionFactory(AbstractActionFactory): + def __init__(self, actions: Sequence[ActionConfig] | dict = {}): + + self.action_configs_dict = {action.type: action for action in actions} + self.actions = CONVERSATION_ACTIONS + + def create_action(self, action_config: ActionConfig): + if action_config.type not in self.action_configs_dict: + raise Exception("Action type not supported by Agent config.") + + action_class = self.actions[action_config.type] + + return action_class(action_config) diff --git a/vocode/streaming/action/dtmf.py b/vocode/streaming/action/dtmf.py new file mode 100644 index 0000000000..392b8eef6c --- /dev/null +++ b/vocode/streaming/action/dtmf.py @@ -0,0 +1,83 @@ +from typing import Type + +from loguru import logger +from pydantic.v1 import BaseModel, Field + +from vocode.streaming.action.phone_call_action import ( + TwilioPhoneConversationAction, + VonagePhoneConversationAction, +) +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, +) + + +class DTMFParameters(BaseModel): + buttons: str = Field(..., description="The buttons to press.") + + +class DTMFResponse(BaseModel): + success: bool + + +class DTMFVocodeActionConfig(VocodeActionConfig, type="action_dtmf"): # type: ignore + def action_attempt_to_string(self, input: ActionInput) -> str: + assert isinstance(input.params, DTMFParameters) + return "Attempting to press numbers: " f"{list(input.params.buttons)}" + + def action_result_to_string(self, input: ActionInput, output: ActionOutput) -> str: + assert isinstance(input.params, DTMFParameters) + assert isinstance(output.response, DTMFResponse) + return f"Pressed numbers {list(input.params.buttons)} successfully" + + +FUNCTION_DESCRIPTION = "Presses a string numbers using DTMF tones." + + +class VonageDTMF( + VonagePhoneConversationAction[DTMFVocodeActionConfig, DTMFParameters, DTMFResponse] +): + description: str = FUNCTION_DESCRIPTION + parameters_type: Type[DTMFParameters] = DTMFParameters + response_type: Type[DTMFResponse] = DTMFResponse + conversation_state_manager: VonagePhoneConversationStateManager + + def __init__(self, action_config: DTMFVocodeActionConfig): + super().__init__(action_config, quiet=True) + + async def run(self, action_input: ActionInput[DTMFParameters]) -> ActionOutput[DTMFResponse]: + buttons = action_input.params.buttons + vonage_client = self.conversation_state_manager.create_vonage_client() + await vonage_client.send_dtmf( + vonage_uuid=self.get_vonage_uuid(action_input), digits=buttons + ) + + return ActionOutput( + action_type=action_input.action_config.type, + response=DTMFResponse(success=True), + ) + + +class TwilioDTMF( + TwilioPhoneConversationAction[DTMFVocodeActionConfig, DTMFParameters, DTMFResponse] +): + description: str = FUNCTION_DESCRIPTION + parameters_type: Type[DTMFParameters] = DTMFParameters + response_type: Type[DTMFResponse] = DTMFResponse + conversation_state_manager: TwilioPhoneConversationStateManager + + def __init__(self, action_config: DTMFVocodeActionConfig): + super().__init__( + action_config, + quiet=True, + ) + + async def run(self, action_input: ActionInput[DTMFParameters]) -> ActionOutput[DTMFResponse]: + logger.error("DTMF not yet supported with Twilio") + return ActionOutput( + action_type=action_input.action_config.type, + response=DTMFResponse(success=False), + ) diff --git a/vocode/streaming/action/end_conversation.py b/vocode/streaming/action/end_conversation.py new file mode 100644 index 0000000000..7175ad8461 --- /dev/null +++ b/vocode/streaming/action/end_conversation.py @@ -0,0 +1,89 @@ +from typing import Type + +from loguru import logger +from pydantic.v1 import BaseModel + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput + +_END_CONVERSATION_ACTION_DESCRIPTION = """ +Ends the current conversation; use this when we should hang up. Use this +when: someone has indicated they expect the call to finish, and there are no further objectives +to complete. If the user says Goodbye or a different farewell phrase, this indicates that we should +hang up. Example farewell phrases: goodbye, so long, see you, later, take care, etc. People will +sometimes say a farewell phrase at the end of a longer sentence, so make sure to hang up then +as well. Example: \"This sounds great! Talk to you soon.\"""" + + +class EndConversationParameters(BaseModel): + pass + + +class EndConversationResponse(BaseModel): + success: bool + + +class EndConversationVocodeActionConfig( + VocodeActionConfig, type="action_end_conversation" # type: ignore +): + def action_attempt_to_string(self, input: ActionInput) -> str: + assert isinstance(input.params, EndConversationParameters) + return "Attempting to end conversation" + + def action_result_to_string(self, input: ActionInput, output: ActionOutput) -> str: + assert isinstance(output.response, EndConversationResponse) + if output.response.success: + action_description = "Successfully ended conversation" + else: + action_description = "Did not end call because user interrupted" + return action_description + + +class EndConversation( + BaseAction[ + EndConversationVocodeActionConfig, + EndConversationParameters, + EndConversationResponse, + ] +): + description: str = _END_CONVERSATION_ACTION_DESCRIPTION + parameters_type: Type[EndConversationParameters] = EndConversationParameters + response_type: Type[EndConversationResponse] = EndConversationResponse + + def __init__( + self, + action_config: EndConversationVocodeActionConfig, + ): + super().__init__( + action_config, + quiet=True, + should_respond="sometimes", + is_interruptible=False, + ) + + async def _end_of_run_hook(self) -> None: + """This method is called at the end of the run method. It is optional but intended to be + overridden if needed.""" + pass + + async def run( + self, action_input: ActionInput[EndConversationParameters] + ) -> ActionOutput[EndConversationResponse]: + if action_input.user_message_tracker is not None: + await action_input.user_message_tracker.wait() + + if self.conversation_state_manager.transcript.was_last_message_interrupted(): + logger.info("Last bot message was interrupted") + return ActionOutput( + action_type=action_input.action_config.type, + response=EndConversationResponse(success=False), + ) + + await self.conversation_state_manager.terminate_conversation() + + await self._end_of_run_hook() + return ActionOutput( + action_type=action_input.action_config.type, + response=EndConversationResponse(success=True), + ) diff --git a/vocode/streaming/action/execute_external_action.py b/vocode/streaming/action/execute_external_action.py new file mode 100644 index 0000000000..c689b206d6 --- /dev/null +++ b/vocode/streaming/action/execute_external_action.py @@ -0,0 +1,110 @@ +import json +from typing import Any, Dict, Optional, Type + +from pydantic.v1 import BaseModel + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.action.external_actions_requester import ( + ExternalActionResponse, + ExternalActionsRequester, +) +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput, ExternalActionProcessingMode +from vocode.streaming.models.message import BaseMessage + + +class ExecuteExternalActionVocodeActionConfig( + VocodeActionConfig, type="action_external" # type: ignore +): + processing_mode: ExternalActionProcessingMode + name: str + description: str + url: str + input_schema: str + speak_on_send: bool + speak_on_receive: bool + signature_secret: str + + +class ExecuteExternalActionParameters(BaseModel): + payload: Dict[str, Any] + + +class ExecuteExternalActionResponse(BaseModel): + success: bool + result: Optional[dict] + + +class ExecuteExternalAction( + BaseAction[ + ExecuteExternalActionVocodeActionConfig, + ExecuteExternalActionParameters, + ExecuteExternalActionResponse, + ] +): + parameters_type: Type[ExecuteExternalActionParameters] = ExecuteExternalActionParameters + response_type: Type[ExecuteExternalActionResponse] = ExecuteExternalActionResponse + + def __init__( + self, + action_config: ExecuteExternalActionVocodeActionConfig, + ): + self.description = action_config.description + super().__init__( + action_config, + quiet=not action_config.speak_on_receive, + should_respond="always" if action_config.speak_on_send else "never", + is_interruptible=False, + ) + self.external_actions_requester = ExternalActionsRequester(url=action_config.url) + + def _user_message_param_info(self): + return { + "type": "string", + "description": ( + "A message to reply to the user with BEFORE we make the function call." + "\nEssentially a live response informing them that the function is " + "about to happen." + ), + } + + def create_action_params(self, params: Dict[str, Any]) -> ExecuteExternalActionParameters: + return ExecuteExternalActionParameters(payload=params) + + def get_function_name(self) -> str: + return self.action_config.name + + def get_parameters_schema(self) -> Dict[str, Any]: + return json.loads(self.action_config.input_schema) + + async def send_external_action_request( + self, action_input: ActionInput[ExecuteExternalActionParameters] + ) -> ExternalActionResponse: + return await self.external_actions_requester.send_request( + payload=action_input.params.payload, + signature_secret=self.action_config.signature_secret, + ) + + async def run( + self, action_input: ActionInput[ExecuteExternalActionParameters] + ) -> ActionOutput[ExecuteExternalActionResponse]: + # TODO: this interruption handling needs to be refactored / DRYd + if self.should_respond and action_input.user_message_tracker is not None: + await action_input.user_message_tracker.wait() + + self.conversation_state_manager.mute_agent() + response = await self.send_external_action_request(action_input) + self.conversation_state_manager.unmute_agent() + + # TODO (EA): pass specific context based on error + return ActionOutput( + action_type=action_input.action_config.type, + response=ExecuteExternalActionResponse( + result=response.result if response else None, success=response.success + ), + canned_response=( + BaseMessage(text=response.agent_message) + if response and response.agent_message + else None + ), + ) diff --git a/vocode/streaming/action/external_actions_requester.py b/vocode/streaming/action/external_actions_requester.py new file mode 100644 index 0000000000..ff82911bd6 --- /dev/null +++ b/vocode/streaming/action/external_actions_requester.py @@ -0,0 +1,134 @@ +import base64 +import hashlib +import hmac +import json +from typing import Any, Dict, Optional + +import httpx +from loguru import logger +from pydantic.v1 import BaseModel + + +class ExternalActionValueError(ValueError): + pass + + +class ExternalActionsErrorResponses: + client_error = ( + "There was an error with the information provided. " + "Please ask for clarification and try again." + ) + server_error = ( + "There was a server error with status " + "{status}: {text}. Please politely tell the user to try again later." + ) + input_error = ( + "There was an error with the information received from the service. " + "Please politely tell the user to try again later." + "\nThe error was {error}" + ) + unauthorized = ( + "There was an error with the authentication for the service. " + "Please politely tell the user to try again later." + ) + forbidden = ( + "There was an error with the authentication for the service. " + "Please politely tell the user to try again later." + ) + + +class ExternalActionResponse(BaseModel): + result: dict + success: bool + agent_message: Optional[str] = None + + +class ExternalActionsRequester: + def __init__(self, url: str) -> None: + self.url = url + + async def send_request( + self, + payload: Dict[str, Any], + signature_secret: str, + additional_payload_values: Dict[str, Any] = {}, + ) -> ExternalActionResponse: + encoded_payload = json.dumps({"payload": payload} | additional_payload_values).encode( + "utf-8" + ) + + headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "x-vocode-signature": self._encode_payload(encoded_payload, signature_secret), + } + + transport = httpx.AsyncHTTPTransport(retries=2) + async with httpx.AsyncClient( + headers=headers, + transport=transport, + timeout=10, + ) as client: + try: + response = await client.post( + self.url, + content=encoded_payload, + ) + response.raise_for_status() + data = response.json() + return self._validate_response(data) + except httpx.HTTPStatusError as e: + logger.error(f"[External Actions] Request failed: {e}") + if e.response.status_code == 401: + return ExternalActionResponse( + result={"info": ExternalActionsErrorResponses.unauthorized}, + success=False, + ) + elif e.response.status_code == 403: + return ExternalActionResponse( + result={"info": ExternalActionsErrorResponses.forbidden}, + success=False, + ) + if 400 <= e.response.status_code < 500: + return ExternalActionResponse( + result={"info": ExternalActionsErrorResponses.client_error}, + success=False, + ) + elif e.response.status_code >= 500: + return ExternalActionResponse( + result={ + "info": ExternalActionsErrorResponses.server_error.format( + status=e.response.status_code, text=e.response.text + ) + }, + success=False, + ) + else: + raise e + except ExternalActionValueError as e: + return ExternalActionResponse( + result={"info": ExternalActionsErrorResponses.input_error.format(error=str(e))}, + success=False, + ) + + def _encode_payload(self, payload: bytes, signature_secret: str) -> str: + signature_as_bytes = base64.b64decode(signature_secret) + digest = hmac.new(signature_as_bytes, payload, hashlib.sha256).digest() + return base64.b64encode(digest).decode() + + def _validate_response(self, response: Dict[str, Any]) -> ExternalActionResponse: + if "result" not in response: + raise ExternalActionValueError("Invalid response format: missing 'result'") + if not isinstance(response["result"], dict): + raise ExternalActionValueError( + "Invalid response format: 'agent_message' must be a key value map" + ) + if "agent_message" in response and not isinstance(response["agent_message"], str): + raise ExternalActionValueError( + "Invalid response format: 'agent_message' must be a string" + ) + return ExternalActionResponse( + result=response["result"], + agent_message=response.get("agent_message"), + success=True, + ) diff --git a/vocode/streaming/action/factory.py b/vocode/streaming/action/factory.py deleted file mode 100644 index c5398a32d4..0000000000 --- a/vocode/streaming/action/factory.py +++ /dev/null @@ -1,17 +0,0 @@ -from vocode.streaming.action.base_action import BaseAction -from vocode.streaming.action.nylas_send_email import ( - NylasSendEmail, - NylasSendEmailActionConfig, -) -from vocode.streaming.models.actions import ActionConfig -from vocode.streaming.action.transfer_call import TransferCall, TransferCallActionConfig - - -class ActionFactory: - def create_action(self, action_config: ActionConfig) -> BaseAction: - if isinstance(action_config, NylasSendEmailActionConfig): - return NylasSendEmail(action_config, should_respond=True) - elif isinstance(action_config, TransferCallActionConfig): - return TransferCall(action_config) - else: - raise Exception("Invalid action type") diff --git a/vocode/streaming/action/nylas_send_email.py b/vocode/streaming/action/nylas_send_email.py deleted file mode 100644 index cec889c188..0000000000 --- a/vocode/streaming/action/nylas_send_email.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Optional, Type -from pydantic.v1 import BaseModel, Field -import os -from vocode.streaming.action.base_action import BaseAction -from vocode.streaming.models.actions import ( - ActionConfig, - ActionInput, - ActionOutput, - ActionType, -) - - -class NylasSendEmailActionConfig(ActionConfig, type=ActionType.NYLAS_SEND_EMAIL): - pass - - -class NylasSendEmailParameters(BaseModel): - recipient_email: str = Field(..., description="The email address of the recipient.") - body: str = Field(..., description="The body of the email.") - subject: Optional[str] = Field(None, description="The subject of the email.") - - -class NylasSendEmailResponse(BaseModel): - success: bool - - -class NylasSendEmail( - BaseAction[ - NylasSendEmailActionConfig, NylasSendEmailParameters, NylasSendEmailResponse - ] -): - description: str = "Sends an email using Nylas API." - parameters_type: Type[NylasSendEmailParameters] = NylasSendEmailParameters - response_type: Type[NylasSendEmailResponse] = NylasSendEmailResponse - - async def run( - self, action_input: ActionInput[NylasSendEmailParameters] - ) -> ActionOutput[NylasSendEmailResponse]: - from nylas import APIClient - - # Initialize the Nylas client - nylas = APIClient( - client_id=os.getenv("NYLAS_CLIENT_ID"), - client_secret=os.getenv("NYLAS_CLIENT_SECRET"), - access_token=os.getenv("NYLAS_ACCESS_TOKEN"), - ) - - # Create the email draft - draft = nylas.drafts.create() - draft.body = action_input.params.body - - email_subject = action_input.params.subject - draft.subject = email_subject if email_subject else "Email from Vocode" - draft.to = [{"email": action_input.params.recipient_email.strip()}] - - # Send the email - draft.send() - - return ActionOutput( - action_type=self.action_config.type, - response=NylasSendEmailResponse(success=True), - ) diff --git a/vocode/streaming/action/phone_call_action.py b/vocode/streaming/action/phone_call_action.py index 3b502f8127..f780413fc3 100644 --- a/vocode/streaming/action/phone_call_action.py +++ b/vocode/streaming/action/phone_call_action.py @@ -1,27 +1,31 @@ import asyncio -from typing import Dict, Any, Optional +from typing import Any, Dict, Optional + from vocode.streaming.action.base_action import ActionConfigType, BaseAction from vocode.streaming.models.actions import ( ActionInput, - ActionOutput, ParametersType, ResponseType, - TwilioPhoneCallActionInput, - VonagePhoneCallActionInput, + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, +) +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, ) -class VonagePhoneCallAction(BaseAction[ActionConfigType, ParametersType, ResponseType]): - def create_phone_call_action_input( +class VonagePhoneConversationAction(BaseAction[ActionConfigType, ParametersType, ResponseType]): + def create_phone_conversation_action_input( self, conversation_id: str, params: Dict[str, Any], vonage_uuid: str, user_message_tracker: Optional[asyncio.Event] = None, - ) -> VonagePhoneCallActionInput[ParametersType]: + ) -> VonagePhoneConversationActionInput[ParametersType]: if "user_message" in params: del params["user_message"] - return VonagePhoneCallActionInput( + return VonagePhoneConversationActionInput( action_config=self.action_config, conversation_id=conversation_id, params=self.parameters_type(**params), @@ -30,21 +34,25 @@ def create_phone_call_action_input( ) def get_vonage_uuid(self, action_input: ActionInput[ParametersType]) -> str: - assert isinstance(action_input, VonagePhoneCallActionInput) + assert isinstance(action_input, VonagePhoneConversationActionInput) return action_input.vonage_uuid + def attach_conversation_state_manager(self, conversation_state_manager: Any): + assert isinstance(conversation_state_manager, VonagePhoneConversationStateManager) + self.conversation_state_manager = conversation_state_manager -class TwilioPhoneCallAction(BaseAction[ActionConfigType, ParametersType, ResponseType]): - def create_phone_call_action_input( + +class TwilioPhoneConversationAction(BaseAction[ActionConfigType, ParametersType, ResponseType]): + def create_phone_conversation_action_input( self, conversation_id: str, params: Dict[str, Any], twilio_sid: str, user_message_tracker: Optional[asyncio.Event] = None, - ) -> TwilioPhoneCallActionInput[ParametersType]: + ) -> TwilioPhoneConversationActionInput[ParametersType]: if "user_message" in params: del params["user_message"] - return TwilioPhoneCallActionInput( + return TwilioPhoneConversationActionInput( action_config=self.action_config, conversation_id=conversation_id, params=self.parameters_type(**params), @@ -53,5 +61,9 @@ def create_phone_call_action_input( ) def get_twilio_sid(self, action_input: ActionInput[ParametersType]) -> str: - assert isinstance(action_input, TwilioPhoneCallActionInput) + assert isinstance(action_input, TwilioPhoneConversationActionInput) return action_input.twilio_sid + + def attach_conversation_state_manager(self, conversation_state_manager: Any): + assert isinstance(conversation_state_manager, TwilioPhoneConversationStateManager) + self.conversation_state_manager = conversation_state_manager diff --git a/vocode/streaming/action/record_email.py b/vocode/streaming/action/record_email.py new file mode 100644 index 0000000000..98619ef121 --- /dev/null +++ b/vocode/streaming/action/record_email.py @@ -0,0 +1,76 @@ +import re +from typing import Optional, Type + +from pydantic.v1 import BaseModel, Field + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.models.actions import ActionConfig, ActionInput, ActionOutput + +EMAIL_REGEX = r"^(?!\.)(?!.*\.\.)[a-zA-Z0-9._%+-]+(? kian@gmail.com + ajay at vocode dot dev -> ajay@vocode.dev + + This function will do extra validation. + """ + parameters_type: Type[RecordEmailParameters] = RecordEmailParameters + response_type: Type[RecordEmailResponse] = RecordEmailResponse + + def __init__( + self, + action_config: RecordEmailVocodeActionConfig, + ): + super().__init__( + action_config, + quiet=False, + should_respond="never", + ) + + def _validate_email(self, email: str) -> bool: + return bool(re.match(EMAIL_REGEX, email)) + + async def run( + self, action_input: ActionInput[RecordEmailParameters] + ) -> ActionOutput[RecordEmailResponse]: + value = action_input.params.formatted_value + + success = self._validate_email(value) + + return ActionOutput( + action_type=action_input.action_config.type, + response=RecordEmailResponse(success=success), + ) diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index e9aff02528..f78fcea654 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -1,21 +1,20 @@ -import os -import aiohttp - -from aiohttp import BasicAuth -from typing import Type -from pydantic.v1 import BaseModel, Field - -from vocode.streaming.action.phone_call_action import TwilioPhoneCallAction -from vocode.streaming.models.actions import ( - ActionConfig, - ActionInput, - ActionOutput, - ActionType, -) +from typing import Literal, Type +from loguru import logger +from pydantic.v1 import BaseModel -class TransferCallActionConfig(ActionConfig, type=ActionType.TRANSFER_CALL): - to_phone: str +from vocode.streaming.action.phone_call_action import ( + TwilioPhoneConversationAction, + VonagePhoneConversationAction, +) +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput +from vocode.streaming.utils.async_requester import AsyncRequestor +from vocode.streaming.utils.phone_numbers import sanitize_phone_number +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, +) class TransferCallParameters(BaseModel): @@ -23,40 +22,68 @@ class TransferCallParameters(BaseModel): class TransferCallResponse(BaseModel): - status: str = Field("success", description="status of the transfer") + success: bool + + +class TransferCallVocodeActionConfig(VocodeActionConfig, type="action_transfer_call"): # type: ignore + phone_number: str + + def action_attempt_to_string(self, input: ActionInput) -> str: + assert isinstance(input.params, TransferCallParameters) + return f"Attempting to transfer call to {self.phone_number}" + + def action_result_to_string(self, input: ActionInput, output: ActionOutput) -> str: + assert isinstance(output.response, TransferCallResponse) + if output.response.success: + action_description = "Successfully transferred call" + else: + action_description = "Did not transfer call because user interrupted" + return action_description + +FUNCTION_DESCRIPTION = "Transfers the call to a new number. This is never used while on hold." +QUIET = True +IS_INTERRUPTIBLE = True +SHOULD_RESPOND: Literal["always"] = "always" -class TransferCall( - TwilioPhoneCallAction[ - TransferCallActionConfig, TransferCallParameters, TransferCallResponse + +class TwilioTransferCall( + TwilioPhoneConversationAction[ + TransferCallVocodeActionConfig, TransferCallParameters, TransferCallResponse ] ): - description: str = ( - "transfers the call. use when you need to connect the active call to another phone line." - ) + description: str = FUNCTION_DESCRIPTION parameters_type: Type[TransferCallParameters] = TransferCallParameters response_type: Type[TransferCallResponse] = TransferCallResponse + conversation_state_manager: TwilioPhoneConversationStateManager + + def __init__( + self, + action_config: TransferCallVocodeActionConfig, + ): + super().__init__( + action_config, + quiet=QUIET, + is_interruptible=False, + should_respond=SHOULD_RESPOND, + ) - async def transfer_call(self, twilio_call_sid, to_phone): - twilio_account_sid = os.environ["TWILIO_ACCOUNT_SID"] - twilio_auth_token = os.environ["TWILIO_AUTH_TOKEN"] + async def transfer_call(self, twilio_call_sid: str, to_phone: str): + twilio_client = self.conversation_state_manager.create_twilio_client() - url = "https://api.twilio.com/2010-04-01/Accounts/{twilio_account_sid}/Calls/{twilio_auth_token}.json".format( - twilio_account_sid=twilio_account_sid, twilio_auth_token=twilio_call_sid + url = "https://api.twilio.com/2010-04-01/Accounts/{twilio_account_sid}/Calls/{twilio_call_sid}.json".format( + twilio_account_sid=twilio_client.get_telephony_config().account_sid, + twilio_call_sid=twilio_call_sid, ) - twiml_data = "{to_phone}".format( - to_phone=to_phone - ) + twiml_data = "{to_phone}".format(to_phone=to_phone) payload = {"Twiml": twiml_data} - auth = BasicAuth(twilio_account_sid, twilio_auth_token) - - async with aiohttp.ClientSession(auth=auth) as session: - async with session.post(url, data=payload) as response: + async with AsyncRequestor().get_session() as session: + async with session.post(url, data=payload, auth=twilio_client.auth) as response: if response.status != 200: - print(await response.text()) + logger.error(f"Failed to transfer call: {response.status} {response.reason}") raise Exception("failed to update call") else: return await response.json() @@ -66,9 +93,78 @@ async def run( ) -> ActionOutput[TransferCallResponse]: twilio_call_sid = self.get_twilio_sid(action_input) - await self.transfer_call(twilio_call_sid, self.action_config.to_phone) + sanitized_phone_number = sanitize_phone_number(self.action_config.phone_number) + + if action_input.user_message_tracker is not None: + await action_input.user_message_tracker.wait() + + logger.info("Finished waiting for user message tracker, now attempting to transfer call") + + if self.conversation_state_manager.transcript.was_last_message_interrupted(): + logger.info("Last bot message was interrupted, not transferring call") + return ActionOutput( + action_type=action_input.action_config.type, + response=TransferCallResponse(success=False), + ) + + await self.transfer_call(twilio_call_sid, sanitized_phone_number) + + return ActionOutput( + action_type=action_input.action_config.type, + response=TransferCallResponse(success=True), + ) + + +class VonageTransferCall( + VonagePhoneConversationAction[ + TransferCallVocodeActionConfig, TransferCallParameters, TransferCallResponse + ] +): + description: str = FUNCTION_DESCRIPTION + parameters_type: Type[TransferCallParameters] = TransferCallParameters + response_type: Type[TransferCallResponse] = TransferCallResponse + conversation_state_manager: VonagePhoneConversationStateManager + + def __init__(self, action_config: TransferCallVocodeActionConfig): + super().__init__( + action_config, + quiet=QUIET, + is_interruptible=IS_INTERRUPTIBLE, + should_respond=SHOULD_RESPOND, + ) + + async def run( + self, action_input: ActionInput[TransferCallParameters] + ) -> ActionOutput[TransferCallResponse]: + if action_input.user_message_tracker is not None: + await action_input.user_message_tracker.wait() + self.conversation_state_manager.mute_agent() + + sanitized_phone_number = sanitize_phone_number(self.action_config.phone_number) + + if self.conversation_state_manager.get_direction() == "outbound": + agent_phone_number = self.conversation_state_manager.get_from_phone() + else: + agent_phone_number = self.conversation_state_manager.get_to_phone() + + await self.conversation_state_manager.create_vonage_client().update_call( + vonage_uuid=self.get_vonage_uuid(action_input), + new_ncco=[ + { + "action": "connect", + "timeout": "45", + "from": agent_phone_number, + "endpoint": [ + { + "type": "phone", + "number": sanitized_phone_number, + } + ], + } + ], + ) return ActionOutput( action_type=action_input.action_config.type, - response=TransferCallResponse(status="success"), + response=TransferCallResponse(success=True), ) diff --git a/vocode/streaming/action/wait.py b/vocode/streaming/action/wait.py new file mode 100644 index 0000000000..a70c6dbfa7 --- /dev/null +++ b/vocode/streaming/action/wait.py @@ -0,0 +1,52 @@ +from typing import Type + +from pydantic.v1 import BaseModel + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput + + +class WaitVocodeActionConfig(VocodeActionConfig, type="action_wait"): # type: ignore + pass + + +class WaitParameters(BaseModel): + pass + + +class WaitResponse(BaseModel): + success: bool + + +class Wait( + BaseAction[ + WaitVocodeActionConfig, + WaitParameters, + WaitResponse, + ] +): + description: str = ( + "Use this action to wait for the IVR to finish talking or to continue waiting on hold." + ) + parameters_type: Type[WaitParameters] = WaitParameters + response_type: Type[WaitResponse] = WaitResponse + + def __init__( + self, + action_config: WaitVocodeActionConfig, + ): + super().__init__( + action_config, + quiet=True, + should_respond="never", + ) + + async def run(self, action_input: ActionInput[WaitParameters]) -> ActionOutput[WaitResponse]: + if action_input.user_message_tracker is not None: + await action_input.user_message_tracker.wait() + + return ActionOutput( + action_type=action_input.action_config.type, + response=WaitResponse(success=True), + ) diff --git a/vocode/streaming/action/worker.py b/vocode/streaming/action/worker.py index 6ca876f6b2..26c51b2406 100644 --- a/vocode/streaming/action/worker.py +++ b/vocode/streaming/action/worker.py @@ -1,14 +1,16 @@ from __future__ import annotations import asyncio -from vocode.streaming.action.factory import ActionFactory + +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.default_factory import DefaultActionFactory from vocode.streaming.agent.base_agent import ActionResultAgentInput, AgentInput from vocode.streaming.models.actions import ( ActionInput, - TwilioPhoneCallActionInput, - VonagePhoneCallActionInput, + TwilioPhoneConversationActionInput, + VonagePhoneConversationActionInput, ) -from vocode.streaming.utils.state_manager import ConversationStateManager +from vocode.streaming.utils.state_manager import AbstractConversationStateManager from vocode.streaming.utils.worker import ( InterruptibleEvent, InterruptibleEventFactory, @@ -19,10 +21,10 @@ class ActionsWorker(InterruptibleWorker): def __init__( self, + action_factory: AbstractActionFactory, input_queue: asyncio.Queue[InterruptibleEvent[ActionInput]], output_queue: asyncio.Queue[InterruptibleEvent[AgentInput]], interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), - action_factory: ActionFactory = ActionFactory(), ): super().__init__( input_queue=input_queue, @@ -32,7 +34,7 @@ def __init__( self.action_factory = action_factory def attach_conversation_state_manager( - self, conversation_state_manager: ConversationStateManager + self, conversation_state_manager: AbstractConversationStateManager ): self.conversation_state_manager = conversation_state_manager @@ -48,14 +50,15 @@ async def process(self, item: InterruptibleEvent[ActionInput]): action_output=action_output, vonage_uuid=( action_input.vonage_uuid - if isinstance(action_input, VonagePhoneCallActionInput) + if isinstance(action_input, VonagePhoneConversationActionInput) else None ), twilio_sid=( action_input.twilio_sid - if isinstance(action_input, TwilioPhoneCallActionInput) + if isinstance(action_input, TwilioPhoneConversationActionInput) else None ), is_quiet=action.quiet, - ) + ), + is_interruptible=False, ) diff --git a/vocode/streaming/agent/__init__.py b/vocode/streaming/agent/__init__.py index d001c05cfb..39eaf026fe 100644 --- a/vocode/streaming/agent/__init__.py +++ b/vocode/streaming/agent/__init__.py @@ -1,10 +1,2 @@ -from vocode.streaming.agent.anthropic_agent import ChatAnthropicAgent from vocode.streaming.agent.base_agent import BaseAgent from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent -from vocode.streaming.agent.echo_agent import EchoAgent -from vocode.streaming.agent.gpt4all_agent import GPT4AllAgent -from vocode.streaming.agent.information_retrieval_agent import InformationRetrievalAgent -from vocode.streaming.agent.llm_agent import LLMAgent -from vocode.streaming.agent.restful_user_implemented_agent import ( - RESTfulUserImplementedAgent, -) diff --git a/vocode/streaming/agent/abstract_factory.py b/vocode/streaming/agent/abstract_factory.py new file mode 100644 index 0000000000..9bef8bc792 --- /dev/null +++ b/vocode/streaming/agent/abstract_factory.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + +from vocode.streaming.agent.base_agent import BaseAgent +from vocode.streaming.models.agent import AgentConfig + + +class AbstractAgentFactory(ABC): + @abstractmethod + def create_agent(self, agent_config: AgentConfig) -> BaseAgent: + pass diff --git a/vocode/streaming/agent/anthropic_agent.py b/vocode/streaming/agent/anthropic_agent.py index 009bbdd649..820fa6539a 100644 --- a/vocode/streaming/agent/anthropic_agent.py +++ b/vocode/streaming/agent/anthropic_agent.py @@ -1,137 +1,122 @@ -from typing import AsyncGenerator, Optional, Tuple -from langchain import ConversationChain -import logging +import os +from typing import Any, AsyncGenerator, Dict -from typing import Optional, Tuple -from pydantic.v1 import SecretStr -from vocode.streaming.agent.base_agent import RespondAgent +import sentry_sdk +from anthropic import AsyncAnthropic, AsyncStream +from anthropic.types import MessageStreamEvent +from loguru import logger -from vocode.streaming.agent.utils import get_sentence_from_buffer +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.default_factory import DefaultActionFactory +from vocode.streaming.agent.anthropic_utils import format_anthropic_chat_messages_from_transcript +from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent, StreamedResponse +from vocode.streaming.agent.streaming_utils import collate_response_async, stream_response_async +from vocode.streaming.models.actions import FunctionFragment +from vocode.streaming.models.agent import AnthropicAgentConfig +from vocode.streaming.models.message import BaseMessage, LLMToken +from vocode.streaming.vector_db.factory import VectorDBFactory +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span -from langchain import ConversationChain -from langchain.schema import ChatMessage, AIMessage, HumanMessage -from langchain_community.chat_models import ChatAnthropic -import logging -from vocode import getenv -from vocode.streaming.models.agent import ChatAnthropicAgentConfig +class AnthropicAgent(RespondAgent[AnthropicAgentConfig]): + anthropic_client: AsyncAnthropic - -from langchain.prompts import ( - ChatPromptTemplate, - MessagesPlaceholder, - HumanMessagePromptTemplate, -) - -from vocode import getenv -from vocode.streaming.models.agent import ChatAnthropicAgentConfig -from langchain.memory import ConversationBufferMemory - -SENTENCE_ENDINGS = [".", "!", "?"] - - -class ChatAnthropicAgent(RespondAgent[ChatAnthropicAgentConfig]): def __init__( self, - agent_config: ChatAnthropicAgentConfig, - logger: Optional[logging.Logger] = None, - anthropic_api_key: Optional[SecretStr] = None, + agent_config: AnthropicAgentConfig, + action_factory: AbstractActionFactory = DefaultActionFactory(), + vector_db_factory=VectorDBFactory(), + **kwargs, ): - super().__init__(agent_config=agent_config, logger=logger) - import anthropic - - # Convert anthropic_api_key to SecretStr if it's not None and not already a SecretStr - if anthropic_api_key is not None and not isinstance( - anthropic_api_key, SecretStr - ): - anthropic_api_key = SecretStr(anthropic_api_key) - else: - # Retrieve anthropic_api_key from environment variable and convert to SecretStr - env_key = getenv("ANTHROPIC_API_KEY") - if env_key: - anthropic_api_key = SecretStr(env_key) - - if not anthropic_api_key: - raise ValueError( - "ANTHROPIC_API_KEY must be set in environment or passed in as a SecretStr" - ) - self.prompt = ChatPromptTemplate.from_messages( - [ - MessagesPlaceholder(variable_name="history"), - HumanMessagePromptTemplate.from_template("{input}"), - ] + super().__init__( + agent_config=agent_config, + action_factory=action_factory, + **kwargs, ) + self.anthropic_client = AsyncAnthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) - self.llm = ChatAnthropic( - model_name=agent_config.model_name, - anthropic_api_key=anthropic_api_key, - ) + def get_chat_parameters(self, messages: list = [], use_functions: bool = True): + assert self.transcript is not None - # streaming not well supported by langchain, so we will connect directly - self.anthropic_client = ( - anthropic.AsyncAnthropic(api_key=str(anthropic_api_key)) - if agent_config.generate_responses - else None - ) + parameters: dict[str, Any] = { + "messages": messages, + "system": self.agent_config.prompt_preamble, + "max_tokens": self.agent_config.max_tokens, + "temperature": self.agent_config.temperature, + "stream": True, + } - self.memory = ConversationBufferMemory(return_messages=True) - self.memory.chat_memory.messages.append( - HumanMessage(content=self.agent_config.prompt_preamble) - ) - if agent_config.initial_message: - self.memory.chat_memory.messages.append( - AIMessage(content=agent_config.initial_message.text) - ) + parameters["model"] = self.agent_config.model_name - self.conversation = ConversationChain( - memory=self.memory, prompt=self.prompt, llm=self.llm - ) + return parameters - async def respond( + async def token_generator( self, - human_input, - conversation_id: str, - is_interrupt: bool = False, - ) -> Tuple[str, bool]: - text = await self.conversation.apredict(input=human_input) - self.logger.debug(f"LLM response: {text}") - return text, False + gen: AsyncStream[MessageStreamEvent], + ) -> AsyncGenerator[str | FunctionFragment, None]: + async for chunk in gen: + if chunk.type == "content_block_delta" and chunk.delta.type == "text_delta": + yield chunk.delta.text + + async def _get_anthropic_stream(self, chat_parameters: Dict[str, Any]): + return await self.anthropic_client.messages.create(**chat_parameters) async def generate_response( self, human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[Tuple[str, bool], None]: - self.memory.chat_memory.messages.append(HumanMessage(content=human_input)) - - bot_memory_message = AIMessage(content="") - self.memory.chat_memory.messages.append(bot_memory_message) - prompt = self.llm._convert_messages_to_prompt(self.memory.chat_memory.messages) - - if self.anthropic_client: - streamed_response = await self.anthropic_client.completions.create( - prompt=prompt, - max_tokens_to_sample=self.agent_config.max_tokens_to_sample, - model=self.agent_config.model_name, - stream=True, + bot_was_in_medias_res: bool = False, + ) -> AsyncGenerator[GeneratedResponse, None]: + if not self.transcript: + raise ValueError("A transcript is not attached to the agent") + messages = format_anthropic_chat_messages_from_transcript(transcript=self.transcript) + chat_parameters = self.get_chat_parameters(messages) + try: + first_sentence_total_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.LLM_FIRST_SENTENCE_TOTAL + ) + + ttft_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.TIME_TO_FIRST_TOKEN ) + stream = await self._get_anthropic_stream(chat_parameters) + except Exception as e: + logger.error( + f"Error while hitting Anthropic with chat_parameters: {chat_parameters}", + exc_info=True, + ) + raise e + + response_generator = collate_response_async + + using_input_streaming_synthesizer = ( + self.conversation_state_manager.using_input_streaming_synthesizer() + ) + if using_input_streaming_synthesizer: + response_generator = stream_response_async + async for message in response_generator( + conversation_id=conversation_id, + gen=self.token_generator( + stream, + ), + sentry_span=ttft_span, + ): + if first_sentence_total_span: + first_sentence_total_span.finish() - buffer = "" - async for completion in streamed_response: - buffer += completion.completion - sentence, remainder = get_sentence_from_buffer(buffer) - if sentence: - bot_memory_message.content = bot_memory_message.content + sentence - buffer = remainder - yield sentence, True - continue - - def update_last_bot_message_on_cut_off(self, message: str): - for memory_message in self.memory.chat_memory.messages[::-1]: - if ( - isinstance(memory_message, ChatMessage) - and memory_message.role == "assistant" - ) or isinstance(memory_message, AIMessage): - memory_message.content = message - return + ResponseClass = ( + StreamedResponse if using_input_streaming_synthesizer else GeneratedResponse + ) + MessageType = LLMToken if using_input_streaming_synthesizer else BaseMessage + + if isinstance(message, str): + yield ResponseClass( + message=MessageType(text=message), + is_interruptible=True, + ) + else: + yield ResponseClass( + message=message, + is_interruptible=True, + ) diff --git a/vocode/streaming/agent/anthropic_utils.py b/vocode/streaming/agent/anthropic_utils.py new file mode 100644 index 0000000000..2a2e131d2d --- /dev/null +++ b/vocode/streaming/agent/anthropic_utils.py @@ -0,0 +1,29 @@ +from vocode.streaming.agent.openai_utils import merge_event_logs +from vocode.streaming.models.transcript import ActionStart, EventLog, Transcript + + +def format_anthropic_chat_messages_from_transcript( + transcript: Transcript, +) -> list[dict]: + # merge consecutive bot messages + new_event_logs: list[EventLog] = merge_event_logs(event_logs=transcript.event_logs) + + # Removing BOT_ACTION_START so that it doesn't confuse the completion-y prompt, e.g. + # BOT: BOT_ACTION_START: action_end_conversation + # Right now, this version of context does not work for normal actions, only phrase trigger actions + + merged_event_logs_sans_bot_action_start = [ + event_log for event_log in new_event_logs if not isinstance(event_log, ActionStart) + ] + + return [ + { + "role": "user", + "content": Transcript(event_logs=merged_event_logs_sans_bot_action_start).to_string( + include_timestamps=False, + mark_human_backchannels_with_brackets=True, + ), + }, + {"role": "assistant", "content": "BOT:"}, + ] + # TODO: reliably count tokens of Anthropic messages so that we don't exceed the context window diff --git a/vocode/streaming/agent/base_agent.py b/vocode/streaming/agent/base_agent.py index b39d40013d..f6a56a7e77 100644 --- a/vocode/streaming/agent/base_agent.py +++ b/vocode/streaming/agent/base_agent.py @@ -1,59 +1,64 @@ from __future__ import annotations import asyncio -from enum import Enum import json -import logging import random -from typing import ( - AsyncGenerator, - Generator, - Generic, - Optional, - Tuple, - TypeVar, - Union, - TYPE_CHECKING, -) import typing -from opentelemetry import trace -from opentelemetry.trace import Span -from vocode.streaming.action.factory import ActionFactory +from enum import Enum +from typing import TYPE_CHECKING, AsyncGenerator, Dict, Generic, Optional, Tuple, TypeVar, Union + +import sentry_sdk +from loguru import logger +from pydantic.v1 import BaseModel + +from vocode import sentry_span_tags +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.action.default_factory import DefaultActionFactory +from vocode.streaming.action.execute_external_action import ExecuteExternalActionVocodeActionConfig from vocode.streaming.action.phone_call_action import ( - TwilioPhoneCallAction, - VonagePhoneCallAction, + TwilioPhoneConversationAction, + VonagePhoneConversationAction, ) +from vocode.streaming.agent.goodbye import is_goodbye_simple +from vocode.streaming.agent.phrase_trigger import matches_phrase_trigger from vocode.streaming.models.actions import ( ActionConfig, ActionInput, ActionOutput, + EndOfTurn, FunctionCall, - FunctionFragment, ) - -from vocode.streaming.models.agent import ( - AgentConfig, - ChatGPTAgentConfig, - LLMAgentConfig, -) -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.model import BaseModel, TypedModel -from vocode.streaming.transcriber.base_transcriber import Transcription -from vocode.streaming.utils import remove_non_letters_digits -from vocode.streaming.utils.goodbye_model import GoodbyeModel -from vocode.streaming.models.transcript import Transcript +from vocode.streaming.models.agent import AgentConfig, ChatGPTAgentConfig, LLMAgentConfig +from vocode.streaming.models.events import Sender +from vocode.streaming.models.message import BaseMessage, BotBackchannel, SilenceMessage +from vocode.streaming.models.model import TypedModel +from vocode.streaming.models.transcriber import Transcription +from vocode.streaming.models.transcript import Message, Transcript +from vocode.streaming.utils import unrepeating_randomizer +from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.worker import ( InterruptibleAgentResponseEvent, InterruptibleEvent, InterruptibleEventFactory, InterruptibleWorker, ) +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span if TYPE_CHECKING: - from vocode.streaming.utils.state_manager import ConversationStateManager + from vocode.streaming.utils.state_manager import AbstractConversationStateManager -tracer = trace.get_tracer(__name__) AGENT_TRACE_NAME = "agent" +POST_QUESTION_BACKCHANNELS = [ + "Oh okay, got it.", + "Oh, okay, got it.", + "Oh okay got it.", + "Ohhh, okay, got it.", + "Oh got it, okay.", + "Ohhh got it, okay.", + "Ohhh, got it, okay.", + "Oh, got it, okay.", +] class AgentInputType(str, Enum): @@ -62,7 +67,7 @@ class AgentInputType(str, Enum): ACTION_RESULT = "agent_input_action_result" -class AgentInput(TypedModel, type=AgentInputType.BASE.value): +class AgentInput(TypedModel, type=AgentInputType.BASE.value): # type: ignore conversation_id: str vonage_uuid: Optional[str] twilio_sid: Optional[str] @@ -72,11 +77,11 @@ class Config: arbitrary_types_allowed = True -class TranscriptionAgentInput(AgentInput, type=AgentInputType.TRANSCRIPTION.value): +class TranscriptionAgentInput(AgentInput, type=AgentInputType.TRANSCRIPTION.value): # type: ignore transcription: Transcription -class ActionResultAgentInput(AgentInput, type=AgentInputType.ACTION_RESULT.value): +class ActionResultAgentInput(AgentInput, type=AgentInputType.ACTION_RESULT.value): # type: ignore action_input: ActionInput action_output: ActionOutput is_quiet: bool = False @@ -89,25 +94,40 @@ class AgentResponseType(str, Enum): FILLER_AUDIO = "agent_response_filler_audio" -class AgentResponse(TypedModel, type=AgentResponseType.BASE.value): +class AgentResponse(TypedModel, type=AgentResponseType.BASE.value): # type: ignore pass -class AgentResponseMessage(AgentResponse, type=AgentResponseType.MESSAGE.value): - message: BaseMessage +class AgentResponseMessage(AgentResponse, type=AgentResponseType.MESSAGE.value): # type: ignore + message: Union[BaseMessage, EndOfTurn] is_interruptible: bool = True + # Whether the message is the first message in the response; has metrics implications + is_first: bool = False + # If the response is not being chunked up into multiple sentences, this is set to True + is_sole_text_chunk: bool = False -class AgentResponseStop(AgentResponse, type=AgentResponseType.STOP.value): +class AgentResponseStop(AgentResponse, type=AgentResponseType.STOP.value): # type: ignore pass class AgentResponseFillerAudio( - AgentResponse, type=AgentResponseType.FILLER_AUDIO.value + AgentResponse, + type=AgentResponseType.FILLER_AUDIO.value, # type: ignore ): pass +class GeneratedResponse(BaseModel): + message: Union[BaseMessage, FunctionCall, EndOfTurn] + is_interruptible: bool + streamed: bool = False + + +class StreamedResponse(GeneratedResponse): + streamed: bool = True + + AgentConfigType = TypeVar("AgentConfigType", bound=AgentConfig) @@ -124,7 +144,8 @@ def update_last_bot_message_on_cut_off(self, message: str): def get_cut_off_response(self) -> str: assert isinstance(self.agent_config, LLMAgentConfig) or isinstance( - self.agent_config, ChatGPTAgentConfig + self.agent_config, + ChatGPTAgentConfig, ), "Set cutoff response is only implemented in LLMAgent and ChatGPTAgent" assert self.agent_config.cut_off_response is not None on_cut_off_messages = self.agent_config.cut_off_response.messages @@ -136,16 +157,13 @@ class BaseAgent(AbstractAgent[AgentConfigType], InterruptibleWorker): def __init__( self, agent_config: AgentConfigType, - action_factory: ActionFactory = ActionFactory(), + action_factory: AbstractActionFactory = DefaultActionFactory(), interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), - logger: Optional[logging.Logger] = None, ): - self.input_queue: asyncio.Queue[InterruptibleEvent[AgentInput]] = ( + self.input_queue: asyncio.Queue[InterruptibleEvent[AgentInput]] = asyncio.Queue() + self.output_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]] = ( asyncio.Queue() ) - self.output_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[AgentResponse] - ] = asyncio.Queue() AbstractAgent.__init__(self, agent_config=agent_config) InterruptibleWorker.__init__( self, @@ -154,21 +172,16 @@ def __init__( interruptible_event_factory=interruptible_event_factory, ) self.action_factory = action_factory - self.actions_queue: asyncio.Queue[InterruptibleEvent[ActionInput]] = ( - asyncio.Queue() - ) - self.logger = logger or logging.getLogger(__name__) - self.goodbye_model = None - if self.agent_config.end_conversation_on_goodbye: - self.goodbye_model = GoodbyeModel() - self.goodbye_model_initialize_task = asyncio.create_task( - self.goodbye_model.initialize_embeddings() - ) + self.actions_queue: asyncio.Queue[InterruptibleEvent[ActionInput]] = asyncio.Queue() self.transcript: Optional[Transcript] = None self.functions = self.get_functions() if self.agent_config.actions else None self.is_muted = False + self.post_question_bot_backchannel_randomizer = unrepeating_randomizer( + POST_QUESTION_BACKCHANNELS, + ) + def get_functions(self): raise NotImplementedError @@ -176,10 +189,20 @@ def attach_transcript(self, transcript: Transcript): self.transcript = transcript def attach_conversation_state_manager( - self, conversation_state_manager: ConversationStateManager + self, + conversation_state_manager: AbstractConversationStateManager, ): self.conversation_state_manager = conversation_state_manager + def attach_speed_manager(self, speed_manager: SpeedManager): + self.speed_manager = speed_manager + + def _get_speed_adjusted_silence_seconds(self, seconds: float) -> float: + speed_coefficient = ( + self.speed_manager.get_speed_coefficient() if self.speed_manager is not None else 1.0 + ) + return seconds / speed_coefficient + def set_interruptible_event_factory(self, factory: InterruptibleEventFactory): self.interruptible_event_factory = factory @@ -193,62 +216,161 @@ def get_output_queue( ) -> asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]]: return self.output_queue - def create_goodbye_detection_task(self, message: str) -> asyncio.Task: - assert self.goodbye_model is not None - return asyncio.create_task(self.goodbye_model.is_goodbye(message)) + def is_first_response(self): + assert self.transcript is not None + + num_bot_messages = sum( + 1 + for event_log in self.transcript.event_logs + if isinstance(event_log, Message) and event_log.sender == Sender.BOT + ) + + return num_bot_messages <= (1 if self.agent_config.initial_message is not None else 0) class RespondAgent(BaseAgent[AgentConfigType]): + async def _maybe_prepend_interrupt_responses( + self, + transcription: Transcription, + responses_stream: AsyncGenerator[GeneratedResponse, None], + ) -> AsyncGenerator[GeneratedResponse, None]: + if transcription.is_interrupt: + if self.agent_config.cut_off_response: + cut_off_response = self.get_cut_off_response() + yield GeneratedResponse( + message=BaseMessage(text=cut_off_response), + is_interruptible=False, + ) + return + if transcription.bot_was_in_medias_res: + silence_message = SilenceMessage() + silence_message.trailing_silence_seconds = self._get_speed_adjusted_silence_seconds( + silence_message.trailing_silence_seconds + ) + yield GeneratedResponse(message=silence_message, is_interruptible=True) + async for response in responses_stream: + yield response + async def handle_generate_response( - self, transcription: Transcription, agent_input: AgentInput + self, + transcription: Transcription, + agent_input: AgentInput, ) -> bool: conversation_id = agent_input.conversation_id - tracer_name_start = await self.get_tracer_name_start() - agent_span = tracer.start_span( - f"{tracer_name_start}.generate_total" # type: ignore - ) - agent_span_first = tracer.start_span( - f"{tracer_name_start}.generate_first" # type: ignore + responses = self._maybe_prepend_interrupt_responses( + transcription=transcription, + responses_stream=self.generate_response( + transcription.message, + is_interrupt=transcription.is_interrupt, + conversation_id=conversation_id, + bot_was_in_medias_res=transcription.bot_was_in_medias_res, + ), ) - responses = self.generate_response( - transcription.message, - is_interrupt=transcription.is_interrupt, - conversation_id=conversation_id, - ) - is_first_response = True + is_first_response_of_turn = True function_call = None - async for response, is_interruptible in responses: - if isinstance(response, FunctionCall): - function_call = response + + responses_buffer = "" + end_of_turn_agent_response_tracker = None + + async for generated_response in responses: + if is_first_response_of_turn: + message_type = "UNKNOWN" + match generated_response.message: + case SilenceMessage(): # type: ignore[misc] + message_type = "silence" + case BotBackchannel(): # type: ignore[misc] + message_type = "backchannel" + case BaseMessage(): # type: ignore[misc] + message_type = "message" + case FunctionCall(): # type: ignore[misc] + message_type = "function_call" + case _: + logger.warning( + "Unknown message type received for Sentry metrics " + f"reporting: {type(generated_response.message)}", + ) + span_tags = sentry_span_tags.value + if span_tags: + span_tags["message_type"] = message_type + sentry_span_tags.set(span_tags) + + if isinstance(generated_response.message, FunctionCall): + function_call = generated_response.message continue - if is_first_response: - agent_span_first.end() - is_first_response = False + + agent_response_tracker = agent_input.agent_response_tracker or asyncio.Event() self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=BaseMessage(text=response)), + AgentResponseMessage( + message=generated_response.message, + is_first=is_first_response_of_turn, + ), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off + and generated_response.is_interruptible, + agent_response_tracker=agent_response_tracker, + ) + if isinstance(generated_response.message, BaseMessage): + responses_buffer = f"{responses_buffer} {generated_response.message.text}" + elif isinstance(generated_response.message, EndOfTurn): + end_of_turn_agent_response_tracker = agent_response_tracker + + if self.agent_config.end_conversation_on_goodbye and isinstance( + generated_response.message, + BaseMessage, + ): + if is_goodbye_simple( + message=generated_response.message.text, + phrases=self.agent_config.goodbye_phrases, + ): + logger.debug("Simple goodbye detected, ending conversation") + return True + is_first_response_of_turn = False + + # if the client (the implemented agent) doesn't create an EndOfTurn, then we need to create one + if not end_of_turn_agent_response_tracker: + end_of_turn_agent_response_tracker = ( + agent_input.agent_response_tracker or asyncio.Event() + ) + self.produce_interruptible_agent_response_event_nonblocking( + AgentResponseMessage( + message=EndOfTurn(), + is_first=is_first_response_of_turn, + ), is_interruptible=self.agent_config.allow_agent_to_be_cut_off - and is_interruptible, - agent_response_tracker=agent_input.agent_response_tracker, + and generated_response.is_interruptible, + agent_response_tracker=end_of_turn_agent_response_tracker, + ) + + phrase_trigger_match = ( + matches_phrase_trigger(responses_buffer, self.agent_config.actions) + if self.agent_config.actions + else None + ) + if phrase_trigger_match: + action_config = self._get_action_config(phrase_trigger_match) + assert action_config is not None + action = self.action_factory.create_action(action_config) + action_input = self.create_action_input( + action, + agent_input, + {}, + end_of_turn_agent_response_tracker, ) + self.enqueue_action_input(action, action_input, agent_input.conversation_id) + # TODO: implement should_stop for generate_responses - agent_span.end() if function_call and self.agent_config.actions is not None: await self.call_function(function_call, agent_input) return False - async def handle_respond( - self, transcription: Transcription, conversation_id: str - ) -> bool: + async def handle_respond(self, transcription: Transcription, conversation_id: str) -> bool: try: - tracer_name_start = await self.get_tracer_name_start() - with tracer.start_as_current_span(f"{tracer_name_start}.respond_total"): - response, should_stop = await self.respond( - transcription.message, - is_interrupt=transcription.is_interrupt, - conversation_id=conversation_id, - ) + response, should_stop = await self.respond( + transcription.message, + is_interrupt=transcription.is_interrupt, + conversation_id=conversation_id, + ) except Exception as e: - self.logger.error(f"Error while generating response: {e}", exc_info=True) + logger.error(f"Error while generating response: {e}", exc_info=True) response = None return True if response: @@ -256,22 +378,21 @@ async def handle_respond( AgentResponseMessage(message=BaseMessage(text=response)), is_interruptible=self.agent_config.allow_agent_to_be_cut_off, ) + self.produce_interruptible_agent_response_event_nonblocking( + AgentResponseMessage(message=EndOfTurn()), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + ) return should_stop else: - self.logger.debug("No response generated") + logger.debug("No response generated") return False async def process(self, item: InterruptibleEvent[AgentInput]): - if self.is_muted: - self.logger.debug("Agent is muted, skipping processing") - return assert self.transcript is not None try: agent_input = item.payload if isinstance(agent_input, TranscriptionAgentInput): - transcription = typing.cast( - TranscriptionAgentInput, agent_input - ).transcription + transcription = typing.cast(TranscriptionAgentInput, agent_input).transcription self.transcript.add_human_message( text=transcription.message, conversation_id=agent_input.conversation_id, @@ -284,7 +405,19 @@ async def process(self, item: InterruptibleEvent[AgentInput]): ) if agent_input.is_quiet: # Do not generate a response to quiet actions - self.logger.debug("Action is quiet, skipping response generation") + logger.debug("Action is quiet, skipping response generation") + return + if agent_input.action_output.canned_response is not None: + self.produce_interruptible_agent_response_event_nonblocking( + AgentResponseMessage( + message=agent_input.action_output.canned_response, + is_sole_text_chunk=True, + ), + is_interruptible=True, + ) + self.produce_interruptible_agent_response_event_nonblocking( + AgentResponseMessage(message=EndOfTurn()), + ) return transcription = Transcription( message=agent_input.action_output.response.json(), @@ -294,45 +427,32 @@ async def process(self, item: InterruptibleEvent[AgentInput]): else: raise ValueError("Invalid AgentInput type") - goodbye_detected_task = None - if self.agent_config.end_conversation_on_goodbye: - goodbye_detected_task = self.create_goodbye_detection_task( - transcription.message - ) + if self.is_muted: + logger.debug("Agent is muted, skipping processing") + return + if self.agent_config.send_filler_audio: self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseFillerAudio() + AgentResponseFillerAudio(), ) - self.logger.debug("Responding to transcription") + + logger.debug("Responding to transcription") should_stop = False if self.agent_config.generate_responses: - should_stop = await self.handle_generate_response( - transcription, agent_input - ) + # TODO (EA): this is quite ugly but necessary to have the agent act properly after an action completes + if not isinstance(agent_input, ActionResultAgentInput): + sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=CustomSentrySpans.LANGUAGE_MODEL_TIME_TO_FIRST_TOKEN, + ) + should_stop = await self.handle_generate_response(transcription, agent_input) else: - should_stop = await self.handle_respond( - transcription, agent_input.conversation_id - ) + should_stop = await self.handle_respond(transcription, agent_input.conversation_id) if should_stop: - self.logger.debug("Agent requested to stop") - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseStop() - ) + logger.debug("Agent requested to stop") + self.produce_interruptible_agent_response_event_nonblocking(AgentResponseStop()) return - if goodbye_detected_task: - try: - goodbye_detected = await asyncio.wait_for( - goodbye_detected_task, 0.1 - ) - if goodbye_detected: - self.logger.debug("Goodbye detected, ending conversation") - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseStop() - ) - return - except asyncio.TimeoutError: - self.logger.debug("Goodbye detection timed out") except asyncio.CancelledError: pass @@ -340,16 +460,17 @@ def _get_action_config(self, function_name: str) -> Optional[ActionConfig]: if self.agent_config.actions is None: return None for action_config in self.agent_config.actions: - if action_config.type == function_name: + if action_config.type == function_name or ( + isinstance(action_config, ExecuteExternalActionVocodeActionConfig) + and action_config.name == function_name + ): return action_config return None async def call_function(self, function_call: FunctionCall, agent_input: AgentInput): action_config = self._get_action_config(function_call.name) if action_config is None: - self.logger.error( - f"Function {function_call.name} not found in agent config, skipping" - ) + logger.error(f"Function {function_call.name} not found in agent config, skipping") return action = self.action_factory.create_action(action_config) params = json.loads(function_call.arguments) @@ -358,25 +479,42 @@ async def call_function(self, function_call: FunctionCall, agent_input: AgentInp user_message = params["user_message"] user_message_tracker = asyncio.Event() self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=BaseMessage(text=user_message)), + AgentResponseMessage( + message=BaseMessage(text=user_message), + is_sole_text_chunk=True, + ), + is_interruptible=action.is_interruptible, + ) + self.produce_interruptible_agent_response_event_nonblocking( + AgentResponseMessage(message=EndOfTurn()), agent_response_tracker=user_message_tracker, ) + action_input = self.create_action_input(action, agent_input, params, user_message_tracker) + self.enqueue_action_input(action, action_input, agent_input.conversation_id) + + def create_action_input( + self, + action: BaseAction, + agent_input: AgentInput, + params: Dict, + user_message_tracker: Optional[asyncio.Event] = None, + ) -> ActionInput: action_input: ActionInput - if isinstance(action, VonagePhoneCallAction): + if isinstance(action, VonagePhoneConversationAction): assert ( agent_input.vonage_uuid is not None - ), "Cannot use VonagePhoneCallActionFactory unless the attached conversation is a VonageCall" - action_input = action.create_phone_call_action_input( + ), "Cannot use VonagePhoneConversationActionFactory unless the attached conversation is a VonagePhoneConversation" + action_input = action.create_phone_conversation_action_input( agent_input.conversation_id, params, agent_input.vonage_uuid, user_message_tracker, ) - elif isinstance(action, TwilioPhoneCallAction): + elif isinstance(action, TwilioPhoneConversationAction): assert ( agent_input.twilio_sid is not None - ), "Cannot use TwilioPhoneCallActionFactory unless the attached conversation is a TwilioCall" - action_input = action.create_phone_call_action_input( + ), "Cannot use TwilioPhoneConversationActionFactory unless the attached conversation is a TwilioPhoneConversation" + action_input = action.create_phone_conversation_action_input( agent_input.conversation_id, params, agent_input.twilio_sid, @@ -388,40 +526,25 @@ async def call_function(self, function_call: FunctionCall, agent_input: AgentInp params, user_message_tracker, ) + return action_input + + def enqueue_action_input( + self, + action: BaseAction, + action_input: ActionInput, + conversation_id: str, + ): event = self.interruptible_event_factory.create_interruptible_event( - action_input, is_interruptible=action.is_interruptible + action_input, + is_interruptible=action.is_interruptible, ) assert self.transcript is not None self.transcript.add_action_start_log( action_input=action_input, - conversation_id=agent_input.conversation_id, + conversation_id=conversation_id, ) self.actions_queue.put_nowait(event) - async def get_tracer_name_start(self) -> str: - if hasattr(self, "tracer_name_start"): - return self.tracer_name_start - if ( - hasattr(self.agent_config, "azure_params") - and self.agent_config.azure_params is not None - ): - beginning_agent_name = self.agent_config.type.rsplit("_", 1)[0] - engine = self.agent_config.azure_params.engine - tracer_name_start = ( - f"{AGENT_TRACE_NAME}.{beginning_agent_name}_azuregpt-{engine}" - ) - else: - optional_model_name = ( - f"-{self.agent_config.model_name}" - if hasattr(self.agent_config, "model_name") - else "" - ) - tracer_name_start = remove_non_letters_digits( - f"{AGENT_TRACE_NAME}.{self.agent_config.type}{optional_model_name}" - ) - self.tracer_name_start: str = tracer_name_start - return tracer_name_start - async def respond( self, human_input, @@ -435,7 +558,9 @@ def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, + bot_was_in_medias_res: bool = False, ) -> AsyncGenerator[ - Tuple[Union[str, FunctionCall], bool], None + GeneratedResponse, + None, ]: # tuple of the content and whether it is interruptible raise NotImplementedError diff --git a/vocode/streaming/agent/bot_sentiment_analyser.py b/vocode/streaming/agent/bot_sentiment_analyser.py deleted file mode 100644 index ed2ed14903..0000000000 --- a/vocode/streaming/agent/bot_sentiment_analyser.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import List, Optional -from langchain_community.llms import OpenAI -from langchain.prompts import PromptTemplate -from pydantic.v1 import BaseModel - -from vocode import getenv - -TEMPLATE = """ -Read the following conversation classify the final emotion of the Bot as one of [{emotions}]. -Output the degree of emotion as a value between 0 and 1 in the format EMOTION,DEGREE: ex. {example_emotion},0.5 - - -{{transcript}} - -""" - - -class BotSentiment(BaseModel): - emotion: Optional[str] = None - degree: float = 0.0 - - -class BotSentimentAnalyser: - def __init__( - self, - emotions: List[str], - model_name: str = "text-davinci-003", - openai_api_key: Optional[str] = None, - ): - self.model_name = model_name - openai_api_key = openai_api_key or getenv("OPENAI_API_KEY") - if not openai_api_key: - raise ValueError("OPENAI_API_KEY must be set in environment or passed in") - self.llm = OpenAI(model_name=self.model_name, openai_api_key=openai_api_key) # type: ignore - assert len(emotions) > 0 - self.emotions = [e.lower() for e in emotions] - self.prompt = PromptTemplate( - input_variables=["transcript"], - template=TEMPLATE.format( - emotions=",".join(self.emotions), example_emotion=self.emotions[0] - ), - ) - - async def analyse(self, transcript: str) -> BotSentiment: - prompt = self.prompt.format(transcript=transcript) - response = (await self.llm.agenerate([prompt])).generations[0][0].text.strip() - tokens = response.split(",") - if len(tokens) != 2: - return BotSentiment(emotion=None, degree=0.0) - emotion, degree = tokens - emotion = emotion.strip().lower() - if emotion.lower() not in self.emotions: - return BotSentiment(emotion=None, degree=0.0) - try: - parsed_degree = float(degree.strip()) - except ValueError: - return BotSentiment(emotion=emotion, degree=0.5) - return BotSentiment(emotion=emotion, degree=parsed_degree) diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 4afacf2492..047aa6c90e 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -1,64 +1,75 @@ -import logging +import os +import random +from typing import Any, AsyncGenerator, Dict, List, Optional, TypeVar, Union -from typing import Any, Dict, List, Optional, Tuple, Union +import sentry_sdk +from loguru import logger +from openai import DEFAULT_MAX_RETRIES as OPENAI_DEFAULT_MAX_RETRIES +from openai import AsyncAzureOpenAI, AsyncOpenAI, NotFoundError, RateLimitError -import openai -from typing import AsyncGenerator, Optional, Tuple - -import logging -from pydantic.v1 import BaseModel - -from vocode import getenv -from vocode.streaming.action.factory import ActionFactory -from vocode.streaming.agent.base_agent import RespondAgent -from vocode.streaming.models.actions import FunctionCall, FunctionFragment -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.agent.utils import ( +from vocode import sentry_span_tags +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.default_factory import DefaultActionFactory +from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent, StreamedResponse +from vocode.streaming.agent.openai_utils import ( format_openai_chat_messages_from_transcript, - collate_response_async, openai_get_tokens, vector_db_result_to_openai_chat_message, ) +from vocode.streaming.agent.streaming_utils import collate_response_async, stream_response_async +from vocode.streaming.models.actions import FunctionCallActionTrigger +from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.events import Sender -from vocode.streaming.models.transcript import Transcript +from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken +from vocode.streaming.models.transcript import Message from vocode.streaming.vector_db.factory import VectorDBFactory +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span +ChatGPTAgentConfigType = TypeVar("ChatGPTAgentConfigType", bound=ChatGPTAgentConfig) + + +def instantiate_openai_client(agent_config: ChatGPTAgentConfig, model_fallback: bool = False): + if agent_config.azure_params: + return AsyncAzureOpenAI( + azure_endpoint=agent_config.azure_params.base_url, + api_key=agent_config.azure_params.api_key, + api_version=agent_config.azure_params.api_version, + max_retries=0 if model_fallback else OPENAI_DEFAULT_MAX_RETRIES, + ) + else: + if agent_config.openai_api_key is not None: + logger.info("Using OpenAI API key override") + return AsyncOpenAI( + api_key=agent_config.openai_api_key or os.environ["OPENAI_API_KEY"], + base_url="https://api.openai.com/v1", + max_retries=0 if model_fallback else OPENAI_DEFAULT_MAX_RETRIES, + ) + + +class ChatGPTAgent(RespondAgent[ChatGPTAgentConfigType]): + openai_client: Union[AsyncOpenAI, AsyncAzureOpenAI] -class ChatGPTAgent(RespondAgent[ChatGPTAgentConfig]): def __init__( self, - agent_config: ChatGPTAgentConfig, - action_factory: ActionFactory = ActionFactory(), - logger: Optional[logging.Logger] = None, - openai_api_key: Optional[str] = None, + agent_config: ChatGPTAgentConfigType, + action_factory: AbstractActionFactory = DefaultActionFactory(), vector_db_factory=VectorDBFactory(), + **kwargs, ): super().__init__( - agent_config=agent_config, action_factory=action_factory, logger=logger + agent_config=agent_config, + action_factory=action_factory, + **kwargs, ) - if agent_config.azure_params: - openai.api_type = agent_config.azure_params.api_type - openai.api_base = getenv("AZURE_OPENAI_API_BASE") - openai.api_version = agent_config.azure_params.api_version - openai.api_key = getenv("AZURE_OPENAI_API_KEY") - else: - openai.api_type = "open_ai" - openai.api_base = "https://api.openai.com/v1" - openai.api_version = None - openai.api_key = openai_api_key or getenv("OPENAI_API_KEY") - if not openai.api_key: - raise ValueError("OPENAI_API_KEY must be set in environment or passed in") - self.first_response = ( - self.create_first_response(agent_config.expected_first_prompt) - if agent_config.expected_first_prompt - else None + self.openai_client = instantiate_openai_client( + agent_config, model_fallback=agent_config.llm_fallback is not None ) - self.is_first_response = True + + if not self.openai_client.api_key: + raise ValueError("OPENAI_API_KEY must be set in environment or passed in") if self.agent_config.vector_db_config: - self.vector_db = vector_db_factory.create_vector_db( - self.agent_config.vector_db_config - ) + self.vector_db = vector_db_factory.create_vector_db(self.agent_config.vector_db_config) def get_functions(self): assert self.agent_config.actions @@ -67,14 +78,18 @@ def get_functions(self): return [ self.action_factory.create_action(action_config).get_openai_function() for action_config in self.agent_config.actions + if isinstance(action_config.action_trigger, FunctionCallActionTrigger) ] - def get_chat_parameters( - self, messages: Optional[List] = None, use_functions: bool = True - ): + def get_chat_parameters(self, messages: Optional[List] = None, use_functions: bool = True): assert self.transcript is not None + is_azure = self._is_azure_model() + messages = messages or format_openai_chat_messages_from_transcript( - self.transcript, self.agent_config.prompt_preamble + self.transcript, + self.get_model_name_for_tokenizer(), + self.functions, + self.agent_config.prompt_preamble, ) parameters: Dict[str, Any] = { @@ -83,8 +98,9 @@ def get_chat_parameters( "temperature": self.agent_config.temperature, } - if self.agent_config.azure_params is not None: - parameters["engine"] = self.agent_config.azure_params.engine + if is_azure: + assert self.agent_config.azure_params is not None + parameters["model"] = self.agent_config.azure_params.deployment_name else: parameters["model"] = self.agent_config.model_name @@ -93,54 +109,94 @@ def get_chat_parameters( return parameters - def create_first_response(self, first_prompt): - messages = [ - ( - [{"role": "system", "content": self.agent_config.prompt_preamble}] - if self.agent_config.prompt_preamble - else [] - ) - + [{"role": "user", "content": first_prompt}] - ] + def _is_azure_model(self) -> bool: + return self.agent_config.azure_params is not None - parameters = self.get_chat_parameters(messages) - return openai.ChatCompletion.create(**parameters) + def get_model_name_for_tokenizer(self): + if not self.agent_config.azure_params: + return self.agent_config.model_name + else: + return self.agent_config.azure_params.openai_model_name + + def apply_model_fallback(self, chat_parameters: Dict[str, Any]): + if self.agent_config.llm_fallback is None: + return + if self.agent_config.llm_fallback.provider == "openai": + self.agent_config.model_name = self.agent_config.llm_fallback.model_name + if isinstance(self.openai_client, AsyncAzureOpenAI): + self.agent_config.azure_params = None + else: + if self.agent_config.azure_params: + self.agent_config.azure_params.deployment_name = ( + self.agent_config.llm_fallback.model_name + ) + if isinstance(self.openai_client, AsyncOpenAI): + # TODO: handle OpenAI fallback to Azure + pass - def attach_transcript(self, transcript: Transcript): - self.transcript = transcript + self.openai_client = instantiate_openai_client(self.agent_config, model_fallback=False) + chat_parameters["model"] = self.agent_config.llm_fallback.model_name - async def respond( - self, - human_input, - conversation_id: str, - is_interrupt: bool = False, - ) -> Tuple[str, bool]: - assert self.transcript is not None - if is_interrupt and self.agent_config.cut_off_response: - cut_off_response = self.get_cut_off_response() - return cut_off_response, False - self.logger.debug("LLM responding to human input") - if self.is_first_response and self.first_response: - self.logger.debug("First response is cached") - self.is_first_response = False - text = self.first_response + async def _create_openai_stream_with_fallback( + self, chat_parameters: Dict[str, Any] + ) -> AsyncGenerator: + try: + stream = await self.openai_client.chat.completions.create(**chat_parameters) + except (NotFoundError, RateLimitError) as e: + logger.error( + f"{'Model not found' if isinstance(e, NotFoundError) else 'Rate limit error'} for model_name: {chat_parameters.get('model')}. Applying fallback.", + exc_info=True, + ) + self.apply_model_fallback(chat_parameters) + stream = await self.openai_client.chat.completions.create(**chat_parameters) + except Exception as e: + logger.error( + f"Error while hitting OpenAI with chat_parameters: {chat_parameters}", + exc_info=True, + ) + raise e + return stream + + async def _create_openai_stream(self, chat_parameters: Dict[str, Any]) -> AsyncGenerator: + if self.agent_config.llm_fallback is not None and self.openai_client.max_retries == 0: + stream = await self._create_openai_stream_with_fallback(chat_parameters) else: - chat_parameters = self.get_chat_parameters() - chat_completion = await openai.ChatCompletion.acreate(**chat_parameters) - text = chat_completion.choices[0].message.content - self.logger.debug(f"LLM response: {text}") - return text, False + try: + stream = await self.openai_client.chat.completions.create(**chat_parameters) + except Exception as e: + logger.error( + f"Error while hitting OpenAI with chat_parameters: {chat_parameters}", + exc_info=True, + ) + raise e + return stream + + def should_backchannel(self, human_input: str) -> bool: + return ( + not self.is_first_response() + and not human_input.strip().endswith("?") + and random.random() < self.agent_config.backchannel_probability + ) + + def choose_backchannel(self) -> Optional[BotBackchannel]: + backchannel = None + if self.transcript is not None: + last_bot_message: Optional[Message] = None + for event_log in self.transcript.event_logs[::-1]: + if isinstance(event_log, Message) and event_log.sender == Sender.BOT: + last_bot_message = event_log + break + if last_bot_message and last_bot_message.text.strip().endswith("?"): + return BotBackchannel(text=self.post_question_bot_backchannel_randomizer()) + return backchannel async def generate_response( self, human_input: str, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[Tuple[Union[str, FunctionCall], bool], None]: - if is_interrupt and self.agent_config.cut_off_response: - cut_off_response = self.get_cut_off_response() - yield cut_off_response, False - return + bot_was_in_medias_res: bool = False, + ) -> AsyncGenerator[GeneratedResponse, None]: assert self.transcript is not None chat_parameters = {} @@ -158,22 +214,90 @@ async def generate_response( for doc in docs_with_scores ] ) - vector_db_result = f"Found {len(docs_with_scores)} similar documents:\n{docs_with_scores_str}" - messages = format_openai_chat_messages_from_transcript( - self.transcript, self.agent_config.prompt_preamble + vector_db_result = ( + f"Found {len(docs_with_scores)} similar documents:\n{docs_with_scores_str}" ) - messages.insert( - -1, vector_db_result_to_openai_chat_message(vector_db_result) + messages = format_openai_chat_messages_from_transcript( + self.transcript, + self.agent_config.model_name, + self.functions, + self.agent_config.prompt_preamble, ) + messages.insert(-1, vector_db_result_to_openai_chat_message(vector_db_result)) chat_parameters = self.get_chat_parameters(messages) except Exception as e: - self.logger.error(f"Error while hitting vector db: {e}", exc_info=True) + logger.error(f"Error while hitting vector db: {e}", exc_info=True) chat_parameters = self.get_chat_parameters() else: chat_parameters = self.get_chat_parameters() chat_parameters["stream"] = True - stream = await openai.ChatCompletion.acreate(**chat_parameters) - async for message in collate_response_async( - openai_get_tokens(stream), get_functions=True + + openai_chat_messages: List = chat_parameters.get("messages", []) + + backchannelled = "false" + backchannel: Optional[BotBackchannel] = None + if ( + self.agent_config.use_backchannels + and not bot_was_in_medias_res + and self.should_backchannel(human_input) ): - yield message, True + backchannel = self.choose_backchannel() + elif self.agent_config.first_response_filler_message and self.is_first_response(): + backchannel = BotBackchannel(text=self.agent_config.first_response_filler_message) + + if backchannel is not None: + # The LLM needs the backchannel context manually - otherwise we're in a race condition + # between sending the response and generating ChatGPT's response + openai_chat_messages.append({"role": "assistant", "content": backchannel.text}) + yield GeneratedResponse( + message=backchannel, + is_interruptible=True, + ) + backchannelled = "true" + + span_tags = sentry_span_tags.value + if span_tags: + span_tags["prior_backchannel"] = backchannelled + sentry_span_tags.set(span_tags) + + first_sentence_total_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.LLM_FIRST_SENTENCE_TOTAL + ) + + ttft_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.TIME_TO_FIRST_TOKEN + ) + + stream = await self._create_openai_stream(chat_parameters) + + response_generator = collate_response_async + using_input_streaming_synthesizer = ( + self.conversation_state_manager.using_input_streaming_synthesizer() + ) + if using_input_streaming_synthesizer: + response_generator = stream_response_async + async for message in response_generator( + conversation_id=conversation_id, + gen=openai_get_tokens( + stream, + ), + get_functions=True, + sentry_span=ttft_span, + ): + if first_sentence_total_span: + first_sentence_total_span.finish() + + ResponseClass = ( + StreamedResponse if using_input_streaming_synthesizer else GeneratedResponse + ) + MessageType = LLMToken if using_input_streaming_synthesizer else BaseMessage + if isinstance(message, str): + yield ResponseClass( + message=MessageType(text=message), + is_interruptible=True, + ) + else: + yield ResponseClass( + message=message, + is_interruptible=True, + ) diff --git a/vocode/streaming/agent/default_factory.py b/vocode/streaming/agent/default_factory.py new file mode 100644 index 0000000000..7a05c842af --- /dev/null +++ b/vocode/streaming/agent/default_factory.py @@ -0,0 +1,26 @@ +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.agent.anthropic_agent import AnthropicAgent +from vocode.streaming.agent.base_agent import BaseAgent +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.agent.echo_agent import EchoAgent +from vocode.streaming.agent.restful_user_implemented_agent import RESTfulUserImplementedAgent +from vocode.streaming.models.agent import ( + AgentConfig, + AnthropicAgentConfig, + ChatGPTAgentConfig, + EchoAgentConfig, + RESTfulUserImplementedAgentConfig, +) + + +class DefaultAgentFactory(AbstractAgentFactory): + def create_agent(self, agent_config: AgentConfig) -> BaseAgent: + if isinstance(agent_config, ChatGPTAgentConfig): + return ChatGPTAgent(agent_config=agent_config) + elif isinstance(agent_config, EchoAgentConfig): + return EchoAgent(agent_config=agent_config) + elif isinstance(agent_config, RESTfulUserImplementedAgentConfig): + return RESTfulUserImplementedAgent(agent_config=agent_config) + elif isinstance(agent_config, AnthropicAgentConfig): + return AnthropicAgent(agent_config=agent_config) + raise Exception("Invalid agent config", agent_config.type) diff --git a/vocode/streaming/agent/echo_agent.py b/vocode/streaming/agent/echo_agent.py index cd4930dffd..0109257738 100644 --- a/vocode/streaming/agent/echo_agent.py +++ b/vocode/streaming/agent/echo_agent.py @@ -1,6 +1,8 @@ -from typing import AsyncGenerator, Generator, Optional, Tuple -from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent +from typing import AsyncGenerator, Tuple + +from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent from vocode.streaming.models.agent import EchoAgentConfig +from vocode.streaming.models.message import BaseMessage class EchoAgent(RespondAgent[EchoAgentConfig]): @@ -17,8 +19,9 @@ async def generate_response( human_input, conversation_id: str, is_interrupt: bool = False, - ) -> AsyncGenerator[Tuple[str, bool], None]: - yield human_input, True + bot_was_in_medias_res: bool = False, + ) -> AsyncGenerator[GeneratedResponse, None]: + yield GeneratedResponse(message=BaseMessage(text=human_input), is_interruptible=True) def update_last_bot_message_on_cut_off(self, message: str): pass diff --git a/vocode/streaming/agent/factory.py b/vocode/streaming/agent/factory.py deleted file mode 100644 index 6acd75af10..0000000000 --- a/vocode/streaming/agent/factory.py +++ /dev/null @@ -1,45 +0,0 @@ -import logging -from typing import Optional -import typing -from vocode.streaming.agent.anthropic_agent import ChatAnthropicAgent -from vocode.streaming.agent.base_agent import BaseAgent -from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent -from vocode.streaming.agent.echo_agent import EchoAgent -from vocode.streaming.agent.information_retrieval_agent import InformationRetrievalAgent -from vocode.streaming.agent.llm_agent import LLMAgent -from vocode.streaming.agent.restful_user_implemented_agent import ( - RESTfulUserImplementedAgent, -) -from vocode.streaming.agent.llamacpp_agent import LlamacppAgent -from vocode.streaming.models.agent import ( - AgentConfig, - AgentType, - ChatAnthropicAgentConfig, - ChatGPTAgentConfig, - EchoAgentConfig, - InformationRetrievalAgentConfig, - LLMAgentConfig, - RESTfulUserImplementedAgentConfig, - LlamacppAgentConfig, -) - - -class AgentFactory: - def create_agent( - self, agent_config: AgentConfig, logger: Optional[logging.Logger] = None - ) -> BaseAgent: - if isinstance(agent_config, LLMAgentConfig): - return LLMAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, ChatGPTAgentConfig): - return ChatGPTAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, EchoAgentConfig): - return EchoAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, InformationRetrievalAgentConfig): - return InformationRetrievalAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, RESTfulUserImplementedAgentConfig): - return RESTfulUserImplementedAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, ChatAnthropicAgentConfig): - return ChatAnthropicAgent(agent_config=agent_config, logger=logger) - elif isinstance(agent_config, LlamacppAgentConfig): - return LlamacppAgent(agent_config=agent_config, logger=logger) - raise Exception("Invalid agent config", agent_config.type) diff --git a/vocode/streaming/agent/goodbye.py b/vocode/streaming/agent/goodbye.py new file mode 100644 index 0000000000..840469c801 --- /dev/null +++ b/vocode/streaming/agent/goodbye.py @@ -0,0 +1,13 @@ +import re +from typing import List, Optional + +_GOODBYE_PHRASES = [ + "bye", +] + + +def is_goodbye_simple(message: str, phrases: Optional[List[str]]): + if not phrases: + phrases = _GOODBYE_PHRASES + cleaned = re.sub(r"[^\w\s]", "", message.lower()) + return any(phrase in cleaned for phrase in phrases) diff --git a/vocode/streaming/agent/gpt4all_agent.py b/vocode/streaming/agent/gpt4all_agent.py index 61087fb8f3..f87d8d24f9 100644 --- a/vocode/streaming/agent/gpt4all_agent.py +++ b/vocode/streaming/agent/gpt4all_agent.py @@ -1,8 +1,11 @@ from typing import Optional, Tuple -from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent + +from vocode.streaming.agent.base_agent import RespondAgent from vocode.streaming.models.agent import GPT4AllAgentConfig from vocode.turn_based.agent.gpt4all_agent import GPT4AllAgent as TurnBasedGPT4AllAgent +raise DeprecationWarning("This Agent is deprecated and will be removed in the future.") + class GPT4AllAgent(RespondAgent[GPT4AllAgentConfig]): def __init__(self, agent_config: GPT4AllAgentConfig): @@ -11,9 +14,7 @@ def __init__(self, agent_config: GPT4AllAgentConfig): model_path=agent_config.model_path, system_prompt=agent_config.prompt_preamble, initial_message=( - agent_config.initial_message.text - if agent_config.initial_message - else None + agent_config.initial_message.text if agent_config.initial_message else None ), ) diff --git a/vocode/streaming/agent/information_retrieval_agent.py b/vocode/streaming/agent/information_retrieval_agent.py deleted file mode 100644 index 3bfb8861f5..0000000000 --- a/vocode/streaming/agent/information_retrieval_agent.py +++ /dev/null @@ -1,34 +0,0 @@ -import logging -from typing import List, Optional - -from langchain import OpenAI -from vocode.streaming.agent.llm_agent import LLMAgent -from ..models.agent import InformationRetrievalAgentConfig, LLMAgentConfig - - -class InformationRetrievalAgent(LLMAgent): - def __init__( - self, - agent_config: InformationRetrievalAgentConfig, - logger: Optional[logging.Logger] = None, - ): - # super().__init__(agent_config, logger) - prompt_preamble = f""" - The AI is a friendly phone bot built for information retrieval. It understands IVR navigation and chooses which numbers to press based on the intended goal and the options provided. -Once it reaches the human, it verifies the identity of the person it is trying to reach and states its purpose. If it needs to be transferred, then the AI asks to speak to the intended recipient of the phone call. - -Here is the context for the call: -Intended goal: { agent_config.goal_description } -Intended recipient: { agent_config.recipient_descriptor } -Information to be collected: { agent_config.fields } -Information to provide to the person who answers the phone: this is a robot calling on behalf of { agent_config.caller_descriptor } - -The AI begins the call by introducing itself and who it represents. - """ - super().__init__( - LLMAgentConfig( - prompt_preamble=prompt_preamble, - ), - logger=logger, - ) - self.llm = OpenAI(model_name="text-davinci-003", temperature=1) # type: ignore diff --git a/vocode/streaming/agent/llamacpp_agent.py b/vocode/streaming/agent/llamacpp_agent.py index c7f5777332..efd565f9d4 100644 --- a/vocode/streaming/agent/llamacpp_agent.py +++ b/vocode/streaming/agent/llamacpp_agent.py @@ -1,148 +1,121 @@ -from concurrent.futures import ThreadPoolExecutor -import asyncio -import logging -from typing import AsyncGenerator, Optional, Tuple, Any, Union -import typing -from langchain import ConversationChain -from vocode.streaming.agent.base_agent import RespondAgent -from vocode.streaming.models.agent import LlamacppAgentConfig -from vocode.streaming.agent.utils import collate_response_async -from langchain.callbacks.base import BaseCallbackHandler -from langchain.callbacks.manager import CallbackManager -from langchain.llms import LlamaCpp -from langchain.prompts import ( - ChatPromptTemplate, - MessagesPlaceholder, - HumanMessagePromptTemplate, -) -from pydantic.v1 import BaseModel -from langchain.schema import LLMResult, SystemMessage, get_buffer_string -from langchain.memory import ConversationBufferMemory -from langchain.prompts import ( - ChatPromptTemplate, - MessagesPlaceholder, - HumanMessagePromptTemplate, - PromptTemplate, -) -from langchain_core.prompts.string import DEFAULT_FORMATTER_MAPPING - -ALPACA_TEMPLATE_WITH_HISTORY = """### Instruction: -Your previous conversation history: -{history} - -Current instruction/message to respond to: {input} -### Response:""" - - -class CallbackOutput(BaseModel): - finish: bool = False - response: Optional[LLMResult] = None - token: str = "" - - -class FormatHistoryPromptTemplate(PromptTemplate): - def format(self, **kwargs: Any) -> str: - kwargs = self._merge_partial_and_user_variables(**kwargs) - kwargs["history"] = get_buffer_string(kwargs["history"]) - return DEFAULT_FORMATTER_MAPPING[self.template_format](self.template, **kwargs) - - -class CustomStreamingCallbackHandler(BaseCallbackHandler): - def __init__(self, output_queue: asyncio.Queue) -> None: - super().__init__() - self.output_queue = output_queue - - def on_llm_new_token(self, token: str, **kwargs: Any) -> None: - """Run on new LLM token. Only available when streaming is enabled.""" - self.output_queue.put_nowait(CallbackOutput(token=token)) - - def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: - """Run when LLM ends running.""" - self.output_queue.put_nowait(CallbackOutput(finish=True, response=response)) - - -class LlamacppAgent(RespondAgent[LlamacppAgentConfig]): - def __init__( - self, - agent_config: LlamacppAgentConfig, - logger: Optional[logging.Logger] = None, - ): - super().__init__(agent_config=agent_config, logger=logger) - - self.prompt: Union[PromptTemplate, ChatPromptTemplate] - if type(agent_config.prompt_template) is str: - if agent_config.prompt_template == "alpaca": - self.prompt = FormatHistoryPromptTemplate( - input_variables=["history", "input"], - template=ALPACA_TEMPLATE_WITH_HISTORY, - ) - else: - raise ValueError( - f"Unknown prompt template {agent_config.prompt_template}" - ) - else: - if agent_config.prompt_template is None: - self.prompt = ChatPromptTemplate.from_messages( - [ - MessagesPlaceholder(variable_name="history"), - HumanMessagePromptTemplate.from_template("{input}"), - ] - ) - else: - self.promt = typing.cast(PromptTemplate, agent_config.prompt_template) - - self.callback_queue: asyncio.Queue = asyncio.Queue() - callback = CustomStreamingCallbackHandler(self.callback_queue) - callback_manager = CallbackManager([callback]) - self.llm = LlamaCpp( - callback_manager=callback_manager, **agent_config.llamacpp_kwargs - ) - - self.memory = ConversationBufferMemory(return_messages=True) - self.memory.chat_memory.messages.append( - SystemMessage(content=self.agent_config.prompt_preamble) - ) - - self.conversation = ConversationChain( - memory=self.memory, prompt=self.prompt, llm=self.llm - ) - self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) - - async def respond( - self, - human_input, - conversation_id: str, - is_interrupt: bool = False, - ) -> Tuple[str, bool]: - text = await asyncio.get_event_loop().run_in_executor( - self.thread_pool_executor, - lambda input: self.conversation.predict(input=input), - human_input, - ) - - self.logger.debug(f"LLM response: {text}") - return text, False - - async def llamacpp_get_tokens(self): - while True: - callback_output = await self.callback_queue.get() - if callback_output.finish: - break - yield callback_output.token - - async def generate_response( - self, - human_input: str, - conversation_id: str, - is_interrupt: bool = False, - ) -> AsyncGenerator[Tuple[str, bool], None]: - asyncio.get_event_loop().run_in_executor( - self.thread_pool_executor, - lambda input: self.conversation.predict(input=input), - human_input, - ) - - async for message in collate_response_async( - self.llamacpp_get_tokens(), - ): - yield str(message), True +raise DeprecationWarning("This Agent is deprecated and will be removed in the future.") + +# OLD CONFIG BELOW +# class LlamacppAgentConfig(AgentConfig, type=AgentType.LLAMACPP.value): # type: ignore +# prompt_preamble: str +# llamacpp_kwargs: dict = {} +# prompt_template: Optional[Union["PromptTemplate", str]] = None + +# ALPACA_TEMPLATE_WITH_HISTORY = """### Instruction: +# Your previous conversation history: +# {history} + +# Current instruction/message to respond to: {input} +# ### Response:""" + + +# class CallbackOutput(BaseModel): +# finish: bool = False +# response: Optional[LLMResult] = None +# token: str = "" + + +# class FormatHistoryPromptTemplate(PromptTemplate): +# def format(self, **kwargs: Any) -> str: +# kwargs = self._merge_partial_and_user_variables(**kwargs) +# kwargs["history"] = get_buffer_string(kwargs["history"]) +# return DEFAULT_FORMATTER_MAPPING[self.template_format](self.template, **kwargs) + + +# class CustomStreamingCallbackHandler(BaseCallbackHandler): +# def __init__(self, output_queue: asyncio.Queue) -> None: +# super().__init__() +# self.output_queue = output_queue + +# def on_llm_new_token(self, token: str, **kwargs: Any) -> None: +# """Run on new LLM token. Only available when streaming is enabled.""" +# self.output_queue.put_nowait(CallbackOutput(token=token)) + +# def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None: +# """Run when LLM ends running.""" +# self.output_queue.put_nowait(CallbackOutput(finish=True, response=response)) + + +# class LlamacppAgent(RespondAgent[LlamacppAgentConfig]): +# def __init__( +# self, +# agent_config: LlamacppAgentConfig, +# ): +# super().__init__(agent_config=agent_config) + +# self.prompt: Union[PromptTemplate, ChatPromptTemplate] +# if type(agent_config.prompt_template) is str: +# if agent_config.prompt_template == "alpaca": +# self.prompt = FormatHistoryPromptTemplate( +# input_variables=["history", "input"], +# template=ALPACA_TEMPLATE_WITH_HISTORY, +# ) +# else: +# raise ValueError(f"Unknown prompt template {agent_config.prompt_template}") +# else: +# if agent_config.prompt_template is None: +# self.prompt = ChatPromptTemplate.from_messages( +# [ +# MessagesPlaceholder(variable_name="history"), +# HumanMessagePromptTemplate.from_template("{input}"), +# ] +# ) +# else: +# self.promt = typing.cast(PromptTemplate, agent_config.prompt_template) + +# self.callback_queue: asyncio.Queue = asyncio.Queue() +# callback = CustomStreamingCallbackHandler(self.callback_queue) +# callback_manager = CallbackManager([callback]) +# self.llm = LlamaCpp(callback_manager=callback_manager, **agent_config.llamacpp_kwargs) + +# self.memory = ConversationBufferMemory(return_messages=True) +# self.memory.chat_memory.messages.append( +# SystemMessage(content=self.agent_config.prompt_preamble) +# ) + +# self.conversation = ConversationChain(memory=self.memory, prompt=self.prompt, llm=self.llm) +# self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) + +# async def respond( +# self, +# human_input, +# conversation_id: str, +# is_interrupt: bool = False, +# ) -> Tuple[str, bool]: +# text = await asyncio.get_event_loop().run_in_executor( +# self.thread_pool_executor, +# lambda input: self.conversation.predict(input=input), +# human_input, +# ) + +# logger.debug(f"LLM response: {text}") +# return text, False + +# async def llamacpp_get_tokens(self): +# while True: +# callback_output = await self.callback_queue.get() +# if callback_output.finish: +# break +# yield callback_output.token + +# async def generate_response( +# self, +# human_input: str, +# conversation_id: str, +# is_interrupt: bool = False, +# ) -> AsyncGenerator[Tuple[str, bool], None]: +# asyncio.get_event_loop().run_in_executor( +# self.thread_pool_executor, +# lambda input: self.conversation.predict(input=input), +# human_input, +# ) + +# async for message in collate_response_async( +# self.llamacpp_get_tokens(), +# ): +# yield str(message), True diff --git a/vocode/streaming/agent/llm_agent.py b/vocode/streaming/agent/llm_agent.py deleted file mode 100644 index a3d510da25..0000000000 --- a/vocode/streaming/agent/llm_agent.py +++ /dev/null @@ -1,156 +0,0 @@ -import re -from typing import AsyncGenerator, Optional, Tuple - -from langchain import OpenAI -from typing import Generator -import logging - -import openai -from vocode import getenv - -from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent -from vocode.streaming.agent.utils import collate_response_async, openai_get_tokens -from vocode.streaming.models.agent import LLMAgentConfig - - -class LLMAgent(RespondAgent[LLMAgentConfig]): - SENTENCE_ENDINGS = [".", "!", "?"] - - DEFAULT_PROMPT_TEMPLATE = "{history}\nHuman: {human_input}\nAI:" - - def __init__( - self, - agent_config: LLMAgentConfig, - logger: Optional[logging.Logger] = None, - sender="AI", - recipient="Human", - openai_api_key: Optional[str] = None, - ): - super().__init__(agent_config) - self.prompt_template = ( - f"{agent_config.prompt_preamble}\n\n{self.DEFAULT_PROMPT_TEMPLATE}" - ) - self.initial_bot_message = ( - agent_config.initial_message.text if agent_config.initial_message else None - ) - self.logger = logger or logging.getLogger(__name__) - self.sender = sender - self.recipient = recipient - self.memory = ( - [f"AI: {agent_config.initial_message.text}"] - if agent_config.initial_message - else [] - ) - openai_api_key = openai_api_key or getenv("OPENAI_API_KEY") - if not openai_api_key: - raise ValueError("OPENAI_API_KEY must be set in environment or passed in") - self.llm = OpenAI( # type: ignore - model_name=self.agent_config.model_name, - temperature=self.agent_config.temperature, - max_tokens=self.agent_config.max_tokens, - openai_api_key=openai_api_key, - ) - self.stop_tokens = [f"{recipient}:"] - self.first_response = ( - self.llm( - self.prompt_template.format( - history="", human_input=agent_config.expected_first_prompt - ), - stop=self.stop_tokens, - ).strip() - if agent_config.expected_first_prompt - else None - ) - self.is_first_response = True - - def create_prompt(self, human_input): - history = "\n".join(self.memory[-5:]) - return self.prompt_template.format(history=history, human_input=human_input) - - def get_memory_entry(self, human_input, response): - return f"{self.recipient}: {human_input}\n{self.sender}: {response}" - - async def respond( - self, - human_input, - conversation_id: str, - is_interrupt: bool = False, - ) -> Tuple[str, bool]: - if is_interrupt and self.agent_config.cut_off_response: - cut_off_response = self.get_cut_off_response() - self.memory.append(self.get_memory_entry(human_input, cut_off_response)) - return cut_off_response, False - self.logger.debug("LLM responding to human input") - if self.is_first_response and self.first_response: - self.logger.debug("First response is cached") - self.is_first_response = False - response = self.first_response - else: - response = ( - ( - await self.llm.agenerate( - [self.create_prompt(human_input)], stop=self.stop_tokens - ) - ) - .generations[0][0] - .text - ) - response = response.replace(f"{self.sender}:", "") - self.memory.append(self.get_memory_entry(human_input, response)) - self.logger.debug(f"LLM response: {response}") - return response, False - - async def _stream_sentences(self, prompt): - stream = await openai.Completion.acreate( - prompt=prompt, - max_tokens=self.agent_config.max_tokens, - temperature=self.agent_config.temperature, - model=self.agent_config.model_name, - stop=self.stop_tokens, - stream=True, - ) - async for sentence in collate_response_async( - openai_get_tokens(gen=stream), - ): - yield sentence - - async def _agen_from_list(self, l): - for item in l: - yield item - - async def generate_response( - self, - human_input, - conversation_id: str, - is_interrupt: bool = False, - ) -> AsyncGenerator[Tuple[str, bool], None]: - self.logger.debug("LLM generating response to human input") - if is_interrupt and self.agent_config.cut_off_response: - cut_off_response = self.get_cut_off_response() - self.memory.append(self.get_memory_entry(human_input, cut_off_response)) - yield cut_off_response, False - return - self.memory.append(self.get_memory_entry(human_input, "")) - if self.is_first_response and self.first_response: - self.logger.debug("First response is cached") - self.is_first_response = False - sentences = self._agen_from_list([self.first_response]) - else: - self.logger.debug("Creating LLM prompt") - prompt = self.create_prompt(human_input) - self.logger.debug("Streaming LLM response") - sentences = self._stream_sentences(prompt) - response_buffer = "" - async for sentence in sentences: - sentence = sentence.replace(f"{self.sender}:", "") - sentence = re.sub(r"^\s+(.*)", r" \1", sentence) - response_buffer += sentence - self.memory[-1] = self.get_memory_entry(human_input, response_buffer) - yield sentence, True - - def update_last_bot_message_on_cut_off(self, message: str): - last_message = self.memory[-1] - new_last_message = ( - last_message.split("\n", 1)[0] + f"\n{self.sender}: {message}" - ) - self.memory[-1] = new_last_message diff --git a/vocode/streaming/agent/openai_utils.py b/vocode/streaming/agent/openai_utils.py new file mode 100644 index 0000000000..5264e68bd0 --- /dev/null +++ b/vocode/streaming/agent/openai_utils.py @@ -0,0 +1,179 @@ +from copy import deepcopy +from typing import Any, AsyncGenerator, Dict, List, Optional, Union + +from loguru import logger +from openai.types.chat.chat_completion_chunk import ChatCompletionChunk + +from vocode.streaming.agent.token_utils import ( + get_chat_gpt_max_tokens, + num_tokens_from_functions, + num_tokens_from_messages, +) +from vocode.streaming.models.actions import FunctionFragment, PhraseBasedActionTrigger +from vocode.streaming.models.agent import LLM_AGENT_DEFAULT_MAX_TOKENS +from vocode.streaming.models.events import Sender +from vocode.streaming.models.transcript import ( + ActionFinish, + ActionStart, + ConferenceEvent, + EventLog, + Message, + Transcript, +) + + +def vector_db_result_to_openai_chat_message(vector_db_result): + return {"role": "user", "content": vector_db_result} + + +def is_phrase_based_action_event_log(event_log: EventLog) -> bool: + return ( + (isinstance(event_log, ActionStart) or isinstance(event_log, ActionFinish)) + and event_log.action_input is not None + and event_log.action_input.action_config is not None + and isinstance( + event_log.action_input.action_config.action_trigger, PhraseBasedActionTrigger + ) + ) + + +def get_openai_chat_messages_from_transcript( + merged_event_logs: List[EventLog], + prompt_preamble: str, +) -> List[dict]: + chat_messages = [{"role": "system", "content": prompt_preamble}] + for event_log in merged_event_logs: + if isinstance(event_log, Message): + if len(event_log.text.strip()) == 0: + continue + else: + chat_messages.append( + { + "role": ("assistant" if event_log.sender == Sender.BOT else "user"), + "content": event_log.to_string(include_sender=False), + }, + ) + elif isinstance(event_log, ActionStart): + action_message: Dict[str, Any] + if is_phrase_based_action_event_log(event_log=event_log): + pass + else: + action_message = { + "role": "assistant", + "content": None, + "function_call": { + "name": event_log.action_type, + "arguments": event_log.action_input.params.json(), + }, + } + chat_messages.append(action_message) + elif isinstance(event_log, ActionFinish): + action_message = { + "role": "function", + "name": event_log.action_type, + "content": event_log.to_string(include_header=False), + } + chat_messages.append(action_message) + elif isinstance(event_log, ConferenceEvent): + chat_messages.append( + {"role": "user", "content": event_log.to_string(include_sender=False)}, + ) + return chat_messages + + +def merge_event_logs(event_logs: List[EventLog]) -> List[EventLog]: + """Returns a new list of event logs where consecutive bot messages are merged.""" + new_event_logs: List[EventLog] = [] + idx = 0 + while idx < len(event_logs): + bot_messages_buffer: List[Message] = [] + current_log = event_logs[idx] + while isinstance(current_log, Message) and current_log.sender == Sender.BOT: + bot_messages_buffer.append(current_log) + idx += 1 + try: + current_log = event_logs[idx] + except IndexError: + break + if bot_messages_buffer: + merged_bot_message = deepcopy(bot_messages_buffer[-1]) + merged_bot_message.text = " ".join(event_log.text for event_log in bot_messages_buffer) + new_event_logs.append(merged_bot_message) + else: + new_event_logs.append(current_log) + idx += 1 + + return new_event_logs + + +def format_openai_chat_messages_from_transcript( + transcript: Transcript, + model_name: str, + functions: Optional[List[Dict]], + prompt_preamble: str, +) -> List[dict]: + # merge consecutive bot messages + merged_event_logs: List[EventLog] = merge_event_logs(event_logs=transcript.event_logs) + + chat_messages: List[Dict[str, Optional[Any]]] + chat_messages = get_openai_chat_messages_from_transcript( + merged_event_logs=merged_event_logs, + prompt_preamble=prompt_preamble, + ) + + context_size = num_tokens_from_messages( + messages=chat_messages, + model=model_name, + ) + num_tokens_from_functions(functions=functions, model=model_name) + + num_removed_messages = 0 + while ( + context_size > get_chat_gpt_max_tokens(model_name) - LLM_AGENT_DEFAULT_MAX_TOKENS - 50 + ): # context limit includes the max tokens, and 50 for safety + if len(chat_messages) <= 1: + logger.error(f"Prompt is too long to fit in context window, num tokens {context_size}") + break + num_removed_messages += 1 + chat_messages.pop(1) + context_size = num_tokens_from_messages( + messages=chat_messages, + model=model_name, + ) + num_tokens_from_functions(functions=functions, model=model_name) + + if num_removed_messages > 0: + logger.info( + "Removed %d messages from prompt to satisfy context limit", + num_removed_messages, + ) + + return chat_messages + + +async def openai_get_tokens( + gen: AsyncGenerator[ChatCompletionChunk, None], +) -> AsyncGenerator[Union[str, FunctionFragment], None]: + async for event in gen: + choices = event.choices + if len(choices) == 0: + continue + choice = choices[0] + if choice.finish_reason: + if choice.finish_reason == "content_filter": + logger.warning( + "Detected content filter.", + extra={"chat_completion_chunk": event.model_dump()}, + ) + break + delta = choice.delta + if delta.content is not None: + token = delta.content + yield token + elif delta.function_call is not None: + yield FunctionFragment( + name=(delta.function_call.name if delta.function_call.name is not None else ""), + arguments=( + delta.function_call.arguments + if delta.function_call.arguments is not None + else "" + ), + ) diff --git a/vocode/streaming/agent/phrase_trigger.py b/vocode/streaming/agent/phrase_trigger.py new file mode 100644 index 0000000000..0d9587f77f --- /dev/null +++ b/vocode/streaming/agent/phrase_trigger.py @@ -0,0 +1,21 @@ +import re +from typing import List, Optional + +from vocode.streaming.models.actions import ActionConfig, PhraseBasedActionTrigger + + +def matches_phrase_trigger( + message: str, + action_configs: List[ActionConfig], +) -> Optional[str]: + cleaned = re.sub(r"[^\w\s]", "", message.lower()) + for action_config in action_configs: + if not isinstance(action_config.action_trigger, PhraseBasedActionTrigger): + continue + + for phrase_trigger in action_config.action_trigger.config.phrase_triggers: + lowered = phrase_trigger.phrase.lower() + for condition in phrase_trigger.conditions: + if condition == "phrase_condition_type_contains" and lowered in cleaned: + return action_config.type + return None diff --git a/vocode/streaming/agent/prompts/action_prompt.py b/vocode/streaming/agent/prompts/action_prompt.py deleted file mode 100644 index df3c2378cf..0000000000 --- a/vocode/streaming/agent/prompts/action_prompt.py +++ /dev/null @@ -1,24 +0,0 @@ -ACTION_PROMPT_DEFAULT = """ -The assistant is on a live conversation with a human that is taking place via voice (eg via phone call). It is -a helpful assistant that will help the human with their needs. In every response, the assistant does 2 things: -- respond to the customer with a message -- decide to take an appropriate action (or none, if it isn't necessary) - -The following are the possible actions the assistant can take: -{actions} - -ALL of the assistant's responses should look like the following (and should include "Response", "Action", and "Action parameters"): - -Response: Yes! Let me look up that information for you. -Action: look_up_information -Action parameters: "parameter 1|parameter 2|parameter 3" - -If no action is necessary, the assistant responds with the message and leaves the action blank like so: - -Response: Hey! How can I help you today? -Action: -Action parameters: - -Here's the transcript so far: -{transcript} -""" diff --git a/vocode/streaming/agent/restful_user_implemented_agent.py b/vocode/streaming/agent/restful_user_implemented_agent.py index 126087dd07..02999617cd 100644 --- a/vocode/streaming/agent/restful_user_implemented_agent.py +++ b/vocode/streaming/agent/restful_user_implemented_agent.py @@ -1,29 +1,28 @@ -from .base_agent import BaseAgent, RespondAgent -from ..models.agent import ( - RESTfulUserImplementedAgentConfig, +from typing import Optional, Tuple, cast + +import aiohttp +from loguru import logger + +from vocode.streaming.agent.base_agent import RespondAgent +from vocode.streaming.models.agent import ( RESTfulAgentInput, RESTfulAgentOutput, RESTfulAgentOutputType, RESTfulAgentText, + RESTfulUserImplementedAgentConfig, ) -from typing import Generator, Optional, Tuple, cast -import requests -import logging -import aiohttp class RESTfulUserImplementedAgent(RespondAgent[RESTfulUserImplementedAgentConfig]): def __init__( self, agent_config: RESTfulUserImplementedAgentConfig, - logger=None, ): super().__init__(agent_config) if self.agent_config.generate_responses: raise NotImplementedError( "Use the WebSocket user implemented agent to stream responses" ) - self.logger = logger or logging.getLogger(__name__) async def respond( self, @@ -45,9 +44,7 @@ async def respond( timeout=aiohttp.ClientTimeout(total=15), ) as response: assert response.status == 200 - output: RESTfulAgentOutput = RESTfulAgentOutput.parse_obj( - await response.json() - ) + output: RESTfulAgentOutput = RESTfulAgentOutput.parse_obj(await response.json()) output_response = None should_stop = False if output.type == RESTfulAgentOutputType.TEXT: @@ -56,5 +53,5 @@ async def respond( should_stop = True return output_response, should_stop except Exception as e: - self.logger.error(f"Error in response from RESTful agent: {e}") + logger.error(f"Error in response from RESTful agent: {e}") return None, True diff --git a/vocode/streaming/agent/streaming_utils.py b/vocode/streaming/agent/streaming_utils.py new file mode 100644 index 0000000000..ac0dee34c0 --- /dev/null +++ b/vocode/streaming/agent/streaming_utils.py @@ -0,0 +1,139 @@ +import re +from typing import AsyncGenerator, AsyncIterable, List, Literal, Optional, Union + +from sentry_sdk.tracing import Span + +from vocode.streaming.models.actions import FunctionCall, FunctionFragment + +TOKENS_TO_GENERATE_PAST_PERIOD = 3 +SENTENCE_ENDINGS_EXCEPT_PERIOD_PATTERN = r"[?!\n\t\r]" + + +SHORT_SENTENCE_CUTOFF = 3 + + +def split_sentences(text: str) -> List[str]: + """Splits text into sentences and preserve trailing periods. + + Merge sentences that are just numbers, as they are part of lists. + """ + initial_split = text.split(". ") + + final_split = [] + buffer = "" + + for i, sentence in enumerate(initial_split): + is_last = i == len(initial_split) - 1 + buffer += sentence + if not is_last: + buffer += ". " + if not re.fullmatch(r"\d+", sentence.strip()): + final_split.append(buffer.strip()) + buffer = "" + + if buffer.strip(): + final_split.append(buffer.strip()) + + return [sentence for sentence in final_split if sentence] + + +async def collate_response_async( + conversation_id: str, + gen: AsyncIterable[Union[str, FunctionFragment]], + get_functions: Literal[True, False] = False, + sentry_span: Optional[Span] = None, +) -> AsyncGenerator[ + Union[str, FunctionCall], + None, +]: # tuple of message to send and whether it's the final message + buffer = "" + function_name_buffer = "" + function_args_buffer = "" + is_post_period = False + tokens_since_period = 0 + is_first = True + async for token in gen: + if is_first: + if sentry_span: + sentry_span.finish() + is_first = False + if not token: + continue + if isinstance(token, str): + buffer += token + if len(buffer.strip().split()) < SHORT_SENTENCE_CUTOFF: + continue + if re.search(SENTENCE_ENDINGS_EXCEPT_PERIOD_PATTERN, token): + # split on last occurrence of sentence ending + matches = [ + match for match in re.finditer(SENTENCE_ENDINGS_EXCEPT_PERIOD_PATTERN, buffer) + ] + last_match = matches[-1] + split_point = last_match.start() + 1 + to_keep, to_return = buffer[split_point:], buffer[:split_point] + if to_return.strip(): + yield to_return.strip() + buffer = to_keep + elif "." in token: + is_post_period = True + tokens_since_period = 0 + + if is_post_period and tokens_since_period > TOKENS_TO_GENERATE_PAST_PERIOD: + sentences = split_sentences(buffer) + if len(sentences) > 1: + yield " ".join(sentences[:-1]) + buffer = sentences[-1] + is_post_period = False + tokens_since_period = 0 + else: + tokens_since_period += 1 + + elif isinstance(token, FunctionFragment): + function_name_buffer += token.name + function_args_buffer += token.arguments + to_return = buffer.strip() + if to_return: + yield to_return + if function_name_buffer and get_functions: + yield FunctionCall(name=function_name_buffer, arguments=function_args_buffer) + + +async def stream_response_async( + conversation_id: str, + gen: AsyncIterable[Union[str, FunctionFragment]], + get_functions: Literal[True, False] = False, + sentry_span: Optional[Span] = None, +) -> AsyncGenerator[ + Union[str, FunctionCall], + None, +]: # tuple of message to send and whether it's the final message + splitters = (".", ",", "?", "!", ";", ":", "—", "-", "(", ")", "[", "]", "}", " ") + buffer = "" + function_name_buffer = "" + function_args_buffer = "" + is_first = True + async for token in gen: + if is_first: + if sentry_span: + sentry_span.finish() + is_first = False + if not token: + continue + if isinstance(token, str): + if buffer.endswith(splitters): + yield buffer if buffer.endswith(" ") else buffer + " " + buffer = token + elif token.startswith(splitters): + output = buffer + token[0] + yield output if output.endswith(" ") else output + " " + buffer = token[1:] + else: + buffer += token + + elif isinstance(token, FunctionFragment): + function_name_buffer += token.name + function_args_buffer += token.arguments + if buffer != "": + yield buffer + " " + if function_name_buffer and get_functions: + yield FunctionCall(name=function_name_buffer, arguments=function_args_buffer) diff --git a/vocode/streaming/agent/token_utils.py b/vocode/streaming/agent/token_utils.py new file mode 100644 index 0000000000..7cd80f8cc0 --- /dev/null +++ b/vocode/streaming/agent/token_utils.py @@ -0,0 +1,252 @@ +"""Utilities for chat_gpt_agent, mostly around token counting for cost estimation purposes.""" + +import json +import textwrap +from typing import Any, Dict, List, NamedTuple, Optional + +import tiktoken +from loguru import logger + +# THE FOLLOWING CODE, UNTIL THE END MARKER, WERE RETRIEVED ON 9/13/2023 FROM +# THE OPENAI COOKBOOK UNDER THE MIT LICENSE. +# MIT License + +# Copyright (c) 2023 OpenAI + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +# Used to count the amount of tokens Actions add to the billable cost +_FUNCTION_OVERHEAD_STR = """# Tools + +## functions + +namespace functions { + +} // namespace functions""" + +CHAT_GPT_MAX_TOKENS = { + "gpt-3.5-turbo-0613": 4050, + "gpt-3.5-turbo-16k-0613": 16340, + "gpt-3.5-turbo-16k": 16340, + "gpt-3.5-turbo": 16340, + "gpt-3.5-turbo-1106": 16340, + "gpt-3.5-turbo-0125": 16340, + "gpt-4-0314": 8150, + "gpt-4-32k-0314": 32700, + "gpt-4-0613": 8150, + "gpt-4-32k-0613": 32700, + "gpt-4-0125-preview": 127940, + "gpt-4-turbo": 127940, + "gpt-4o": 127940, + "gpt-4o-2024-05-13": 127940, +} + + +def get_chat_gpt_max_tokens(model_name: str): + if model_name.startswith("ft:"): + model_name = model_name.split(":")[1] + + if model_name in CHAT_GPT_MAX_TOKENS: + return CHAT_GPT_MAX_TOKENS[model_name] + + return 4050 + + +TokenizerInfo = NamedTuple( + "TokenizerInfo", + [ + ("encoding", tiktoken.Encoding), + ("tokens_per_message", int), + ("tokens_per_name", int), + ], +) + + +def get_tokenizer_info(model: str) -> Optional[TokenizerInfo]: + if "gpt-35-turbo" in model: + model = "gpt-3.5-turbo" + elif "gpt-4o" == model: + model = "gpt-4o" + elif "gpt4" in model or "gpt-4" in model: + model = "gpt-4" + try: + encoding = tiktoken.encoding_for_model(model) + except KeyError: + logger.warning("Warning: model not found. Using cl100k_base encoding.") + encoding = tiktoken.get_encoding("cl100k_base") + if model in { + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo-16k-0613", + "gpt-4-0314", + "gpt-4-32k-0314", + "gpt-4-0613", + "gpt-4-32k-0613", + }: + tokens_per_message = 3 + tokens_per_name = 1 + elif model == "gpt-3.5-turbo-0301": + tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n + tokens_per_name = -1 # if there's a name, the role is omitted + elif "gpt-3.5-turbo" in model: + logger.debug( + "Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613." + ) + tokens_per_message = 3 + tokens_per_name = 1 + elif "gpt-4" in model: + logger.debug( + "Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613." + ) + tokens_per_message = 3 + tokens_per_name = 1 + else: + return None + + return TokenizerInfo( + encoding=encoding, + tokens_per_message=tokens_per_message, + tokens_per_name=tokens_per_name, + ) + + +def num_tokens_from_messages(messages: List[dict], model: str = "gpt-3.5-turbo-0613"): + """Return the number of tokens used by a list of messages.""" + tokenizer_info = get_tokenizer_info(model) + if tokenizer_info is None: + raise NotImplementedError( + f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""" + ) + num_tokens = 0 + for message in messages: + num_tokens += tokenizer_info.tokens_per_message + num_tokens += tokens_from_dict( + encoding=tokenizer_info.encoding, + d=message, + tokens_per_name=tokenizer_info.tokens_per_name, + ) + num_tokens += 3 # every reply is primed with <|start|>assistant<|message|> + return num_tokens + + +# END OF OPENAI COOKBOOK CODE AND GIVEN MIT LICENSE. + + +def tokens_from_dict(encoding: tiktoken.Encoding, d: Dict[str, Any], tokens_per_name: int) -> int: + """Return the number of OpenAI tokens in a dict.""" + num_tokens: int = 0 + for key, value in d.items(): + if value is None: + continue + if isinstance(value, str): + num_tokens += len(encoding.encode(value)) + if key == "name": + num_tokens += tokens_per_name + elif isinstance(value, dict): + num_tokens += tokens_from_dict( + encoding=encoding, d=value, tokens_per_name=tokens_per_name + ) + + return num_tokens + + +def num_tokens_from_functions(functions: List[dict] | None, model="gpt-3.5-turbo-0613") -> int: + """Return the number of tokens used by a list of functions.""" + if not functions: + return 0 + + try: + encoding = tiktoken.encoding_for_model(model) + except KeyError: + logger.warning("Warning: model not found. Using cl100k_base encoding.") + encoding = tiktoken.get_encoding("cl100k_base") + + function_overhead = 3 + len(encoding.encode(_FUNCTION_OVERHEAD_STR)) + + return function_overhead + sum( + len(encoding.encode(_format_func_into_prompt_str(func=f))) for f in functions + ) + + +# Calculates the amount of tokens added to a given OpenAI prompt for functions +# specifically for billing purposes +def _format_func_into_prompt_str(func) -> str: + def resolve_ref(schema): + if schema.get("$ref") is not None: + ref = schema["$ref"][14:] + schema = json_schema["definitions"][ref] + return schema + + def format_schema(schema, indent): + schema = resolve_ref(schema) + if "enum" in schema: + return format_enum(schema, indent) + elif schema["type"] == "object": + return format_object(schema, indent) + elif schema["type"] == "integer": + return "number" + elif schema["type"] == "boolean": + return "boolean" + elif schema["type"] in ["string", "number"]: + return schema["type"] + elif schema["type"] == "array": + return format_schema(schema["items"], indent) + "[]" + else: + raise ValueError("unknown schema type " + schema["type"]) + + def format_enum(schema, indent): + return " | ".join(json.dumps(o) for o in schema["enum"]) + + def format_object(schema, indent): + result = "{\n" + if "properties" not in schema or len(schema["properties"]) == 0: + if schema.get("additionalProperties", False): + return "object" + return None + for key, value in schema["properties"].items(): + value = resolve_ref(value) + value_rendered = format_schema(value, indent + 1) + if value_rendered is None: + continue + if "description" in value and indent == 0: + for line in textwrap.dedent(value["description"]).strip().split("\n"): + result += f"{' '*indent}// {line}\n" + optional = "" if key in schema.get("required", {}) else "?" + comment = ( + "" if value.get("default") is None else f" // default: {format_default(value)}" + ) + result += f"{' '*indent}{key}{optional}: {value_rendered},{comment}\n" + result += (" " * (indent - 1)) + "}" + return result + + def format_default(schema): + v = schema["default"] + if schema["type"] == "number": + return f"{v:.1f}" if float(v).is_integer() else str(v) + else: + return str(v) + + json_schema = func["parameters"] + result = f"// {func['description']}\ntype {func['name']} = (" + formatted = format_object(json_schema, 0) + if formatted is not None: + result += "_: " + formatted + result += ") => any;\n\n" + return result diff --git a/vocode/streaming/agent/utils.py b/vocode/streaming/agent/utils.py deleted file mode 100644 index 0ce4df77fe..0000000000 --- a/vocode/streaming/agent/utils.py +++ /dev/null @@ -1,182 +0,0 @@ -from copy import deepcopy -import re -from typing import ( - Dict, - Any, - AsyncGenerator, - AsyncIterable, - Callable, - List, - Literal, - Optional, - TypeVar, - Union, -) - -from openai.openai_object import OpenAIObject -from vocode.streaming.models.actions import FunctionCall, FunctionFragment -from vocode.streaming.models.events import Sender -from vocode.streaming.models.transcript import ( - ActionFinish, - ActionStart, - EventLog, - Message, - Transcript, -) - -SENTENCE_ENDINGS = [".", "!", "?", "\n"] - - -async def collate_response_async( - gen: AsyncIterable[Union[str, FunctionFragment]], - sentence_endings: List[str] = SENTENCE_ENDINGS, - get_functions: Literal[True, False] = False, -) -> AsyncGenerator[Union[str, FunctionCall], None]: - sentence_endings_pattern = "|".join(map(re.escape, sentence_endings)) - list_item_ending_pattern = r"\n" - buffer = "" - function_name_buffer = "" - function_args_buffer = "" - prev_ends_with_money = False - async for token in gen: - if not token: - continue - if isinstance(token, str): - if prev_ends_with_money and token.startswith(" "): - yield buffer.strip() - buffer = "" - - buffer += token - possible_list_item = bool(re.match(r"^\d+[ .]", buffer)) - ends_with_money = bool(re.findall(r"\$\d+.$", buffer)) - if re.findall( - ( - list_item_ending_pattern - if possible_list_item - else sentence_endings_pattern - ), - token, - ): - if not ends_with_money: - to_return = buffer.strip() - if to_return: - yield to_return - buffer = "" - prev_ends_with_money = ends_with_money - elif isinstance(token, FunctionFragment): - function_name_buffer += token.name - function_args_buffer += token.arguments - to_return = buffer.strip() - if to_return: - yield to_return - if function_name_buffer and get_functions: - yield FunctionCall(name=function_name_buffer, arguments=function_args_buffer) - - -async def openai_get_tokens(gen) -> AsyncGenerator[Union[str, FunctionFragment], None]: - async for event in gen: - choices = event.get("choices", []) - if len(choices) == 0: - continue - choice = choices[0] - if choice.finish_reason: - break - delta = choice.get("delta", {}) - if "text" in delta and delta["text"] is not None: - token = delta["text"] - yield token - if "content" in delta and delta["content"] is not None: - token = delta["content"] - yield token - elif "function_call" in delta and delta["function_call"] is not None: - yield FunctionFragment( - name=( - delta["function_call"]["name"] - if "name" in delta["function_call"] - else "" - ), - arguments=( - delta["function_call"]["arguments"] - if "arguments" in delta["function_call"] - else "" - ), - ) - - -def find_last_punctuation(buffer: str) -> Optional[int]: - indices = [buffer.rfind(ending) for ending in SENTENCE_ENDINGS] - if not indices: - return None - return max(indices) - - -def get_sentence_from_buffer(buffer: str): - last_punctuation = find_last_punctuation(buffer) - if last_punctuation: - return buffer[: last_punctuation + 1], buffer[last_punctuation + 1 :] - else: - return None, None - - -def format_openai_chat_messages_from_transcript( - transcript: Transcript, prompt_preamble: Optional[str] = None -) -> List[dict]: - chat_messages: List[Dict[str, Optional[Any]]] = ( - [{"role": "system", "content": prompt_preamble}] if prompt_preamble else [] - ) - - # merge consecutive bot messages - new_event_logs: List[EventLog] = [] - idx = 0 - while idx < len(transcript.event_logs): - bot_messages_buffer: List[Message] = [] - current_log = transcript.event_logs[idx] - while isinstance(current_log, Message) and current_log.sender == Sender.BOT: - bot_messages_buffer.append(current_log) - idx += 1 - try: - current_log = transcript.event_logs[idx] - except IndexError: - break - if bot_messages_buffer: - merged_bot_message = deepcopy(bot_messages_buffer[-1]) - merged_bot_message.text = " ".join( - event_log.text for event_log in bot_messages_buffer - ) - new_event_logs.append(merged_bot_message) - else: - new_event_logs.append(current_log) - idx += 1 - - for event_log in new_event_logs: - if isinstance(event_log, Message): - chat_messages.append( - { - "role": "assistant" if event_log.sender == Sender.BOT else "user", - "content": event_log.text, - } - ) - elif isinstance(event_log, ActionStart): - chat_messages.append( - { - "role": "assistant", - "content": None, - "function_call": { - "name": event_log.action_type, - "arguments": event_log.action_input.params.json(), - }, - } - ) - elif isinstance(event_log, ActionFinish): - chat_messages.append( - { - "role": "function", - "name": event_log.action_type, - "content": event_log.action_output.response.json(), - } - ) - return chat_messages - - -def vector_db_result_to_openai_chat_message(vector_db_result): - return {"role": "user", "content": vector_db_result} diff --git a/vocode/streaming/agent/vertex_ai_agent.py b/vocode/streaming/agent/vertex_ai_agent.py index 0f979bc8a8..2646767331 100644 --- a/vocode/streaming/agent/vertex_ai_agent.py +++ b/vocode/streaming/agent/vertex_ai_agent.py @@ -1,28 +1,24 @@ -from concurrent.futures import ThreadPoolExecutor import asyncio -import logging -from typing import Optional, Tuple +from concurrent.futures import ThreadPoolExecutor +from typing import Tuple + from langchain import ConversationChain -from vocode.streaming.agent.base_agent import RespondAgent -from vocode.streaming.models.agent import ChatVertexAIAgentConfig +from langchain.memory import ConversationBufferMemory +from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder +from langchain.schema import SystemMessage from langchain_community.chat_models import ChatVertexAI -from langchain.prompts import ( - ChatPromptTemplate, - MessagesPlaceholder, - HumanMessagePromptTemplate, -) +from loguru import logger -from langchain.schema import HumanMessage, SystemMessage, AIMessage -from langchain.memory import ConversationBufferMemory +from vocode.streaming.agent.base_agent import RespondAgent +from vocode.streaming.models.agent import ChatVertexAIAgentConfig class ChatVertexAIAgent(RespondAgent[ChatVertexAIAgentConfig]): def __init__( self, agent_config: ChatVertexAIAgentConfig, - logger: Optional[logging.Logger] = None, ): - super().__init__(agent_config=agent_config, logger=logger) + super().__init__(agent_config=agent_config) self.prompt = ChatPromptTemplate.from_messages( [ @@ -38,9 +34,7 @@ def __init__( SystemMessage(content=self.agent_config.prompt_preamble) ) - self.conversation = ConversationChain( - memory=self.memory, prompt=self.prompt, llm=self.llm - ) + self.conversation = ConversationChain(memory=self.memory, prompt=self.prompt, llm=self.llm) if agent_config.initial_message: raise NotImplementedError("initial_message not supported for Vertex AI") self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) @@ -58,5 +52,5 @@ async def respond( human_input, ) - self.logger.debug(f"LLM response: {text}") + logger.debug(f"LLM response: {text}") return text, False diff --git a/vocode/streaming/agent/websocket_user_implemented_agent.py b/vocode/streaming/agent/websocket_user_implemented_agent.py index e965388f06..1a09e199d0 100644 --- a/vocode/streaming/agent/websocket_user_implemented_agent.py +++ b/vocode/streaming/agent/websocket_user_implemented_agent.py @@ -1,25 +1,15 @@ import asyncio import json -import logging -from typing import Dict -from vocode.streaming.transcriber.base_transcriber import Transcription -from vocode.streaming.utils.worker import ( - InterruptibleAgentResponseEvent, - InterruptibleEvent, -) + import websockets -from websockets.client import ( - connect, - WebSocketClientProtocol, -) +from loguru import logger +from websockets.client import WebSocketClientProtocol, connect -from typing import Awaitable, Callable, Optional, cast from vocode.streaming.agent.base_agent import ( AgentInput, AgentResponse, AgentResponseMessage, AgentResponseStop, - AgentResponseFillerAudio, BaseAgent, TranscriptionAgentInput, ) @@ -30,6 +20,7 @@ WebSocketAgentTextMessage, WebSocketUserImplementedAgentConfig, ) +from vocode.streaming.utils.worker import InterruptibleAgentResponseEvent, InterruptibleEvent NUM_RESTARTS = 5 @@ -41,50 +32,44 @@ class WebSocketUserImplementedAgent(BaseAgent[WebSocketUserImplementedAgentConfi def __init__( self, agent_config: WebSocketUserImplementedAgentConfig, - logger: Optional[logging.Logger] = None, ): self.agent_config = agent_config - self.logger = logger or logging.getLogger(__name__) self.has_ended = False - super().__init__(agent_config=agent_config, logger=logger) + super().__init__(agent_config=agent_config) def get_agent_config(self) -> WebSocketUserImplementedAgentConfig: return self.agent_config async def _run_loop(self) -> None: restarts = 0 - self.logger.info("Starting Socket Agent") + logger.info("Starting Socket Agent") while not self.has_ended and restarts < NUM_RESTARTS: await self._process() restarts += 1 - self.logger.debug( - "Socket Agent connection died, restarting, num_restarts: %s", restarts - ) + logger.debug("Socket Agent connection died, restarting, num_restarts: %s", restarts) def _handle_incoming_socket_message(self, message: WebSocketAgentMessage) -> None: - self.logger.info("Handling incoming message from Socket Agent: %s", message) + logger.info("Handling incoming message from Socket Agent: %s", message) agent_response: AgentResponse if isinstance(message, WebSocketAgentTextMessage): - agent_response = AgentResponseMessage( - message=BaseMessage(text=message.data.text) - ) + agent_response = AgentResponseMessage(message=BaseMessage(text=message.data.text)) elif isinstance(message, WebSocketAgentStopMessage): agent_response = AgentResponseStop() self.has_ended = True else: raise Exception("Unknown Socket message type") - self.logger.info("Putting interruptible agent response event in output queue") + logger.info("Putting interruptible agent response event in output queue") self.produce_interruptible_agent_response_event_nonblocking( agent_response, self.get_agent_config().allow_agent_to_be_cut_off ) async def _process(self) -> None: socket_url = self.get_agent_config().respond.url - self.logger.info("Connecting to web socket agent %s", socket_url) + logger.info("Connecting to web socket agent %s", socket_url) async with connect(socket_url) as ws: @@ -92,23 +77,19 @@ async def sender( ws: WebSocketClientProtocol, ) -> None: # sends audio to websocket while not self.has_ended: - self.logger.info("Waiting for data from agent request queue") + logger.info("Waiting for data from agent request queue") try: input = await self.input_queue.get() payload = input.payload if isinstance(payload, TranscriptionAgentInput): transcription = payload.transcription - self.logger.info( - "Transcription message: %s", transcription.message - ) + logger.info("Transcription message: %s", transcription.message) agent_request = WebSocketAgentTextMessage.from_text( transcription.message, conversation_id=payload.conversation_id, ) agent_request_json = agent_request.json() - self.logger.info( - f"Sending data to web socket agent: {agent_request_json}" - ) + logger.info(f"Sending data to web socket agent: {agent_request_json}") if isinstance(agent_request, AgentResponseStop): # In practice, it doesn't make sense for the client to send a text and stop message to the agent service self.has_ended = True @@ -119,47 +100,39 @@ async def sender( break except Exception as e: - self.logger.error( + logger.error( f'WebSocket Agent Send Error: "{e}" in Web Socket User Implemented Agent sender' ) break - self.logger.debug("Terminating web socket agent sender") + logger.debug("Terminating web socket agent sender") async def receiver(ws: WebSocketClientProtocol) -> None: while not self.has_ended: try: msg = await ws.recv() - self.logger.info("Received data from web socket agent") + logger.info("Received data from web socket agent") data = json.loads(msg) message = WebSocketAgentMessage.parse_obj(data) self._handle_incoming_socket_message(message) except websockets.exceptions.ConnectionClosed as e: - self.logger.error( - f'WebSocket Agent Receive Error: Connection Closed - "{e}"' - ) + logger.error(f'WebSocket Agent Receive Error: Connection Closed - "{e}"') break except websockets.exceptions.ConnectionClosedOK as e: - self.logger.error( - f'WebSocket Agent Receive Error: Connection Closed OK - "{e}"' - ) + logger.error(f'WebSocket Agent Receive Error: Connection Closed OK - "{e}"') break except websockets.exceptions.InvalidStatus as e: - self.logger.error( - f'WebSocket Agent Receive Error: Invalid Status - "{e}"' - ) + logger.error(f'WebSocket Agent Receive Error: Invalid Status - "{e}"') break except Exception as e: - self.logger.error(f'WebSocket Agent Receive Error: "{e}"') + logger.error(f'WebSocket Agent Receive Error: "{e}"') break - self.logger.debug( - "Terminating Web Socket User Implemented Agent receiver" - ) + logger.debug("Terminating Web Socket User Implemented Agent receiver") await asyncio.gather(sender(ws), receiver(ws)) diff --git a/vocode/streaming/client_backend/conversation.py b/vocode/streaming/client_backend/conversation.py index da3a2be0d0..5970c475bc 100644 --- a/vocode/streaming/client_backend/conversation.py +++ b/vocode/streaming/client_backend/conversation.py @@ -1,16 +1,18 @@ -import logging -from typing import Callable, Optional import typing +from typing import Callable from fastapi import APIRouter, WebSocket +from loguru import logger + from vocode.streaming.agent.base_agent import BaseAgent -from vocode.streaming.models.audio_encoding import AudioEncoding from vocode.streaming.models.client_backend import InputAudioConfig, OutputAudioConfig +from vocode.streaming.models.events import Event, EventType from vocode.streaming.models.synthesizer import AzureSynthesizerConfig from vocode.streaming.models.transcriber import ( DeepgramTranscriberConfig, PunctuationEndpointingConfig, ) +from vocode.streaming.models.transcript import TranscriptEvent from vocode.streaming.models.websocket import ( AudioConfigStartMessage, AudioMessage, @@ -18,18 +20,14 @@ WebSocketMessage, WebSocketMessageType, ) - from vocode.streaming.output_device.websocket_output_device import WebsocketOutputDevice from vocode.streaming.streaming_conversation import StreamingConversation from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer from vocode.streaming.transcriber.base_transcriber import BaseTranscriber from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber -from vocode.streaming.utils.base_router import BaseRouter - -from vocode.streaming.models.events import Event, EventType -from vocode.streaming.models.transcript import TranscriptEvent from vocode.streaming.utils import events_manager +from vocode.streaming.utils.base_router import BaseRouter BASE_CONVERSATION_ENDPOINT = "/conversation" @@ -49,18 +47,14 @@ def __init__( synthesizer_thunk: Callable[ [OutputAudioConfig], BaseSynthesizer ] = lambda output_audio_config: AzureSynthesizer( - AzureSynthesizerConfig.from_output_audio_config( - output_audio_config=output_audio_config - ) + AzureSynthesizerConfig.from_output_audio_config(output_audio_config=output_audio_config) ), - logger: Optional[logging.Logger] = None, conversation_endpoint: str = BASE_CONVERSATION_ENDPOINT, ): super().__init__() self.transcriber_thunk = transcriber_thunk self.agent_thunk = agent_thunk self.synthesizer_thunk = synthesizer_thunk - self.logger = logger or logging.getLogger(__name__) self.router = APIRouter() self.router.websocket(conversation_endpoint)(self.conversation) @@ -71,7 +65,7 @@ def get_conversation( ) -> StreamingConversation: transcriber = self.transcriber_thunk(start_message.input_audio_config) synthesizer = self.synthesizer_thunk(start_message.output_audio_config) - synthesizer.synthesizer_config.should_encode_as_wav = True + synthesizer.get_synthesizer_config().should_encode_as_wav = True return StreamingConversation( output_device=output_device, transcriber=transcriber, @@ -79,11 +73,10 @@ def get_conversation( synthesizer=synthesizer, conversation_id=start_message.conversation_id, events_manager=( - TranscriptEventManager(output_device, self.logger) + TranscriptEventManager(output_device) if start_message.subscribe_transcript else None ), - logger=self.logger, ) async def conversation(self, websocket: WebSocket): @@ -91,7 +84,7 @@ async def conversation(self, websocket: WebSocket): start_message: AudioConfigStartMessage = AudioConfigStartMessage.parse_obj( await websocket.receive_json() ) - self.logger.debug(f"Conversation started") + logger.debug(f"Conversation started") output_device = WebsocketOutputDevice( websocket, start_message.output_audio_config.sampling_rate, @@ -100,9 +93,7 @@ async def conversation(self, websocket: WebSocket): conversation = self.get_conversation(output_device, start_message) await conversation.start(lambda: websocket.send_text(ReadyMessage().json())) while conversation.is_active(): - message: WebSocketMessage = WebSocketMessage.parse_obj( - await websocket.receive_json() - ) + message: WebSocketMessage = WebSocketMessage.parse_obj(await websocket.receive_json()) if message.type == WebSocketMessageType.STOP: break audio_message = typing.cast(AudioMessage, message) @@ -118,17 +109,15 @@ class TranscriptEventManager(events_manager.EventsManager): def __init__( self, output_device: WebsocketOutputDevice, - logger: Optional[logging.Logger] = None, ): super().__init__(subscriptions=[EventType.TRANSCRIPT]) self.output_device = output_device - self.logger = logger or logging.getLogger(__name__) async def handle_event(self, event: Event): if event.type == EventType.TRANSCRIPT: transcript_event = typing.cast(TranscriptEvent, event) self.output_device.consume_transcript(transcript_event) - # self.logger.debug(event.dict()) + # logger.debug(event.dict()) def restart(self, output_device: WebsocketOutputDevice): self.output_device = output_device diff --git a/vocode/streaming/constants.py b/vocode/streaming/constants.py index 7f91d2f6ff..3b84e2e56c 100644 --- a/vocode/streaming/constants.py +++ b/vocode/streaming/constants.py @@ -1,3 +1,10 @@ -TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS = 1 +TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS = 0.1 PER_CHUNK_ALLOWANCE_SECONDS = 0.01 ALLOWED_IDLE_TIME = 15 +SENTENCE_ENDINGS = [".", "!", "?", "\n"] +CHECK_HUMAN_PRESENT_MESSAGE_CHOICES = [ + "Hello?", + "Are you there?", + "Are you still there?", + "Hi, are you there?", +] diff --git a/vocode/streaming/input_device/base_input_device.py b/vocode/streaming/input_device/base_input_device.py index 7816515f5f..d7c82bc0b5 100644 --- a/vocode/streaming/input_device/base_input_device.py +++ b/vocode/streaming/input_device/base_input_device.py @@ -1,12 +1,11 @@ -from vocode.streaming.models.audio_encoding import AudioEncoding import queue from typing import Optional +from vocode.streaming.models.audio import AudioEncoding + class BaseInputDevice: - def __init__( - self, sampling_rate: int, audio_encoding: AudioEncoding, chunk_size: int - ): + def __init__(self, sampling_rate: int, audio_encoding: AudioEncoding, chunk_size: int): self.sampling_rate = sampling_rate self.audio_encoding = audio_encoding self.chunk_size = chunk_size diff --git a/vocode/streaming/input_device/file_input_device.py b/vocode/streaming/input_device/file_input_device.py index 7ba88b41d0..b390456886 100644 --- a/vocode/streaming/input_device/file_input_device.py +++ b/vocode/streaming/input_device/file_input_device.py @@ -1,10 +1,12 @@ -from vocode.streaming.models.audio_encoding import AudioEncoding -import janus -from vocode.streaming.input_device.base_input_device import BaseInputDevice -import wave import struct +import wave + +import janus import numpy as np +from vocode.streaming.input_device.base_input_device import BaseInputDevice +from vocode.streaming.models.audio import AudioEncoding + class FileInputDevice(BaseInputDevice): DEFAULT_SAMPLING_RATE = 44100 diff --git a/vocode/streaming/input_device/microphone_input.py b/vocode/streaming/input_device/microphone_input.py index ac3c501491..e27dc95d26 100644 --- a/vocode/streaming/input_device/microphone_input.py +++ b/vocode/streaming/input_device/microphone_input.py @@ -1,15 +1,16 @@ from __future__ import annotations -import typing -import janus -import sounddevice as sd -import numpy as np -from typing import Optional import queue +import typing import wave +from typing import Optional + +import janus +import numpy as np +import sounddevice as sd from vocode.streaming.input_device.base_input_device import BaseInputDevice -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding class MicrophoneInput(BaseInputDevice): @@ -29,9 +30,7 @@ def __init__( or ( typing.cast( int, - self.device_info.get( - "default_samplerate", self.DEFAULT_SAMPLING_RATE - ), + self.device_info.get("default_samplerate", self.DEFAULT_SAMPLING_RATE), ) ), AudioEncoding.LINEAR16, diff --git a/vocode/streaming/models/actions.py b/vocode/streaming/models/actions.py index e93a0006b5..47b7e454cb 100644 --- a/vocode/streaming/models/actions.py +++ b/vocode/streaming/models/actions.py @@ -1,21 +1,88 @@ import asyncio from enum import Enum -from typing import Generic, Optional, TypeVar -from pydantic.v1 import BaseModel +from typing import Annotated, Generic, List, Literal, Optional, TypeVar, Union + +from pydantic.v1 import BaseModel, Field + +from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.model import TypedModel +TriggerType = Literal["action_trigger_function_call", "action_trigger_phrase_based"] + + +class ActionTriggerConfig(BaseModel): + pass + + +class _ActionTrigger(BaseModel): + type: TriggerType + config: ActionTriggerConfig + + +class FunctionCallActionTriggerConfig(ActionTriggerConfig): + pass + + +class FunctionCallActionTrigger(_ActionTrigger): + type: Literal["action_trigger_function_call"] = "action_trigger_function_call" + config: FunctionCallActionTriggerConfig = Field(default_factory=FunctionCallActionTriggerConfig) + + +PhraseConditionType = Literal["phrase_condition_type_contains"] + + +class PhraseTrigger(BaseModel): + phrase: str + conditions: List[PhraseConditionType] + + +class PhraseBasedActionTriggerConfig(ActionTriggerConfig): + phrase_triggers: List[PhraseTrigger] + + +class PhraseBasedActionTrigger(_ActionTrigger): + type: Literal["action_trigger_phrase_based"] = "action_trigger_phrase_based" + config: PhraseBasedActionTriggerConfig + + +ActionTrigger = Annotated[ + Union[FunctionCallActionTrigger, PhraseBasedActionTrigger], + Field(discriminator="type"), +] + class ActionType(str, Enum): BASE = "action_base" NYLAS_SEND_EMAIL = "action_nylas_send_email" + WAIT = "action_wait" + RECORD_EMAIL = "action_record_email" + END_CONVERSATION = "action_end_conversation" + EXECUTE_EXTERNAL_ACTION = "action_external" + TRANSFER_CALL = "action_transfer_call" + DTMF = "action_dtmf" -class ActionConfig(TypedModel, type=ActionType.BASE): - pass +ParametersType = TypeVar("ParametersType", bound=BaseModel) +ACTION_STARTED_FORMAT_STRING = "!STARTING ACTION {action_name} WITH PARAMETERS {action_params}!" +ACTION_FINISHED_FORMAT_STRING = "!ACTION {action_name} FINISHED WITH OUTPUT {action_output}!" -ParametersType = TypeVar("ParametersType", bound=BaseModel) + +class ActionConfig(TypedModel, type=ActionType.BASE): # type: ignore + action_trigger: ActionTrigger = FunctionCallActionTrigger(type="action_trigger_function_call") + + def action_attempt_to_string(self, input: "ActionInput") -> str: + return ACTION_STARTED_FORMAT_STRING.format( + action_name=self.type, + action_params=input.params.json(), + ) + + def action_result_to_string(self, input: "ActionInput", output: "ActionOutput") -> str: + return ACTION_FINISHED_FORMAT_STRING.format( + action_name=self.type, + action_output=output.response.json(), + ) class ActionInput(BaseModel, Generic[ParametersType]): @@ -38,11 +105,15 @@ class FunctionCall(BaseModel): arguments: str -class VonagePhoneCallActionInput(ActionInput[ParametersType]): +class EndOfTurn(BaseModel): + pass + + +class VonagePhoneConversationActionInput(ActionInput[ParametersType]): vonage_uuid: str -class TwilioPhoneCallActionInput(ActionInput[ParametersType]): +class TwilioPhoneConversationActionInput(ActionInput[ParametersType]): twilio_sid: str @@ -51,4 +122,8 @@ class TwilioPhoneCallActionInput(ActionInput[ParametersType]): class ActionOutput(BaseModel, Generic[ResponseType]): action_type: str + canned_response: Optional[BaseMessage] = None response: ResponseType + + +ExternalActionProcessingMode = Literal["muted"] diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index 47e7da1df7..7e5a3e6bae 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -1,25 +1,37 @@ -from typing import List, Optional, Union from enum import Enum -from langchain.prompts import PromptTemplate +from typing import List, Literal, Optional, Union from pydantic.v1 import validator -from vocode.streaming.models.actions import ActionConfig -from vocode.streaming.models.message import BaseMessage -from .model import TypedModel, BaseModel +from .model import BaseModel, TypedModel from .vector_db import VectorDBConfig +from vocode.streaming.models.actions import ActionConfig +from vocode.streaming.models.message import BaseMessage FILLER_AUDIO_DEFAULT_SILENCE_THRESHOLD_SECONDS = 0.5 LLM_AGENT_DEFAULT_TEMPERATURE = 1.0 LLM_AGENT_DEFAULT_MAX_TOKENS = 256 LLM_AGENT_DEFAULT_MODEL_NAME = "text-curie-001" -CHAT_GPT_AGENT_DEFAULT_MODEL_NAME = "gpt-3.5-turbo-0613" +CHAT_GPT_AGENT_DEFAULT_MODEL_NAME = "gpt-3.5-turbo-1106" +CHAT_GPT_AGENT_16K_MODEL_NAME = "gpt-3.5-turbo-0613-16k" ACTION_AGENT_DEFAULT_MODEL_NAME = "gpt-3.5-turbo-0613" -CHAT_ANTHROPIC_DEFAULT_MODEL_NAME = "claude-v1" +CHAT_ANTHROPIC_DEFAULT_MODEL_NAME = "claude-3-haiku-20240307" CHAT_VERTEX_AI_DEFAULT_MODEL_NAME = "chat-bison@001" AZURE_OPENAI_DEFAULT_API_TYPE = "azure" -AZURE_OPENAI_DEFAULT_API_VERSION = "2023-03-15-preview" +AZURE_OPENAI_DEFAULT_API_VERSION = "2023-07-01-preview" AZURE_OPENAI_DEFAULT_ENGINE = "gpt-35-turbo" +AZURE_OPENAI_GPT_35_16K_ENGINE = "gpt-35-turbo-16k" +AZURE_OPENAI_GPT_4_ENGINE = "vocode-api-gpt4" +OPENAI_GPT_4_MODEL_NAME = "gpt-4" +OPENAI_GPT_4_32K_MODEL_NAME = "gpt-4-32k" +OPENAI_GPT_4_O_MODEL_NAME = "gpt-4o" +OPENAI_GPT_35_TURBO_1106_MODEL_NAME = "gpt-3.5-turbo-1106" +OPENAI_GPT_4_1106_PREVIEW_MODEL_NAME = "gpt-4-1106-preview" +ANTHROPIC_CLAUDE_3_HAIKU_MODEL_NAME = "claude-3-haiku-20240307" +ANTHROPIC_CLAUDE_3_SONNET_MODEL_NAME = "claude-3-sonnet-20240229" +ANTHROPIC_CLAUDE_3_OPUS_MODEL_NAME = "claude-3-opus-20240229" + +InterruptSensitivity = Literal["low", "high"] class AgentType(str, Enum): @@ -27,7 +39,7 @@ class AgentType(str, Enum): LLM = "agent_llm" CHAT_GPT_ALPHA = "agent_chat_gpt_alpha" CHAT_GPT = "agent_chat_gpt" - CHAT_ANTHROPIC = "agent_chat_anthropic" + ANTHROPIC = "agent_anthropic" CHAT_VERTEX_AI = "agent_chat_vertex_ai" ECHO = "agent_echo" GPT4ALL = "agent_gpt4all" @@ -57,67 +69,77 @@ class WebhookConfig(BaseModel): class AzureOpenAIConfig(BaseModel): + base_url: str + api_key: str + region: str + deployment_name: str + openai_model_name: str api_type: str = AZURE_OPENAI_DEFAULT_API_TYPE api_version: Optional[str] = AZURE_OPENAI_DEFAULT_API_VERSION - engine: str = AZURE_OPENAI_DEFAULT_ENGINE -class AgentConfig(TypedModel, type=AgentType.BASE.value): +class CutOffResponse(BaseModel): + messages: List[BaseMessage] = [BaseMessage(text="Sorry?")] + + +class AgentConfig(TypedModel, type=AgentType.BASE.value): # type: ignore initial_message: Optional[BaseMessage] = None generate_responses: bool = True allowed_idle_time_seconds: Optional[float] = None + num_check_human_present_times: int = 0 allow_agent_to_be_cut_off: bool = True end_conversation_on_goodbye: bool = False send_filler_audio: Union[bool, FillerAudioConfig] = False webhook_config: Optional[WebhookConfig] = None - track_bot_sentiment: bool = False actions: Optional[List[ActionConfig]] = None + initial_message_delay: float = 0.0 + goodbye_phrases: Optional[List[str]] = None + interrupt_sensitivity: InterruptSensitivity = "low" + cut_off_response: Optional[CutOffResponse] = None -class CutOffResponse(BaseModel): - messages: List[BaseMessage] = [BaseMessage(text="Sorry?")] - - -class LLMAgentConfig(AgentConfig, type=AgentType.LLM.value): +class LLMAgentConfig(AgentConfig, type=AgentType.LLM.value): # type: ignore prompt_preamble: str - expected_first_prompt: Optional[str] = None model_name: str = LLM_AGENT_DEFAULT_MODEL_NAME temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS - cut_off_response: Optional[CutOffResponse] = None -class ChatGPTAgentConfig(AgentConfig, type=AgentType.CHAT_GPT.value): +class LLMFallback(BaseModel): + provider: Literal["openai", "azure"] + model_name: str + + +class ChatGPTAgentConfig(AgentConfig, type=AgentType.CHAT_GPT.value): # type: ignore + openai_api_key: Optional[str] = None prompt_preamble: str - expected_first_prompt: Optional[str] = None model_name: str = CHAT_GPT_AGENT_DEFAULT_MODEL_NAME temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS - cut_off_response: Optional[CutOffResponse] = None azure_params: Optional[AzureOpenAIConfig] = None vector_db_config: Optional[VectorDBConfig] = None + # TODO: the below fields should moved up to AgentConfig, and their logic should live in BaseAgent + use_backchannels: bool = False + backchannel_probability: float = 0.7 + first_response_filler_message: Optional[str] = None + llm_fallback: Optional[LLMFallback] = None -class ChatAnthropicAgentConfig(AgentConfig, type=AgentType.CHAT_ANTHROPIC.value): +class AnthropicAgentConfig(AgentConfig, type=AgentType.ANTHROPIC.value): # type: ignore prompt_preamble: str model_name: str = CHAT_ANTHROPIC_DEFAULT_MODEL_NAME - max_tokens_to_sample: int = 200 + max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS + temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE -class ChatVertexAIAgentConfig(AgentConfig, type=AgentType.CHAT_VERTEX_AI.value): +class ChatVertexAIAgentConfig(AgentConfig, type=AgentType.CHAT_VERTEX_AI.value): # type: ignore prompt_preamble: str model_name: str = CHAT_VERTEX_AI_DEFAULT_MODEL_NAME generate_responses: bool = False # Google Vertex AI doesn't support streaming -class LlamacppAgentConfig(AgentConfig, type=AgentType.LLAMACPP.value): - prompt_preamble: str - llamacpp_kwargs: dict = {} - prompt_template: Optional[Union[PromptTemplate, str]] = None - - class InformationRetrievalAgentConfig( - AgentConfig, type=AgentType.INFORMATION_RETRIEVAL.value + AgentConfig, type=AgentType.INFORMATION_RETRIEVAL.value # type: ignore ): recipient_descriptor: str caller_descriptor: str @@ -126,18 +148,18 @@ class InformationRetrievalAgentConfig( # TODO: add fields for IVR, voicemail -class EchoAgentConfig(AgentConfig, type=AgentType.ECHO.value): +class EchoAgentConfig(AgentConfig, type=AgentType.ECHO.value): # type: ignore pass -class GPT4AllAgentConfig(AgentConfig, type=AgentType.GPT4ALL.value): +class GPT4AllAgentConfig(AgentConfig, type=AgentType.GPT4ALL.value): # type: ignore prompt_preamble: str model_path: str generate_responses: bool = False class RESTfulUserImplementedAgentConfig( - AgentConfig, type=AgentType.RESTFUL_USER_IMPLEMENTED.value + AgentConfig, type=AgentType.RESTFUL_USER_IMPLEMENTED.value # type: ignore ): class EndpointConfig(BaseModel): url: str @@ -159,13 +181,13 @@ class RESTfulAgentOutputType(str, Enum): END = "restful_agent_end" -class RESTfulAgentOutput(TypedModel, type=RESTfulAgentOutputType.BASE): +class RESTfulAgentOutput(TypedModel, type=RESTfulAgentOutputType.BASE): # type: ignore pass -class RESTfulAgentText(RESTfulAgentOutput, type=RESTfulAgentOutputType.TEXT): +class RESTfulAgentText(RESTfulAgentOutput, type=RESTfulAgentOutputType.TEXT): # type: ignore response: str -class RESTfulAgentEnd(RESTfulAgentOutput, type=RESTfulAgentOutputType.END): +class RESTfulAgentEnd(RESTfulAgentOutput, type=RESTfulAgentOutputType.END): # type: ignore pass diff --git a/vocode/streaming/models/audio.py b/vocode/streaming/models/audio.py new file mode 100644 index 0000000000..42108a7831 --- /dev/null +++ b/vocode/streaming/models/audio.py @@ -0,0 +1,15 @@ +from enum import Enum + + +class AudioEncoding(str, Enum): + LINEAR16 = "linear16" + MULAW = "mulaw" + + +class SamplingRate(int, Enum): + RATE_8000 = 8000 + RATE_16000 = 16000 + RATE_22050 = 22050 + RATE_24000 = 24000 + RATE_44100 = 44100 + RATE_48000 = 48000 diff --git a/vocode/streaming/models/audio_encoding.py b/vocode/streaming/models/audio_encoding.py deleted file mode 100644 index 1fd3240021..0000000000 --- a/vocode/streaming/models/audio_encoding.py +++ /dev/null @@ -1,6 +0,0 @@ -from enum import Enum - - -class AudioEncoding(str, Enum): - LINEAR16 = "linear16" - MULAW = "mulaw" diff --git a/vocode/streaming/models/client_backend.py b/vocode/streaming/models/client_backend.py index da4f3de76c..e655f32b39 100644 --- a/vocode/streaming/models/client_backend.py +++ b/vocode/streaming/models/client_backend.py @@ -1,5 +1,6 @@ from typing import Optional -from vocode.streaming.models.audio_encoding import AudioEncoding + +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.model import BaseModel diff --git a/vocode/streaming/models/events.py b/vocode/streaming/models/events.py index 9d9a143a92..901fd3a333 100644 --- a/vocode/streaming/models/events.py +++ b/vocode/streaming/models/events.py @@ -1,5 +1,6 @@ from enum import Enum from typing import Optional + from vocode.streaming.models.model import TypedModel @@ -8,6 +9,7 @@ class Sender(str, Enum): BOT = "bot" ACTION_WORKER = "action_worker" VECTOR_DB = "vector_db" + CONFERENCE = "conference" class EventType(str, Enum): @@ -15,6 +17,7 @@ class EventType(str, Enum): TRANSCRIPT_COMPLETE = "event_transcript_complete" PHONE_CALL_CONNECTED = "event_phone_call_connected" PHONE_CALL_ENDED = "event_phone_call_ended" + PHONE_CALL_DID_NOT_CONNECT = "event_phone_call_did_not_connect" RECORDING = "event_recording" ACTION = "event_action" @@ -23,19 +26,23 @@ class Event(TypedModel): conversation_id: str -class PhoneCallConnectedEvent(Event, type=EventType.PHONE_CALL_CONNECTED): +class PhoneCallConnectedEvent(Event, type=EventType.PHONE_CALL_CONNECTED): # type: ignore to_phone_number: str from_phone_number: str -class PhoneCallEndedEvent(Event, type=EventType.PHONE_CALL_ENDED): +class PhoneCallEndedEvent(Event, type=EventType.PHONE_CALL_ENDED): # type: ignore conversation_minutes: float = 0 -class RecordingEvent(Event, type=EventType.RECORDING): +class PhoneCallDidNotConnectEvent(Event, type=EventType.PHONE_CALL_DID_NOT_CONNECT): # type: ignore + telephony_status: str + + +class RecordingEvent(Event, type=EventType.RECORDING): # type: ignore recording_url: str -class ActionEvent(Event, type=EventType.ACTION): +class ActionEvent(Event, type=EventType.ACTION): # type: ignore action_input: Optional[dict] = None action_output: Optional[dict] = None diff --git a/vocode/streaming/models/message.py b/vocode/streaming/models/message.py index 529e7dac47..db32f9e29a 100644 --- a/vocode/streaming/models/message.py +++ b/vocode/streaming/models/message.py @@ -1,16 +1,34 @@ from enum import Enum +from typing import Optional + from .model import TypedModel -from enum import Enum class MessageType(str, Enum): BASE = "message_base" SSML = "message_ssml" + BOT_BACKCHANNEL = "bot_backchannel" + LLM_TOKEN = "llm_token" -class BaseMessage(TypedModel, type=MessageType.BASE): +class BaseMessage(TypedModel, type=MessageType.BASE): # type: ignore text: str + trailing_silence_seconds: float = 0.0 + cache_phrase: Optional[str] = None -class SSMLMessage(BaseMessage, type=MessageType.SSML): +class SSMLMessage(BaseMessage, type=MessageType.SSML): # type: ignore ssml: str + + +class BotBackchannel(BaseMessage, type=MessageType.BOT_BACKCHANNEL): # type: ignore + pass + + +class LLMToken(BaseMessage, type=MessageType.LLM_TOKEN): # type: ignore + pass + + +class SilenceMessage(BotBackchannel): + text: str = "" + trailing_silence_seconds: float = 1.0 diff --git a/vocode/streaming/models/model.py b/vocode/streaming/models/model.py index a4a810e682..05ec13f6e6 100644 --- a/vocode/streaming/models/model.py +++ b/vocode/streaming/models/model.py @@ -1,12 +1,15 @@ from typing import Any, List, Tuple -from pydantic.v1 import BaseModel as PydanticBaseModel +from pydantic.v1 import BaseModel as Pydantic1BaseModel -class BaseModel(PydanticBaseModel): + +class BaseModel(Pydantic1BaseModel): def __init__(self, **data): for key, value in data.items(): if isinstance(value, dict): - if "type" in value: + if ( + "type" in value and key != "action_trigger" + ): # TODO: this is a quick workaround until we get a vocode object version of action trigger (ajay has approved it) data[key] = TypedModel.parse_obj(value) if isinstance(value, list): for i, v in enumerate(value): @@ -16,11 +19,11 @@ def __init__(self, **data): super().__init__(**data) -# Adapted from https://github.com/pydantic.v1/pydantic.v1/discussions/3091 +# Adapted from https://github.com/pydantic/pydantic/discussions/3091 class TypedModel(BaseModel): _subtypes_: List[Tuple[Any, Any]] = [] - def __init_subclass__(cls, type=None): + def __init_subclass__(cls, type=None): # type: ignore cls._subtypes_.append((type, cls)) @classmethod diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index c9d2c33b82..6820543c2d 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -1,16 +1,13 @@ from enum import Enum -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Literal, Optional from pydantic.v1 import validator -from vocode.streaming.models.client_backend import OutputAudioConfig -from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.telephony.constants import ( - DEFAULT_AUDIO_ENCODING, - DEFAULT_SAMPLING_RATE, -) +from .audio import AudioEncoding, SamplingRate from .model import BaseModel, TypedModel -from .audio_encoding import AudioEncoding +from vocode.streaming.models.client_backend import OutputAudioConfig +from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE class SynthesizerType(str, Enum): @@ -26,6 +23,7 @@ class SynthesizerType(str, Enum): COQUI = "synthesizer_coqui" BARK = "synthesizer_bark" POLLY = "synthesizer_polly" + CARTESIA = "synthesizer_cartesia" class SentimentConfig(BaseModel): @@ -38,7 +36,7 @@ def emotions_must_not_be_empty(cls, v): return v -class SynthesizerConfig(TypedModel, type=SynthesizerType.BASE.value): +class SynthesizerConfig(TypedModel, type=SynthesizerType.BASE.value): # type: ignore sampling_rate: int audio_encoding: AudioEncoding should_encode_as_wav: bool = False @@ -59,9 +57,7 @@ def from_output_device(cls, output_device: BaseOutputDevice, **kwargs): @classmethod def from_telephone_output_device(cls, **kwargs): return cls( - sampling_rate=DEFAULT_SAMPLING_RATE, - audio_encoding=DEFAULT_AUDIO_ENCODING, - **kwargs + sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=DEFAULT_AUDIO_ENCODING, **kwargs ) @classmethod @@ -78,7 +74,7 @@ def from_output_audio_config(cls, output_audio_config: OutputAudioConfig, **kwar AZURE_SYNTHESIZER_DEFAULT_RATE = 15 -class AzureSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.AZURE.value): +class AzureSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.AZURE.value): # type: ignore voice_name: str = AZURE_SYNTHESIZER_DEFAULT_VOICE_NAME pitch: int = AZURE_SYNTHESIZER_DEFAULT_PITCH rate: int = AZURE_SYNTHESIZER_DEFAULT_RATE @@ -91,7 +87,7 @@ class AzureSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.AZURE.value DEFAULT_GOOGLE_SPEAKING_RATE = 1.2 -class GoogleSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GOOGLE.value): +class GoogleSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GOOGLE.value): # type: ignore language_code: str = DEFAULT_GOOGLE_LANGUAGE_CODE voice_name: str = DEFAULT_GOOGLE_VOICE_NAME pitch: float = DEFAULT_GOOGLE_PITCH @@ -102,15 +98,17 @@ class GoogleSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GOOGLE.val class ElevenLabsSynthesizerConfig( - SynthesizerConfig, type=SynthesizerType.ELEVEN_LABS.value + SynthesizerConfig, type=SynthesizerType.ELEVEN_LABS.value # type: ignore ): api_key: Optional[str] = None voice_id: Optional[str] = ELEVEN_LABS_ADAM_VOICE_ID optimize_streaming_latency: Optional[int] - experimental_streaming: Optional[bool] = False + experimental_streaming: bool = False stability: Optional[float] similarity_boost: Optional[float] model_id: Optional[str] + experimental_websocket: bool = False + backchannel_amplitude_factor: float = 0.5 @validator("voice_id") def set_name(cls, voice_id): @@ -120,36 +118,46 @@ def set_name(cls, voice_id): def stability_and_similarity_boost_check(cls, similarity_boost, values): stability = values.get("stability") if (stability is None) != (similarity_boost is None): - raise ValueError( - "Both stability and similarity_boost must be set or not set." - ) + raise ValueError("Both stability and similarity_boost must be set or not set.") return similarity_boost @validator("optimize_streaming_latency") def optimize_streaming_latency_check(cls, optimize_streaming_latency): - if optimize_streaming_latency is not None and not ( - 0 <= optimize_streaming_latency <= 4 - ): + if optimize_streaming_latency is not None and not (0 <= optimize_streaming_latency <= 4): raise ValueError("optimize_streaming_latency must be between 0 and 4.") return optimize_streaming_latency + @validator("backchannel_amplitude_factor") + def backchannel_amplitude_factor_check(cls, backchannel_amplitude_factor): + if backchannel_amplitude_factor is not None and not (0 < backchannel_amplitude_factor <= 1): + raise ValueError( + "backchannel_amplitude_factor must be between 0 (not inclusive) and 1." + ) + return backchannel_amplitude_factor + +RIME_DEFAULT_BASE_URL = "https://users.rime.ai/v1/rime-tts" +RIME_DEFAULT_MODEL_ID = None RIME_DEFAULT_SPEAKER = "young_male_unmarked-1" -RIME_DEFAULT_SAMPLE_RATE = 22050 -RIME_DEFAULT_BASE_URL = "https://rjmopratfrdjgmfmaios.functions.supabase.co/rime-tts" +RIME_DEFAULT_SPEED_ALPHA = 1.0 +RIME_DEFAULT_SAMPLE_RATE = SamplingRate.RATE_22050 +RIME_DEFAULT_REDUCE_LATENCY = False +RimeModelId = Literal["mist", "v1"] -class RimeSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.RIME.value): +class RimeSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.RIME.value): # type: ignore + base_url: str = RIME_DEFAULT_BASE_URL + model_id: Optional[Literal[RimeModelId]] = RIME_DEFAULT_MODEL_ID speaker: str = RIME_DEFAULT_SPEAKER + speed_alpha: Optional[float] = RIME_DEFAULT_SPEED_ALPHA sampling_rate: int = RIME_DEFAULT_SAMPLE_RATE - base_url: str = RIME_DEFAULT_BASE_URL - speed_alpha: Optional[float] = None + reduce_latency: Optional[bool] = RIME_DEFAULT_REDUCE_LATENCY COQUI_DEFAULT_SPEAKER_ID = "ebe2db86-62a6-49a1-907a-9a1360d4416e" -class CoquiSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.COQUI.value): +class CoquiSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.COQUI.value): # type: ignore api_key: Optional[str] = None voice_id: Optional[str] = COQUI_DEFAULT_SPEAKER_ID voice_prompt: Optional[str] = None @@ -163,27 +171,36 @@ def override_voice_id_with_prompt(cls, voice_id, values): PLAYHT_DEFAULT_VOICE_ID = "larry" +PlayHtVoiceVersionType = Literal["1", "2"] -class PlayHtSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.PLAY_HT.value): +class PlayHtSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.PLAY_HT.value): # type: ignore api_key: Optional[str] = None user_id: Optional[str] = None - speed: Optional[int] = None + speed: Optional[float] = None seed: Optional[int] = None - temperature: Optional[int] = None + temperature: Optional[float] = None + quality: Optional[str] = None voice_id: str = PLAYHT_DEFAULT_VOICE_ID experimental_streaming: bool = False + version: Literal[PlayHtVoiceVersionType] = "2" + top_p: Optional[float] = None + text_guidance: Optional[float] = None + voice_guidance: Optional[float] = None + on_prem: bool = False + on_prem_provider: Literal["aws", "gcp"] = "gcp" + experimental_remove_silence: bool = False class CoquiTTSSynthesizerConfig( - SynthesizerConfig, type=SynthesizerType.COQUI_TTS.value + SynthesizerConfig, type=SynthesizerType.COQUI_TTS.value # type: ignore ): tts_kwargs: dict = {} speaker: Optional[str] = None language: Optional[str] = None -class GTTSSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GTTS.value): +class GTTSSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GTTS.value): # type: ignore pass @@ -191,22 +208,32 @@ class GTTSSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.GTTS.value): class StreamElementsSynthesizerConfig( - SynthesizerConfig, type=SynthesizerType.STREAM_ELEMENTS.value + SynthesizerConfig, type=SynthesizerType.STREAM_ELEMENTS.value # type: ignore ): voice: str = STREAM_ELEMENTS_SYNTHESIZER_DEFAULT_VOICE -class BarkSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.BARK.value): +class BarkSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.BARK.value): # type: ignore preload_kwargs: Dict[str, Any] = {} generate_kwargs: Dict[str, Any] = {} DEFAULT_POLLY_LANGUAGE_CODE = "en-US" DEFAULT_POLLY_VOICE_ID = "Matthew" -DEFAULT_POLLY_SAMPLING_RATE = 16000 +DEFAULT_POLLY_SAMPLING_RATE = SamplingRate.RATE_16000 -class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value): +class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value): # type: ignore language_code: str = DEFAULT_POLLY_LANGUAGE_CODE voice_id: str = DEFAULT_POLLY_VOICE_ID sampling_rate: int = DEFAULT_POLLY_SAMPLING_RATE + + +DEFAULT_CARTESIA_MODEL_ID = 'upbeat-moon' +DEFAULT_CARTESIA_VOICE_ID = '5345cf08-6f37-424d-a5d9-8ae1101b9377' + + +class CartesiaSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.CARTESIA.value): # type: ignore + api_key: Optional[str] = None + model_id: str = DEFAULT_CARTESIA_MODEL_ID + voice_id: str = DEFAULT_CARTESIA_VOICE_ID diff --git a/vocode/streaming/models/telephony.py b/vocode/streaming/models/telephony.py index 616a85b146..cd01b3ced5 100644 --- a/vocode/streaming/models/telephony.py +++ b/vocode/streaming/models/telephony.py @@ -1,12 +1,9 @@ from enum import Enum -from typing import Any, Dict, Optional -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.model import BaseModel, TypedModel +from typing import Any, Dict, Literal, Optional, Union + from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.synthesizer import ( - AzureSynthesizerConfig, - SynthesizerConfig, -) +from vocode.streaming.models.model import BaseModel, TypedModel +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig, SynthesizerConfig from vocode.streaming.models.transcriber import ( DeepgramTranscriberConfig, PunctuationEndpointingConfig, @@ -16,25 +13,28 @@ DEFAULT_AUDIO_ENCODING, DEFAULT_CHUNK_SIZE, DEFAULT_SAMPLING_RATE, - VONAGE_CHUNK_SIZE, VONAGE_AUDIO_ENCODING, + VONAGE_CHUNK_SIZE, VONAGE_SAMPLING_RATE, ) -class TwilioConfig(BaseModel): +class TelephonyProviderConfig(BaseModel): + record: bool = False + + +class TwilioConfig(TelephonyProviderConfig): account_sid: str auth_token: str - record: bool = False extra_params: Optional[Dict[str, Any]] = {} + account_supports_any_caller_id: bool = True -class VonageConfig(BaseModel): +class VonageConfig(TelephonyProviderConfig): api_key: str api_secret: str application_id: str private_key: str - record: bool = False class CallEntity(BaseModel): @@ -91,12 +91,19 @@ class CallConfigType(str, Enum): VONAGE = "call_config_vonage" -class BaseCallConfig(TypedModel, type=CallConfigType.BASE.value): +PhoneCallDirection = Literal["inbound", "outbound"] + + +class BaseCallConfig(TypedModel, type=CallConfigType.BASE.value): # type: ignore transcriber_config: TranscriberConfig agent_config: AgentConfig synthesizer_config: SynthesizerConfig from_phone: str to_phone: str + sentry_tags: Dict[str, str] = {} + conference: bool = False + telephony_params: Optional[Dict[str, str]] = None + direction: PhoneCallDirection @staticmethod def default_transcriber_config(): @@ -107,7 +114,7 @@ def default_synthesizer_config(): raise NotImplementedError -class TwilioCallConfig(BaseCallConfig, type=CallConfigType.TWILIO.value): +class TwilioCallConfig(BaseCallConfig, type=CallConfigType.TWILIO.value): # type: ignore twilio_config: TwilioConfig twilio_sid: str @@ -130,7 +137,7 @@ def default_synthesizer_config(): ) -class VonageCallConfig(BaseCallConfig, type=CallConfigType.VONAGE.value): +class VonageCallConfig(BaseCallConfig, type=CallConfigType.VONAGE.value): # type: ignore vonage_config: VonageConfig vonage_uuid: str output_to_speaker: bool = False @@ -152,3 +159,6 @@ def default_synthesizer_config(): sampling_rate=VONAGE_SAMPLING_RATE, audio_encoding=VONAGE_AUDIO_ENCODING, ) + + +TelephonyConfig = Union[TwilioConfig, VonageConfig] diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index d0391e9fd1..857e5b6c01 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -3,17 +3,19 @@ from pydantic.v1 import validator +from .audio import AudioEncoding +from .model import TypedModel from vocode.streaming.input_device.base_input_device import BaseInputDevice from vocode.streaming.models.client_backend import InputAudioConfig +from vocode.streaming.models.model import BaseModel from vocode.streaming.telephony.constants import ( DEFAULT_AUDIO_ENCODING, DEFAULT_CHUNK_SIZE, DEFAULT_SAMPLING_RATE, ) -from .audio_encoding import AudioEncoding -from .model import TypedModel AZURE_DEFAULT_LANGUAGE = "en-US" +DEEPGRAM_API_WS_URL = "wss://api.deepgram.com" class TranscriberType(str, Enum): @@ -33,21 +35,21 @@ class EndpointingType(str, Enum): PUNCTUATION_BASED = "endpointing_punctuation_based" -class EndpointingConfig(TypedModel, type=EndpointingType.BASE): +class EndpointingConfig(TypedModel, type=EndpointingType.BASE): # type: ignore pass -class TimeEndpointingConfig(EndpointingConfig, type=EndpointingType.TIME_BASED): +class TimeEndpointingConfig(EndpointingConfig, type=EndpointingType.TIME_BASED): # type: ignore time_cutoff_seconds: float = 0.4 class PunctuationEndpointingConfig( - EndpointingConfig, type=EndpointingType.PUNCTUATION_BASED + EndpointingConfig, type=EndpointingType.PUNCTUATION_BASED # type: ignore ): time_cutoff_seconds: float = 0.4 -class TranscriberConfig(TypedModel, type=TranscriberType.BASE.value): +class TranscriberConfig(TypedModel, type=TranscriberType.BASE.value): # type: ignore sampling_rate: int audio_encoding: AudioEncoding chunk_size: int @@ -103,30 +105,33 @@ def from_input_audio_config(cls, input_audio_config: InputAudioConfig, **kwargs) ) -class DeepgramTranscriberConfig(TranscriberConfig, type=TranscriberType.DEEPGRAM.value): +class DeepgramTranscriberConfig(TranscriberConfig, type=TranscriberType.DEEPGRAM.value): # type: ignore language: Optional[str] = None model: Optional[str] = "nova" tier: Optional[str] = None version: Optional[str] = None keywords: Optional[list] = None + api_key: Optional[str] = None + on_prem: bool = False + ws_url: str = DEEPGRAM_API_WS_URL -class GladiaTranscriberConfig(TranscriberConfig, type=TranscriberType.GLADIA.value): +class GladiaTranscriberConfig(TranscriberConfig, type=TranscriberType.GLADIA.value): # type: ignore buffer_size_seconds: float = 0.1 -class GoogleTranscriberConfig(TranscriberConfig, type=TranscriberType.GOOGLE.value): +class GoogleTranscriberConfig(TranscriberConfig, type=TranscriberType.GOOGLE.value): # type: ignore model: Optional[str] = None language_code: str = "en-US" -class AzureTranscriberConfig(TranscriberConfig, type=TranscriberType.AZURE.value): +class AzureTranscriberConfig(TranscriberConfig, type=TranscriberType.AZURE.value): # type: ignore language: str = AZURE_DEFAULT_LANGUAGE candidate_languages: Optional[List[str]] = None class AssemblyAITranscriberConfig( - TranscriberConfig, type=TranscriberType.ASSEMBLY_AI.value + TranscriberConfig, type=TranscriberType.ASSEMBLY_AI.value # type: ignore ): buffer_size_seconds: float = 0.1 word_boost: Optional[List[str]] = None @@ -134,12 +139,40 @@ class AssemblyAITranscriberConfig( class WhisperCPPTranscriberConfig( - TranscriberConfig, type=TranscriberType.WHISPER_CPP.value + TranscriberConfig, type=TranscriberType.WHISPER_CPP.value # type: ignore ): buffer_size_seconds: float = 1 libname: str fname_model: str -class RevAITranscriberConfig(TranscriberConfig, type=TranscriberType.REV_AI.value): +class RevAITranscriberConfig(TranscriberConfig, type=TranscriberType.REV_AI.value): # type: ignore pass + + +class Transcription(BaseModel): + message: str + confidence: float + is_final: bool + is_interrupt: bool = False + bot_was_in_medias_res: bool = False + duration_seconds: Optional[float] = None # gets added only on final transcription + + def __str__(self): + return ( + f"Transcription(message={self.message}, " + + f"confidence={self.confidence}, " + + f"is_final={self.is_final}, " + + f"is_interrupt={self.is_interrupt}, " + + f"bot_was_in_medias_res={self.bot_was_in_medias_res}, " + + f"duration_seconds={self.duration_seconds}, " + + f"wpm={self.wpm()}" + + ")" + ) + + def wpm(self) -> Optional[float]: + return ( + 60 * len(self.message.split()) / self.duration_seconds + if self.duration_seconds + else None + ) diff --git a/vocode/streaming/models/transcript.py b/vocode/streaming/models/transcript.py index 140a3adb9e..380047d3a9 100644 --- a/vocode/streaming/models/transcript.py +++ b/vocode/streaming/models/transcript.py @@ -1,10 +1,11 @@ import time -from typing import Any, Dict, List, Optional, Union +from datetime import datetime +from typing import List, Literal, Optional + from pydantic.v1 import BaseModel, Field -from enum import Enum -from vocode.streaming.models.actions import ActionInput, ActionOutput -from vocode.streaming.models.events import ActionEvent, Sender, Event, EventType +from vocode.streaming.models.actions import ActionInput, ActionOutput +from vocode.streaming.models.events import ActionEvent, Event, EventType, Sender from vocode.streaming.utils.events_manager import EventsManager @@ -15,14 +16,34 @@ class EventLog(BaseModel): def to_string(self, include_timestamp: bool = False) -> str: raise NotImplementedError + def get_timestamp_string(self, start_timestamp: float) -> str: + dt = datetime.fromtimestamp(self.timestamp - start_timestamp) + return f"[{dt.strftime('%M:%S')}.{dt.microsecond // 10000:02}]" + class Message(EventLog): text: str + is_final: bool = False + is_backchannel: bool = False + is_end_of_turn: bool = False - def to_string(self, include_timestamp: bool = False) -> str: + def to_string( + self, + include_timestamp: bool = False, + mark_human_backchannels_with_brackets: bool = False, + include_sender: bool = True, + ) -> str: + text = self.text + if not self.is_final and self.sender == Sender.BOT: + text = f"{text}-" + if self.is_backchannel and mark_human_backchannels_with_brackets: + text = f"[{text}]" if include_timestamp: - return f"{self.sender.name}: {self.text} ({self.timestamp})" - return f"{self.sender.name}: {self.text}" + return f"{self.sender.name}: {text} ({self.timestamp})" + elif include_sender: + return f"{self.sender.name}: {text}" + else: + return text class ActionStart(EventLog): @@ -30,21 +51,69 @@ class ActionStart(EventLog): action_type: str action_input: ActionInput - def to_string(self, include_timestamp: bool = False): + def to_string(self, include_timestamp: bool = False, include_header: bool = True): + main_string = self.action_input.action_config.action_attempt_to_string(self.action_input) + if include_header: + main_string = f"BOT_ACTION_START: {main_string}" if include_timestamp: - return f"{Sender.ACTION_WORKER.name}: params={self.action_input.params.dict()} ({self.timestamp})" - return f"{Sender.ACTION_WORKER.name}: params={self.action_input.params.dict()}" + return f"{main_string} ({self.timestamp})" + return main_string class ActionFinish(EventLog): sender: Sender = Sender.ACTION_WORKER action_type: str + action_input: ActionInput action_output: ActionOutput - def to_string(self, include_timestamp: bool = False): + def to_string(self, include_timestamp: bool = False, include_header: bool = True): + main_string = self.action_input.action_config.action_result_to_string( + self.action_input, self.action_output + ) + if include_header: + main_string = f"BOT_ACTION_FINISH: {main_string}" + if include_timestamp: + return f"{main_string} ({self.timestamp})" + return main_string + + +ConferenceEventType = Literal[ + "participant_joined", "participant_left", "participant_unanswered", "voicemail" +] +ConferenceEventRole = Literal["primary", "transfer"] + + +class ConferenceEvent(EventLog): + sender: Sender = Sender.CONFERENCE + conference_event_type: ConferenceEventType + conference_event_role: ConferenceEventRole + participant_phone_number: str + + def to_string(self, include_timestamp: bool = False, include_sender: bool = True): + if ( + self.conference_event_type == "participant_unanswered" + or self.conference_event_type == "voicemail" + ): + msg_string = f"{self.conference_event_role.capitalize()} number ({self.participant_phone_number}) did not join the conference because they are busy" + else: + verb = "joined" if self.conference_event_type == "participant_joined" else "left" + msg_string = f"{self.conference_event_role.capitalize()} number ({self.participant_phone_number}) {verb} the conference" + if include_sender: + msg_string = f"CONFERENCE_EVENT: {msg_string}" + if include_timestamp: + return f"{msg_string} ({self.timestamp})" + return msg_string + + +class TranscriptEvent(Event, type=EventType.TRANSCRIPT): # type: ignore + text: str + sender: Sender + timestamp: float + + def to_string(self, include_timestamp: bool = False) -> str: if include_timestamp: - return f"{Sender.ACTION_WORKER.name}: action_type='{self.action_type}' response={self.action_output.response.dict()} ({self.timestamp})" - return f"{Sender.ACTION_WORKER.name}: action_type='{self.action_type}' response={self.action_output.response.dict()}" + return f"{self.sender.name}: {self.text} ({self.timestamp})" + return f"{self.sender.name}: {self.text}" class Transcript(BaseModel): @@ -55,18 +124,29 @@ class Transcript(BaseModel): class Config: arbitrary_types_allowed = True + def to_string( + self, include_timestamps: bool = False, mark_human_backchannels_with_brackets: bool = False + ) -> str: + event_strings = [] + for event in self.event_logs: + if isinstance(event, Message): + event_string = event.to_string( + include_timestamp=False, + mark_human_backchannels_with_brackets=mark_human_backchannels_with_brackets, + ) + else: + event_string = event.to_string(include_timestamp=False) + + if include_timestamps: + event_string = f"{event.get_timestamp_string(self.start_time)} {event_string}" + event_strings.append(event_string) + + return "\n".join(event_strings) + def attach_events_manager(self, events_manager: EventsManager): self.events_manager = events_manager - def to_string(self, include_timestamps: bool = False) -> str: - return "\n".join( - event.to_string(include_timestamp=include_timestamps) - for event in self.event_logs - ) - - def maybe_publish_transcript_event_from_message( - self, message: Message, conversation_id: str - ): + def maybe_publish_transcript_event_from_message(self, message: Message, conversation_id: str): if self.events_manager is not None: self.events_manager.publish_event( TranscriptEvent( @@ -82,10 +162,18 @@ def add_message_from_props( text: str, sender: Sender, conversation_id: str, + is_final: bool = False, + is_backchannel: bool = False, publish_to_events_manager: bool = True, ): timestamp = time.time() - message = Message(text=text, sender=sender, timestamp=timestamp) + message = Message( + text=text, + sender=sender, + timestamp=timestamp, + is_final=is_final, + is_backchannel=is_backchannel, + ) self.event_logs.append(message) if publish_to_events_manager: self.maybe_publish_transcript_event_from_message( @@ -104,18 +192,20 @@ def add_message( message=message, conversation_id=conversation_id ) - def add_human_message(self, text: str, conversation_id: str): + def add_human_message(self, text: str, conversation_id: str, is_backchannel: bool = False): self.add_message_from_props( text=text, sender=Sender.HUMAN, conversation_id=conversation_id, + is_backchannel=is_backchannel, ) - def add_bot_message(self, text: str, conversation_id: str): + def add_bot_message(self, text: str, conversation_id: str, is_final: bool = False): self.add_message_from_props( text=text, sender=Sender.BOT, conversation_id=conversation_id, + is_final=is_final, ) def get_last_user_message(self): @@ -149,6 +239,7 @@ def add_action_finish_log( timestamp = time.time() self.event_logs.append( ActionFinish( + action_input=action_input, action_output=action_output, action_type=action_output.action_type, timestamp=timestamp, @@ -170,17 +261,17 @@ def update_last_bot_message_on_cut_off(self, text: str): event_log.text = text break - -class TranscriptEvent(Event, type=EventType.TRANSCRIPT): - text: str - sender: Sender - timestamp: float - - def to_string(self, include_timestamp: bool = False) -> str: - if include_timestamp: - return f"{self.sender.name}: {self.text} ({self.timestamp})" - return f"{self.sender.name}: {self.text}" + def was_last_message_interrupted(self): + bot_messages = [ + message + for message in self.event_logs + if isinstance(message, Message) and message.sender == Sender.BOT + ] + if len(bot_messages) > 0: + last_bot_message = bot_messages[-1] + return not last_bot_message.is_final or not last_bot_message.is_end_of_turn + return False -class TranscriptCompleteEvent(Event, type=EventType.TRANSCRIPT_COMPLETE): +class TranscriptCompleteEvent(Event, type=EventType.TRANSCRIPT_COMPLETE): # type: ignore transcript: Transcript diff --git a/vocode/streaming/models/vector_db.py b/vocode/streaming/models/vector_db.py index b87c5bade5..44fdf64c6d 100644 --- a/vocode/streaming/models/vector_db.py +++ b/vocode/streaming/models/vector_db.py @@ -1,5 +1,6 @@ from enum import Enum from typing import Optional + from .model import TypedModel DEFAULT_EMBEDDINGS_MODEL = "text-embedding-ada-002" @@ -10,12 +11,12 @@ class VectorDBType(str, Enum): PINECONE = "vector_db_pinecone" -class VectorDBConfig(TypedModel, type=VectorDBType.BASE.value): +class VectorDBConfig(TypedModel, type=VectorDBType.BASE.value): # type: ignore embeddings_model: str = DEFAULT_EMBEDDINGS_MODEL -class PineconeConfig(VectorDBConfig, type=VectorDBType.PINECONE.value): +class PineconeConfig(VectorDBConfig, type=VectorDBType.PINECONE.value): # type: ignore index: str - api_key: Optional[str] = None - api_environment: Optional[str] = None + api_key: Optional[str] + api_environment: Optional[str] top_k: int = 3 diff --git a/vocode/streaming/models/websocket.py b/vocode/streaming/models/websocket.py index 41a302dc64..ab1f8e42b2 100644 --- a/vocode/streaming/models/websocket.py +++ b/vocode/streaming/models/websocket.py @@ -2,14 +2,13 @@ from enum import Enum from typing import Optional -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.client_backend import InputAudioConfig, OutputAudioConfig -from .model import TypedModel -from .transcriber import TranscriberConfig from .agent import AgentConfig -from .synthesizer import SynthesizerConfig from .events import Sender +from .model import TypedModel +from .synthesizer import SynthesizerConfig +from .transcriber import TranscriberConfig from .transcript import TranscriptEvent +from vocode.streaming.models.client_backend import InputAudioConfig, OutputAudioConfig class WebSocketMessageType(str, Enum): @@ -22,11 +21,11 @@ class WebSocketMessageType(str, Enum): AUDIO_CONFIG_START = "websocket_audio_config_start" -class WebSocketMessage(TypedModel, type=WebSocketMessageType.BASE): +class WebSocketMessage(TypedModel, type=WebSocketMessageType.BASE): # type: ignore pass -class AudioMessage(WebSocketMessage, type=WebSocketMessageType.AUDIO): +class AudioMessage(WebSocketMessage, type=WebSocketMessageType.AUDIO): # type: ignore data: str @classmethod @@ -37,7 +36,7 @@ def get_bytes(self) -> bytes: return base64.b64decode(self.data) -class TranscriptMessage(WebSocketMessage, type=WebSocketMessageType.TRANSCRIPT): +class TranscriptMessage(WebSocketMessage, type=WebSocketMessageType.TRANSCRIPT): # type: ignore text: str sender: Sender timestamp: float @@ -47,7 +46,7 @@ def from_event(cls, event: TranscriptEvent): return cls(text=event.text, sender=event.sender, timestamp=event.timestamp) -class StartMessage(WebSocketMessage, type=WebSocketMessageType.START): +class StartMessage(WebSocketMessage, type=WebSocketMessageType.START): # type: ignore transcriber_config: TranscriberConfig agent_config: AgentConfig synthesizer_config: SynthesizerConfig @@ -55,7 +54,7 @@ class StartMessage(WebSocketMessage, type=WebSocketMessageType.START): class AudioConfigStartMessage( - WebSocketMessage, type=WebSocketMessageType.AUDIO_CONFIG_START + WebSocketMessage, type=WebSocketMessageType.AUDIO_CONFIG_START # type: ignore ): input_audio_config: InputAudioConfig output_audio_config: OutputAudioConfig @@ -63,9 +62,9 @@ class AudioConfigStartMessage( subscribe_transcript: Optional[bool] = None -class ReadyMessage(WebSocketMessage, type=WebSocketMessageType.READY): +class ReadyMessage(WebSocketMessage, type=WebSocketMessageType.READY): # type: ignore pass -class StopMessage(WebSocketMessage, type=WebSocketMessageType.STOP): +class StopMessage(WebSocketMessage, type=WebSocketMessageType.STOP): # type: ignore pass diff --git a/vocode/streaming/models/websocket_agent.py b/vocode/streaming/models/websocket_agent.py index c94224260e..f9d06e59e7 100644 --- a/vocode/streaming/models/websocket_agent.py +++ b/vocode/streaming/models/websocket_agent.py @@ -1,7 +1,7 @@ from enum import Enum from typing import Optional -from vocode.streaming.models.agent import AgentConfig, AgentType +from vocode.streaming.models.agent import AgentConfig, AgentType from vocode.streaming.models.model import BaseModel, TypedModel @@ -11,12 +11,12 @@ class WebSocketAgentMessageType(str, Enum): STOP = "websocket_agent_stop" -class WebSocketAgentMessage(TypedModel, type=WebSocketAgentMessageType.BASE): +class WebSocketAgentMessage(TypedModel, type=WebSocketAgentMessageType.BASE): # type: ignore conversation_id: Optional[str] = None class WebSocketAgentTextMessage( - WebSocketAgentMessage, type=WebSocketAgentMessageType.TEXT + WebSocketAgentMessage, type=WebSocketAgentMessageType.TEXT # type: ignore ): class Payload(BaseModel): text: str @@ -29,13 +29,13 @@ def from_text(cls, text: str, conversation_id: Optional[str] = None): class WebSocketAgentStopMessage( - WebSocketAgentMessage, type=WebSocketAgentMessageType.STOP + WebSocketAgentMessage, type=WebSocketAgentMessageType.STOP # type: ignore ): pass class WebSocketUserImplementedAgentConfig( - AgentConfig, type=AgentType.WEBSOCKET_USER_IMPLEMENTED.value + AgentConfig, type=AgentType.WEBSOCKET_USER_IMPLEMENTED.value # type: ignore ): class RouteConfig(BaseModel): url: str diff --git a/vocode/streaming/output_device/base_output_device.py b/vocode/streaming/output_device/base_output_device.py index 52bb7bcbe1..2ce90d5c2f 100644 --- a/vocode/streaming/output_device/base_output_device.py +++ b/vocode/streaming/output_device/base_output_device.py @@ -1,4 +1,4 @@ -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding class BaseOutputDevice: @@ -12,8 +12,5 @@ def start(self): def consume_nonblocking(self, chunk: bytes): raise NotImplemented - def maybe_send_mark_nonblocking(self, message): - pass - def terminate(self): pass diff --git a/vocode/streaming/output_device/blocking_speaker_output.py b/vocode/streaming/output_device/blocking_speaker_output.py index 7c402fbf32..ba1515d9c1 100644 --- a/vocode/streaming/output_device/blocking_speaker_output.py +++ b/vocode/streaming/output_device/blocking_speaker_output.py @@ -1,10 +1,11 @@ import asyncio import queue from typing import Optional -import sounddevice as sd + import numpy as np -from vocode.streaming.models.audio_encoding import AudioEncoding +import sounddevice as sd +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.utils.worker import ThreadAsyncWorker @@ -22,7 +23,7 @@ def __init__( sampling_rate = sampling_rate or int( self.device_info.get("default_samplerate", self.DEFAULT_SAMPLING_RATE) ) - self.input_queue = asyncio.Queue() + self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() BaseOutputDevice.__init__(self, sampling_rate, audio_encoding) ThreadAsyncWorker.__init__(self, self.input_queue) self.stream = sd.OutputStream( diff --git a/vocode/streaming/output_device/file_output_device.py b/vocode/streaming/output_device/file_output_device.py index 3538bee7c9..d9ab22d8dd 100644 --- a/vocode/streaming/output_device/file_output_device.py +++ b/vocode/streaming/output_device/file_output_device.py @@ -1,10 +1,11 @@ +import asyncio import wave from asyncio import Queue -import asyncio + import numpy as np from .base_output_device import BaseOutputDevice -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.utils.worker import ThreadAsyncWorker diff --git a/vocode/streaming/output_device/speaker_output.py b/vocode/streaming/output_device/speaker_output.py index 69c0729f07..543dbbfb0c 100644 --- a/vocode/streaming/output_device/speaker_output.py +++ b/vocode/streaming/output_device/speaker_output.py @@ -1,10 +1,11 @@ import queue from typing import Optional -import sounddevice as sd + import numpy as np +import sounddevice as sd from .base_output_device import BaseOutputDevice -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding class SpeakerOutput(BaseOutputDevice): diff --git a/vocode/streaming/output_device/twilio_output_device.py b/vocode/streaming/output_device/twilio_output_device.py index f92c20d02d..0563f08cff 100644 --- a/vocode/streaming/output_device/twilio_output_device.py +++ b/vocode/streaming/output_device/twilio_output_device.py @@ -1,31 +1,25 @@ from __future__ import annotations import asyncio -import json import base64 +import json from typing import Optional from fastapi import WebSocket from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.telephony.constants import ( - DEFAULT_AUDIO_ENCODING, - DEFAULT_SAMPLING_RATE, -) +from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log class TwilioOutputDevice(BaseOutputDevice): - def __init__( - self, ws: Optional[WebSocket] = None, stream_sid: Optional[str] = None - ): - super().__init__( - sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=DEFAULT_AUDIO_ENCODING - ) + def __init__(self, ws: Optional[WebSocket] = None, stream_sid: Optional[str] = None): + super().__init__(sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=DEFAULT_AUDIO_ENCODING) self.ws = ws self.stream_sid = stream_sid self.active = True self.queue: asyncio.Queue[str] = asyncio.Queue() - self.process_task = asyncio.create_task(self.process()) + self.process_task = asyncio_create_task_with_done_error_log(self.process()) async def process(self): while self.active: @@ -40,15 +34,32 @@ def consume_nonblocking(self, chunk: bytes): } self.queue.put_nowait(json.dumps(twilio_message)) - def maybe_send_mark_nonblocking(self, message_sent): + def send_chunk_finished_mark(self, utterance_id, chunk_idx): mark_message = { "event": "mark", "streamSid": self.stream_sid, "mark": { - "name": "Sent {}".format(message_sent), + "name": f"chunk-{utterance_id}-{chunk_idx}", }, } self.queue.put_nowait(json.dumps(mark_message)) + def send_utterance_finished_mark(self, utterance_id): + mark_message = { + "event": "mark", + "streamSid": self.stream_sid, + "mark": { + "name": f"utterance-{utterance_id}", + }, + } + self.queue.put_nowait(json.dumps(mark_message)) + + def send_clear_message(self): + clear_message = { + "event": "clear", + "streamSid": self.stream_sid, + } + self.queue.put_nowait(json.dumps(clear_message)) + def terminate(self): self.process_task.cancel() diff --git a/vocode/streaming/output_device/vonage_output_device.py b/vocode/streaming/output_device/vonage_output_device.py index 186c9d0aa2..6466303226 100644 --- a/vocode/streaming/output_device/vonage_output_device.py +++ b/vocode/streaming/output_device/vonage_output_device.py @@ -1,16 +1,17 @@ import asyncio from typing import Optional -import wave from fastapi import WebSocket -from vocode.streaming.models.audio_encoding import AudioEncoding + from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.output_device.speaker_output import SpeakerOutput from vocode.streaming.telephony.constants import ( + PCM_SILENCE_BYTE, VONAGE_AUDIO_ENCODING, VONAGE_CHUNK_SIZE, VONAGE_SAMPLING_RATE, ) +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log class VonageOutputDevice(BaseOutputDevice): @@ -19,13 +20,11 @@ def __init__( ws: Optional[WebSocket] = None, output_to_speaker: bool = False, ): - super().__init__( - sampling_rate=VONAGE_SAMPLING_RATE, audio_encoding=VONAGE_AUDIO_ENCODING - ) + super().__init__(sampling_rate=VONAGE_SAMPLING_RATE, audio_encoding=VONAGE_AUDIO_ENCODING) self.ws = ws self.active = True self.queue: asyncio.Queue[bytes] = asyncio.Queue() - self.process_task = asyncio.create_task(self.process()) + self.process_task = asyncio_create_task_with_done_error_log(self.process()) self.output_to_speaker = output_to_speaker if output_to_speaker: self.output_speaker = SpeakerOutput.from_default_device( @@ -39,13 +38,12 @@ async def process(self): self.output_speaker.consume_nonblocking(chunk) for i in range(0, len(chunk), VONAGE_CHUNK_SIZE): subchunk = chunk[i : i + VONAGE_CHUNK_SIZE] + if len(subchunk) % 2 == 1: + subchunk += PCM_SILENCE_BYTE # pad with silence, Vonage goes crazy otherwise await self.ws.send_bytes(subchunk) def consume_nonblocking(self, chunk: bytes): self.queue.put_nowait(chunk) - def maybe_send_mark_nonblocking(self, message_sent): - pass - def terminate(self): self.process_task.cancel() diff --git a/vocode/streaming/output_device/websocket_output_device.py b/vocode/streaming/output_device/websocket_output_device.py index 53f82f622d..ca0133c145 100644 --- a/vocode/streaming/output_device/websocket_output_device.py +++ b/vocode/streaming/output_device/websocket_output_device.py @@ -1,18 +1,18 @@ from __future__ import annotations import asyncio + from fastapi import WebSocket -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.models.websocket import AudioMessage -from vocode.streaming.models.websocket import TranscriptMessage + +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcript import TranscriptEvent +from vocode.streaming.models.websocket import AudioMessage, TranscriptMessage +from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log class WebsocketOutputDevice(BaseOutputDevice): - def __init__( - self, ws: WebSocket, sampling_rate: int, audio_encoding: AudioEncoding - ): + def __init__(self, ws: WebSocket, sampling_rate: int, audio_encoding: AudioEncoding): super().__init__(sampling_rate, audio_encoding) self.ws = ws self.active = False @@ -20,7 +20,7 @@ def __init__( def start(self): self.active = True - self.process_task = asyncio.create_task(self.process()) + self.process_task = asyncio_create_task_with_done_error_log(self.process()) def mark_closed(self): self.active = False diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index 0bf22cd861..8e47980166 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -3,71 +3,105 @@ import asyncio import queue import random +import re import threading -from typing import Any, Awaitable, Callable, Generic, Optional, Tuple, TypeVar, cast -import logging import time import typing - -from vocode.streaming.action.worker import ActionsWorker - -from vocode.streaming.agent.bot_sentiment_analyser import ( - BotSentimentAnalyser, -) -from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent -from vocode.streaming.models.actions import ActionInput -from vocode.streaming.models.events import Sender -from vocode.streaming.models.transcript import ( - Message, - Transcript, - TranscriptCompleteEvent, +from typing import ( + Any, + AsyncGenerator, + Awaitable, + Callable, + Generic, + Iterator, + List, + Optional, + Tuple, + TypeVar, + Union, ) -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.transcriber import EndpointingConfig, TranscriberConfig -from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.utils.conversation_logger_adapter import wrap_logger -from vocode.streaming.utils.events_manager import EventsManager -from vocode.streaming.utils.goodbye_model import GoodbyeModel -from vocode.streaming.models.agent import ChatGPTAgentConfig, FillerAudioConfig -from vocode.streaming.models.synthesizer import ( - SentimentConfig, -) -from vocode.streaming.constants import ( - TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS, - PER_CHUNK_ALLOWANCE_SECONDS, - ALLOWED_IDLE_TIME, -) +import sentry_sdk +from loguru import logger +from sentry_sdk.tracing import Span + +from vocode.streaming.action.worker import ActionsWorker from vocode.streaming.agent.base_agent import ( AgentInput, AgentResponse, AgentResponseFillerAudio, AgentResponseMessage, AgentResponseStop, - AgentResponseType, BaseAgent, TranscriptionAgentInput, ) +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.constants import ( + ALLOWED_IDLE_TIME, + CHECK_HUMAN_PRESENT_MESSAGE_CHOICES, + PER_CHUNK_ALLOWANCE_SECONDS, + TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS, +) +from vocode.streaming.models.actions import EndOfTurn +from vocode.streaming.models.agent import FillerAudioConfig +from vocode.streaming.models.events import Sender +from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken, SilenceMessage +from vocode.streaming.models.transcriber import TranscriberConfig, Transcription +from vocode.streaming.models.transcript import Message, Transcript, TranscriptCompleteEvent +from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.synthesizer.base_synthesizer import ( BaseSynthesizer, - SynthesisResult, FillerAudio, + SynthesisResult, ) +from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer +from vocode.streaming.transcriber.base_transcriber import BaseTranscriber +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber from vocode.streaming.utils import create_conversation_id, get_chunk_size_per_second -from vocode.streaming.transcriber.base_transcriber import ( - Transcription, - BaseTranscriber, -) +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.events_manager import EventsManager +from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.state_manager import ConversationStateManager from vocode.streaming.utils.worker import ( AsyncQueueWorker, + InterruptibleAgentResponseEvent, InterruptibleAgentResponseWorker, InterruptibleEvent, InterruptibleEventFactory, - InterruptibleAgentResponseEvent, - InterruptibleWorker, +) +from vocode.utils.sentry_utils import ( + CustomSentrySpans, + complete_span_by_op, + sentry_create_span, + synthesizer_base_name_if_should_report_to_sentry, ) +BACKCHANNEL_PATTERNS = [ + r"m+-?hm+", + r"m+", + r"oh+", + r"ah+", + r"um+", + r"uh+", + "yes", + "sure", + "quite", + "right", + "really", + "good heavens", + "i see", + "of course", + "oh dear", + "oh god", + "thats nice", + "thats not bad", + "thats right", + r"yeah+", + "makes sense", +] +LOW_INTERRUPT_SENSITIVITY_BACKCHANNEL_UTTERANCE_LENGTH_THRESHOLD = 3 + + OutputDeviceType = TypeVar("OutputDeviceType", bound=BaseOutputDevice) @@ -77,10 +111,13 @@ def __init__(self, conversation: "StreamingConversation"): self.conversation = conversation def create_interruptible_event( - self, payload: Any, is_interruptible: bool = True + self, + payload: Any, + is_interruptible: bool = True, ) -> InterruptibleEvent[Any]: - interruptible_event: InterruptibleEvent = ( - super().create_interruptible_event(payload, is_interruptible) + interruptible_event: InterruptibleEvent = super().create_interruptible_event( + payload, + is_interruptible, ) self.conversation.interruptible_events.put_nowait(interruptible_event) return interruptible_event @@ -115,42 +152,163 @@ def __init__( self.output_queue = output_queue self.conversation = conversation self.interruptible_event_factory = interruptible_event_factory + self.in_interrupt_endpointing_config = False + self.deepgram_transcriber: Optional[DeepgramTranscriber] = None + if isinstance(self.conversation.transcriber, DeepgramTranscriber): + self.deepgram_transcriber = self.conversation.transcriber + self.has_associated_ignored_utterance: bool = False + self.has_associated_unignored_utterance: bool = False + self.human_backchannels_buffer: List[Transcription] = [] + self.ignore_next_message: bool = False + + def should_ignore_utterance(self, transcription: Transcription): + if self.has_associated_unignored_utterance: + return False + bot_still_speaking = self.is_bot_still_speaking() + if self.has_associated_ignored_utterance or bot_still_speaking: + logger.info( + f"Associated ignored utterance: {self.has_associated_ignored_utterance}. Bot still speaking: {bot_still_speaking}" + ) + return self.is_transcription_backchannel(transcription) + return False + + def is_transcription_backchannel(self, transcription: Transcription): + num_words = len(transcription.message.strip().split()) + if ( + self.conversation.agent.get_agent_config().interrupt_sensitivity == "high" + and num_words >= 1 + ): + logger.info(f"High interrupt sensitivity; {num_words} word(s) not a backchannel") + return False + + if num_words <= LOW_INTERRUPT_SENSITIVITY_BACKCHANNEL_UTTERANCE_LENGTH_THRESHOLD: + return True + cleaned = re.sub("[^\w\s]", "", transcription.message).strip().lower() + return any(re.fullmatch(regex, cleaned) for regex in BACKCHANNEL_PATTERNS) + + def _most_recent_transcript_messages(self) -> Iterator[Message]: + return ( + event_log + for event_log in reversed(self.conversation.transcript.event_logs) + if isinstance(event_log, Message) + ) + + def get_maybe_last_transcript_event_log(self) -> Optional[Message]: + return next(self._most_recent_transcript_messages(), None) + + def is_bot_in_medias_res(self): + last_message = self.get_maybe_last_transcript_event_log() + return ( + last_message is not None + and not last_message.is_backchannel + and last_message.sender == Sender.BOT + and not last_message.is_final + and last_message.text.strip() != "" + ) + + def is_bot_still_speaking(self): # in_medias_res OR bot has more utterances + transcript_messages_iter = self._most_recent_transcript_messages() + last_message, second_to_last_message = next(transcript_messages_iter, None), next( + transcript_messages_iter, None + ) + + is_first_bot_message = ( + second_to_last_message is None or second_to_last_message.sender == Sender.HUMAN + ) + + return ( + last_message is not None + and not last_message.is_backchannel + and last_message.sender == Sender.BOT + and (not last_message.is_final or not last_message.is_end_of_turn) + and not (is_first_bot_message and last_message.text.strip() == "") + ) async def process(self, transcription: Transcription): self.conversation.mark_last_action_timestamp() if transcription.message.strip() == "": - self.conversation.logger.info("Ignoring empty transcription") + logger.info("Ignoring empty transcription") + return + # ignore utterances during the initial message but still add them to the transcript + initial_message_ongoing = not self.conversation.initial_message_tracker.is_set() + if initial_message_ongoing or self.should_ignore_utterance(transcription): + logger.info( + f"Ignoring utterance: {transcription.message}. IMO: {initial_message_ongoing}" + ) + self.has_associated_ignored_utterance = ( + not transcription.is_final # if it's final, we're done with this backchannel + ) + if transcription.is_final: + # for all ignored backchannels, store them to be added to the transcript later + self.human_backchannels_buffer.append(transcription) + return + if self.ignore_next_message and transcription.is_final: + # TODO: delete this once transcription reset is implemented for processing conference voicemail + # Push human message to transcript but do not respond + self.has_associated_ignored_utterance = False + agent_response_tracker = None + self.ignore_next_message = False return if transcription.is_final: - self.conversation.logger.debug( - "Got transcription: {}, confidence: {}".format( - transcription.message, transcription.confidence + if ( + self.deepgram_transcriber is not None + and self.deepgram_transcriber.is_first_transcription + ): + logger.debug( + "Switching to non-first transcription endpointing config if configured" + ) + self.deepgram_transcriber.is_first_transcription = False + logger.debug( + "Got transcription: {}, confidence: {}, wpm: {}".format( + transcription.message, + transcription.confidence, + transcription.wpm(), ) ) - if ( - not self.conversation.is_human_speaking - and self.conversation.is_interrupt(transcription) - ): + if not self.conversation.is_human_speaking: self.conversation.current_transcription_is_interrupt = ( self.conversation.broadcast_interrupt() ) + self.has_associated_unignored_utterance = not transcription.is_final if self.conversation.current_transcription_is_interrupt: - self.conversation.logger.debug("sending interrupt") - self.conversation.logger.debug("Human started speaking") + logger.debug("sent interrupt") + logger.debug("Human started speaking") - transcription.is_interrupt = ( - self.conversation.current_transcription_is_interrupt - ) + transcription.is_interrupt = self.conversation.current_transcription_is_interrupt self.conversation.is_human_speaking = not transcription.is_final if transcription.is_final: - # we use getattr here to avoid the dependency cycle between VonageCall and StreamingConversation + self.has_associated_ignored_utterance = False + self.has_associated_unignored_utterance = False + agent_response_tracker = None + + # clear out backchannels and add to the transcript + for human_backchannel in self.human_backchannels_buffer: + self.conversation.transcript.add_human_message( + text=human_backchannel.message, + conversation_id=self.conversation.id, + is_backchannel=True, + ) + self.human_backchannels_buffer = [] + + if transcription.is_interrupt: + transcription.bot_was_in_medias_res = self.is_bot_in_medias_res() + logger.debug( + f"Bot is {'not ' if not transcription.bot_was_in_medias_res else ''}in medias res" + ) + + self.conversation.speed_manager.update(transcription) + + self.conversation.warmup_synthesizer() + + # we use getattr here to avoid the dependency cycle between PhoneConversation and StreamingConversation event = self.interruptible_event_factory.create_interruptible_event( TranscriptionAgentInput( transcription=transcription, conversation_id=self.conversation.id, vonage_uuid=getattr(self.conversation, "vonage_uuid", None), twilio_sid=getattr(self.conversation, "twilio_sid", None), - ) + agent_response_tracker=agent_response_tracker, + ), ) self.output_queue.put_nowait(event) @@ -173,16 +331,14 @@ def __init__( self.filler_audio_started_event: Optional[threading.Event] = None async def wait_for_filler_audio_to_finish(self): - if ( - self.filler_audio_started_event is None - or not self.filler_audio_started_event.set() - ): - self.conversation.logger.debug( - "Not waiting for filler audio to finish since we didn't send any chunks" + if self.filler_audio_started_event is None or not self.filler_audio_started_event.set(): + logger.debug( + "Not waiting for filler audio to finish since we didn't send any chunks", ) return if self.interruptible_event and isinstance( - self.interruptible_event, InterruptibleAgentResponseEvent + self.interruptible_event, + InterruptibleAgentResponseEvent, ): await self.interruptible_event.agent_response_tracker.wait() @@ -195,11 +351,9 @@ async def process(self, item: InterruptibleAgentResponseEvent[FillerAudio]): assert self.conversation.filler_audio_config is not None filler_synthesis_result = filler_audio.create_synthesis_result() self.current_filler_seconds_per_chunk = filler_audio.seconds_per_chunk - silence_threshold = ( - self.conversation.filler_audio_config.silence_threshold_seconds - ) + silence_threshold = self.conversation.filler_audio_config.silence_threshold_seconds await asyncio.sleep(silence_threshold) - self.conversation.logger.debug("Sending filler audio to output") + logger.debug("Sending filler audio to output") self.filler_audio_started_event = threading.Event() await self.conversation.send_speech_to_output( filler_audio.message.text, @@ -219,7 +373,9 @@ def __init__( self, input_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]], output_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[Tuple[BaseMessage, SynthesisResult]] + InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ] ], conversation: "StreamingConversation", interruptible_event_factory: InterruptibleEventFactory, @@ -232,22 +388,16 @@ def __init__( self.output_queue = output_queue self.conversation = conversation self.interruptible_event_factory = interruptible_event_factory - self.chunk_size = ( - get_chunk_size_per_second( - self.conversation.synthesizer.get_synthesizer_config().audio_encoding, - self.conversation.synthesizer.get_synthesizer_config().sampling_rate, - ) - * TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS - ) + self.chunk_size = self.conversation._get_synthesizer_chunk_size() + self.last_agent_response_tracker: Optional[asyncio.Event] = None + self.is_first_text_chunk = True def send_filler_audio(self, agent_response_tracker: Optional[asyncio.Event]): assert self.conversation.filler_audio_worker is not None - self.conversation.logger.debug("Sending filler audio") + logger.debug("Sending filler audio") if self.conversation.synthesizer.filler_audios: - filler_audio = random.choice( - self.conversation.synthesizer.filler_audios - ) - self.conversation.logger.debug(f"Chose {filler_audio.message.text}") + filler_audio = random.choice(self.conversation.synthesizer.filler_audios) + logger.debug(f"Chose {filler_audio.message.text}") event = self.interruptible_event_factory.create_interruptible_agent_response_event( filler_audio, is_interruptible=filler_audio.is_interruptible, @@ -255,15 +405,11 @@ def send_filler_audio(self, agent_response_tracker: Optional[asyncio.Event]): ) self.conversation.filler_audio_worker.consume_nonblocking(event) else: - self.conversation.logger.debug( - "No filler audio available for synthesizer" - ) + logger.debug("No filler audio available for synthesizer") async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): if not self.conversation.synthesis_enabled: - self.conversation.logger.debug( - "Synthesis disabled, not synthesizing speech" - ) + logger.debug("Synthesis disabled, not synthesizing speech") return try: agent_response = item.payload @@ -271,32 +417,101 @@ async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): self.send_filler_audio(item.agent_response_tracker) return if isinstance(agent_response, AgentResponseStop): - self.conversation.logger.debug("Agent requested to stop") + logger.debug("Agent requested to stop") + if self.last_agent_response_tracker is not None: + await self.last_agent_response_tracker.wait() item.agent_response_tracker.set() - await self.conversation.terminate() + await self.conversation.mark_terminated(bot_disconnect=True) return - agent_response_message = typing.cast( - AgentResponseMessage, agent_response - ) + agent_response_message = typing.cast(AgentResponseMessage, agent_response) if self.conversation.filler_audio_worker is not None: - if ( - self.conversation.filler_audio_worker.interrupt_current_filler_audio() - ): + if self.conversation.filler_audio_worker.interrupt_current_filler_audio(): await self.conversation.filler_audio_worker.wait_for_filler_audio_to_finish() - self.conversation.logger.debug("Synthesizing speech for message") - synthesis_result = await self.conversation.synthesizer.create_speech( - agent_response_message.message, - self.chunk_size, - bot_sentiment=self.conversation.bot_sentiment, - ) - self.produce_interruptible_agent_response_event_nonblocking( - (agent_response_message.message, synthesis_result), - is_interruptible=item.is_interruptible, - agent_response_tracker=item.agent_response_tracker, + if isinstance(agent_response_message.message, EndOfTurn): + logger.debug("Sending end of turn") + if isinstance(self.conversation.synthesizer, InputStreamingSynthesizer): + await self.conversation.synthesizer.handle_end_of_turn() + self.produce_interruptible_agent_response_event_nonblocking( + (agent_response_message.message, None), + is_interruptible=item.is_interruptible, + agent_response_tracker=item.agent_response_tracker, + ) + self.is_first_text_chunk = True + return + + synthesizer_base_name: Optional[str] = ( + synthesizer_base_name_if_should_report_to_sentry(self.conversation.synthesizer) ) + create_speech_span: Optional[Span] = None + ttft_span: Optional[Span] = None + synthesis_span: Optional[Span] = None + if synthesizer_base_name and agent_response_message.is_first: + complete_span_by_op(CustomSentrySpans.LANGUAGE_MODEL_TIME_TO_FIRST_TOKEN) + + sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=CustomSentrySpans.SYNTHESIS_TIME_TO_FIRST_TOKEN, + ) + + synthesis_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=f"{synthesizer_base_name}{CustomSentrySpans.SYNTHESIZER_SYNTHESIS_TOTAL}", + ) + if synthesis_span: + ttft_span = sentry_create_span( + sentry_callable=synthesis_span.start_child, + op=f"{synthesizer_base_name}{CustomSentrySpans.SYNTHESIZER_TIME_TO_FIRST_TOKEN}", + ) + if ttft_span: + create_speech_span = sentry_create_span( + sentry_callable=ttft_span.start_child, + op=f"{synthesizer_base_name}{CustomSentrySpans.SYNTHESIZER_CREATE_SPEECH}", + ) + maybe_synthesis_result: Optional[SynthesisResult] = None + if isinstance( + self.conversation.synthesizer, + InputStreamingSynthesizer, + ) and isinstance(agent_response_message.message, LLMToken): + logger.debug("Sending chunk to synthesizer") + await self.conversation.synthesizer.send_token_to_synthesizer( + message=agent_response_message.message, + chunk_size=self.chunk_size, + ) + else: + logger.debug("Synthesizing speech for message") + maybe_synthesis_result = await self.conversation.synthesizer.create_speech( + agent_response_message.message, + self.chunk_size, + is_first_text_chunk=self.is_first_text_chunk, + is_sole_text_chunk=agent_response_message.is_sole_text_chunk, + ) + if create_speech_span: + create_speech_span.finish() + # For input streaming synthesizers, subsequent chunks are contained in the same SynthesisResult + if isinstance(self.conversation.synthesizer, InputStreamingSynthesizer): + if not self.is_first_text_chunk: + maybe_synthesis_result = None + elif isinstance(agent_response_message.message, LLMToken): + maybe_synthesis_result = ( + self.conversation.synthesizer.get_current_utterance_synthesis_result() + ) + if maybe_synthesis_result is not None: + synthesis_result = maybe_synthesis_result + synthesis_result.is_first = agent_response_message.is_first + if not synthesis_result.cached and synthesis_span: + synthesis_result.synthesis_total_span = synthesis_span + synthesis_result.ttft_span = ttft_span + self.produce_interruptible_agent_response_event_nonblocking( + (agent_response_message.message, synthesis_result), + is_interruptible=item.is_interruptible, + agent_response_tracker=item.agent_response_tracker, + ) + self.last_agent_response_tracker = item.agent_response_tracker + if not isinstance(agent_response_message.message, SilenceMessage): + self.is_first_text_chunk = False except asyncio.CancelledError: pass @@ -306,30 +521,47 @@ class SynthesisResultsWorker(InterruptibleAgentResponseWorker): def __init__( self, input_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[Tuple[BaseMessage, SynthesisResult]] + InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ] ], conversation: "StreamingConversation", ): super().__init__(input_queue=input_queue) self.input_queue = input_queue self.conversation = conversation + self.last_transcript_message: Optional[Message] = None async def process( self, - item: InterruptibleAgentResponseEvent[Tuple[BaseMessage, SynthesisResult]], + item: InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ], ): try: message, synthesis_result = item.payload + if isinstance(message, EndOfTurn): + if self.last_transcript_message is not None: + self.last_transcript_message.is_end_of_turn = True + item.agent_response_tracker.set() + return + assert synthesis_result is not None # create an empty transcript message and attach it to the transcript transcript_message = Message( text="", sender=Sender.BOT, + is_backchannel=isinstance(message, BotBackchannel), ) - self.conversation.transcript.add_message( - message=transcript_message, - conversation_id=self.conversation.id, - publish_to_events_manager=False, - ) + if not isinstance(message, SilenceMessage): + self.conversation.transcript.add_message( + message=transcript_message, + conversation_id=self.conversation.id, + publish_to_events_manager=False, + ) + if isinstance(message, SilenceMessage): + logger.debug(f"Sending {message.trailing_silence_seconds} seconds of silence") + elif isinstance(message, BotBackchannel): + logger.debug(f"Sending backchannel: {message}") message_sent, cut_off = await self.conversation.send_speech_to_output( message.text, synthesis_result, @@ -343,25 +575,10 @@ async def process( conversation_id=self.conversation.id, ) item.agent_response_tracker.set() - self.conversation.logger.debug("Message sent: {}".format(message_sent)) + logger.debug("Message sent: {}".format(message_sent)) if cut_off: - self.conversation.agent.update_last_bot_message_on_cut_off( - message_sent - ) - if self.conversation.agent.agent_config.end_conversation_on_goodbye: - goodbye_detected_task = ( - self.conversation.agent.create_goodbye_detection_task( - message_sent - ) - ) - try: - if await asyncio.wait_for(goodbye_detected_task, 0.1): - self.conversation.logger.debug( - "Agent said goodbye, ending call" - ) - await self.conversation.terminate() - except asyncio.TimeoutError: - pass + self.conversation.agent.update_last_bot_message_on_cut_off(message_sent) + self.last_transcript_message = transcript_message except asyncio.CancelledError: pass @@ -371,16 +588,12 @@ def __init__( transcriber: BaseTranscriber[TranscriberConfig], agent: BaseAgent, synthesizer: BaseSynthesizer, + speed_coefficient: float = 1.0, conversation_id: Optional[str] = None, per_chunk_allowance_seconds: float = PER_CHUNK_ALLOWANCE_SECONDS, events_manager: Optional[EventsManager] = None, - logger: Optional[logging.Logger] = None, ): self.id = conversation_id or create_conversation_id() - self.logger = wrap_logger( - logger or logging.getLogger(__name__), - conversation_id=self.id, - ) self.output_device = output_device self.transcriber = transcriber self.agent = agent @@ -388,16 +601,16 @@ def __init__( self.synthesis_enabled = True self.interruptible_events: queue.Queue[InterruptibleEvent] = queue.Queue() - self.interruptible_event_factory = self.QueueingInterruptibleEventFactory( - conversation=self - ) + self.interruptible_event_factory = self.QueueingInterruptibleEventFactory(conversation=self) self.agent.set_interruptible_event_factory(self.interruptible_event_factory) self.synthesis_results_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[Tuple[BaseMessage, SynthesisResult]] - ] = asyncio.Queue() - self.filler_audio_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[FillerAudio] + InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ] ] = asyncio.Queue() + self.filler_audio_queue: asyncio.Queue[InterruptibleAgentResponseEvent[FillerAudio]] = ( + asyncio.Queue() + ) self.state_manager = self.create_state_manager() self.transcriptions_worker = self.TranscriptionsWorker( input_queue=self.transcriber.output_queue, @@ -422,44 +635,49 @@ def __init__( ) self.actions_worker.attach_conversation_state_manager(self.state_manager) self.synthesis_results_worker = self.SynthesisResultsWorker( - input_queue=self.synthesis_results_queue, conversation=self + input_queue=self.synthesis_results_queue, + conversation=self, ) self.filler_audio_worker = None self.filler_audio_config: Optional[FillerAudioConfig] = None if self.agent.get_agent_config().send_filler_audio: self.filler_audio_worker = self.FillerAudioWorker( - input_queue=self.filler_audio_queue, conversation=self + input_queue=self.filler_audio_queue, + conversation=self, ) + self.speed_coefficient = speed_coefficient + self.speed_manager = SpeedManager( + speed_coefficient=self.speed_coefficient, + ) + self.transcriber.attach_speed_manager(self.speed_manager) + self.agent.attach_speed_manager(self.speed_manager) + self.events_manager = events_manager or EventsManager() self.events_task: Optional[asyncio.Task] = None self.per_chunk_allowance_seconds = per_chunk_allowance_seconds self.transcript = Transcript() self.transcript.attach_events_manager(self.events_manager) - self.bot_sentiment = None - if self.agent.get_agent_config().track_bot_sentiment: - self.sentiment_config = ( - self.synthesizer.get_synthesizer_config().sentiment_config - ) - if not self.sentiment_config: - self.sentiment_config = SentimentConfig() - self.bot_sentiment_analyser = BotSentimentAnalyser( - emotions=self.sentiment_config.emotions - ) self.is_human_speaking = False self.active = False self.mark_last_action_timestamp() self.check_for_idle_task: Optional[asyncio.Task] = None - self.track_bot_sentiment_task: Optional[asyncio.Task] = None + self.check_for_idle_paused = False self.current_transcription_is_interrupt: bool = False + self.initial_message_tracker = asyncio.Event() + # tracing self.start_time: Optional[float] = None self.end_time: Optional[float] = None + self.idle_time_threshold = ( + self.agent.get_agent_config().allowed_idle_time_seconds or ALLOWED_IDLE_TIME + ) + def create_state_manager(self) -> ConversationStateManager: return ConversationStateManager(conversation=self) @@ -477,77 +695,99 @@ async def start(self, mark_ready: Optional[Callable[[], Awaitable[None]]] = None if not is_ready: raise Exception("Transcriber startup failed") if self.agent.get_agent_config().send_filler_audio: - if not isinstance( - self.agent.get_agent_config().send_filler_audio, FillerAudioConfig - ): + if not isinstance(self.agent.get_agent_config().send_filler_audio, FillerAudioConfig): self.filler_audio_config = FillerAudioConfig() else: self.filler_audio_config = typing.cast( - FillerAudioConfig, self.agent.get_agent_config().send_filler_audio + FillerAudioConfig, + self.agent.get_agent_config().send_filler_audio, ) await self.synthesizer.set_filler_audios(self.filler_audio_config) self.agent.start() initial_message = self.agent.get_agent_config().initial_message if initial_message: - asyncio.create_task(self.send_initial_message(initial_message)) + asyncio_create_task_with_done_error_log( + self.send_initial_message(initial_message), + ) + else: + self.initial_message_tracker.set() self.agent.attach_transcript(self.transcript) if mark_ready: await mark_ready() - if self.synthesizer.get_synthesizer_config().sentiment_config: - await self.update_bot_sentiment() self.active = True - if self.synthesizer.get_synthesizer_config().sentiment_config: - self.track_bot_sentiment_task = asyncio.create_task( - self.track_bot_sentiment() - ) - self.check_for_idle_task = asyncio.create_task(self.check_for_idle()) + self.check_for_idle_task = asyncio_create_task_with_done_error_log( + self.check_for_idle(), + ) if len(self.events_manager.subscriptions) > 0: - self.events_task = asyncio.create_task(self.events_manager.start()) + self.events_task = asyncio_create_task_with_done_error_log( + self.events_manager.start(), + ) + + def set_check_for_idle_paused(self, paused: bool): + logger.debug(f"Setting idle check paused to {paused}") + if not paused: + self.mark_last_action_timestamp() + self.check_for_idle_paused = paused - async def send_initial_message(self, initial_message: BaseMessage): + async def send_initial_message( + self, + initial_message: BaseMessage, + ): # TODO: configure if initial message is interruptible - self.transcriber.mute() - initial_message_tracker = asyncio.Event() + delay = self.agent.get_agent_config().initial_message_delay + if delay > 0: + logger.info(f"Waiting {delay} seconds before initial message") + await asyncio.sleep(delay) + await self.send_single_message( + message=initial_message, + message_tracker=self.initial_message_tracker, + ) + await self.initial_message_tracker.wait() + + async def action_on_idle(self): + logger.debug("Conversation idle for too long, terminating") + await self.mark_terminated(bot_disconnect=True) + return + + async def check_for_idle(self): + """Asks if human is still on the line if no activity is detected, and terminates the conversation if not.""" + await self.initial_message_tracker.wait() + check_human_present_count = 0 + check_human_present_threshold = self.agent.get_agent_config().num_check_human_present_times + while self.is_active(): + if ( + not self.check_for_idle_paused + ) and time.time() - self.last_action_timestamp > self.idle_time_threshold: + if check_human_present_count >= check_human_present_threshold: + # Stop the phone call after some retries to prevent infinitely long call where human is just silent. + await self.action_on_idle() + await self.send_single_message( + message=BaseMessage(text=random.choice(CHECK_HUMAN_PRESENT_MESSAGE_CHOICES)), + ) + check_human_present_count += 1 + # wait till the idle time would have passed the threshold if no action occurs + await asyncio.sleep(ALLOWED_IDLE_TIME) + + async def send_single_message( + self, + message: BaseMessage, + message_tracker: Optional[asyncio.Event] = None, + ): agent_response_event = ( self.interruptible_event_factory.create_interruptible_agent_response_event( - AgentResponseMessage(message=initial_message), + AgentResponseMessage(message=message, is_sole_text_chunk=True), is_interruptible=False, - agent_response_tracker=initial_message_tracker, + agent_response_tracker=message_tracker, ) ) self.agent_responses_worker.consume_nonblocking(agent_response_event) - await initial_message_tracker.wait() - self.transcriber.unmute() - - async def check_for_idle(self): - """Terminates the conversation after 15 seconds if no activity is detected""" - while self.is_active(): - if time.time() - self.last_action_timestamp > ( - self.agent.get_agent_config().allowed_idle_time_seconds - or ALLOWED_IDLE_TIME - ): - self.logger.debug("Conversation idle for too long, terminating") - await self.terminate() - return - await asyncio.sleep(15) - - async def track_bot_sentiment(self): - """Updates self.bot_sentiment every second based on the current transcript""" - prev_transcript = None - while self.is_active(): - await asyncio.sleep(1) - if self.transcript.to_string() != prev_transcript: - await self.update_bot_sentiment() - prev_transcript = self.transcript.to_string() - - async def update_bot_sentiment(self): - new_bot_sentiment = await self.bot_sentiment_analyser.analyse( - self.transcript.to_string() + self.agent_responses_worker.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage(message=EndOfTurn()), + is_interruptible=True, + ), ) - if new_bot_sentiment.emotion: - self.logger.debug("Bot sentiment: %s", new_bot_sentiment) - self.bot_sentiment = new_bot_sentiment def receive_message(self, message: str): transcription = Transcription( @@ -561,7 +801,7 @@ def receive_audio(self, chunk: bytes): self.transcriber.send_audio(chunk) def warmup_synthesizer(self): - self.synthesizer.ready_synthesizer() + self.synthesizer.ready_synthesizer(self._get_synthesizer_chunk_size()) def mark_last_action_timestamp(self): self.last_action_timestamp = time.time() @@ -577,12 +817,16 @@ def broadcast_interrupt(self): interruptible_event = self.interruptible_events.get_nowait() if not interruptible_event.is_interrupted(): if interruptible_event.interrupt(): - self.logger.debug("Interrupting event") + logger.debug( + f"Interrupting event {type(interruptible_event.payload)} {interruptible_event.payload}", + ) num_interrupts += 1 except queue.Empty: break self.agent.cancel_current_task() self.agent_responses_worker.cancel_current_task() + if self.actions_worker: + self.actions_worker.cancel_current_task() return num_interrupts > 0 def is_interrupt(self, transcription: Transcription): @@ -590,12 +834,43 @@ def is_interrupt(self, transcription: Transcription): self.transcriber.get_transcriber_config().min_interrupt_confidence or 0 ) + def _maybe_create_first_chunk_span(self, synthesis_result: SynthesisResult, message: str): + first_chunk_span: Optional[Span] = None + if synthesis_result.synthesis_total_span: + synthesis_result.synthesis_total_span.set_tag("message_length", len(message)) + if synthesis_result.ttft_span: + synthesis_result.ttft_span.set_tag("message_length", len(message)) + first_chunk_span = sentry_create_span( + sentry_callable=synthesis_result.ttft_span.start_child, + op=CustomSentrySpans.SYNTHESIS_GENERATE_FIRST_CHUNK, + ) + return first_chunk_span + + def _track_first_chunk(self, first_chunk_span: Span, synthesis_result: SynthesisResult): + complete_span_by_op(CustomSentrySpans.SYNTHESIS_TIME_TO_FIRST_TOKEN) + first_chunk_span.finish() + if synthesis_result.ttft_span: + synthesis_result.ttft_span.finish() + complete_span_by_op(CustomSentrySpans.LATENCY_OF_CONVERSATION) + + def _get_synthesizer_chunk_size( + self, + seconds_per_chunk: float = TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS, + ): + return int( + seconds_per_chunk + * get_chunk_size_per_second( + self.synthesizer.get_synthesizer_config().audio_encoding, + self.synthesizer.get_synthesizer_config().sampling_rate, + ), + ) + async def send_speech_to_output( self, message: str, synthesis_result: SynthesisResult, stop_event: threading.Event, - seconds_per_chunk: int, + seconds_per_chunk: float, transcript_message: Optional[Message] = None, started_event: Optional[threading.Event] = None, ): @@ -611,30 +886,50 @@ async def send_speech_to_output( Returns the message that was sent up to, and a flag if the message was cut off """ + + async def get_chunks( + output_queue: asyncio.Queue[Optional[SynthesisResult.ChunkResult]], + chunk_generator: AsyncGenerator[SynthesisResult.ChunkResult, None], + ): + try: + async for chunk_result in chunk_generator: + await output_queue.put(chunk_result) + except asyncio.CancelledError: + pass + finally: + await output_queue.put(None) # sentinel + if self.transcriber.get_transcriber_config().mute_during_speech: - self.logger.debug("Muting transcriber") + logger.debug("Muting transcriber") self.transcriber.mute() message_sent = message cut_off = False - chunk_size = seconds_per_chunk * get_chunk_size_per_second( - self.synthesizer.get_synthesizer_config().audio_encoding, - self.synthesizer.get_synthesizer_config().sampling_rate, - ) + chunk_size = self._get_synthesizer_chunk_size(seconds_per_chunk) chunk_idx = 0 - seconds_spoken = 0 - async for chunk_result in synthesis_result.chunk_generator: + seconds_spoken = 0.0 + logger.debug(f"Start sending speech {message} to output") + + first_chunk_span = self._maybe_create_first_chunk_span(synthesis_result, message) + chunk_queue: asyncio.Queue[Optional[SynthesisResult.ChunkResult]] = asyncio.Queue() + get_chunks_task = asyncio_create_task_with_done_error_log( + get_chunks(chunk_queue, synthesis_result.chunk_generator), + ) + first = True + while True: + chunk_result = await chunk_queue.get() + if chunk_result is None: + break + if first and first_chunk_span: + self._track_first_chunk(first_chunk_span, synthesis_result) + first = False start_time = time.time() - speech_length_seconds = seconds_per_chunk * ( - len(chunk_result.chunk) / chunk_size - ) + speech_length_seconds = seconds_per_chunk * (len(chunk_result.chunk) / chunk_size) seconds_spoken = chunk_idx * seconds_per_chunk if stop_event.is_set(): - self.logger.debug( - "Interrupted, stopping text to speech after {} chunks".format( - chunk_idx - ) + logger.debug( + "Interrupted, stopping text to speech after {} chunks".format(chunk_idx), ) - message_sent = f"{synthesis_result.get_message_up_to(seconds_spoken)}-" + message_sent = synthesis_result.get_message_up_to(seconds_spoken) cut_off = True break if chunk_idx == 0: @@ -648,73 +943,70 @@ async def send_speech_to_output( - (end_time - start_time) - self.per_chunk_allowance_seconds, 0, - ) - ) - self.logger.debug( - "Sent chunk {} with size {}".format(chunk_idx, len(chunk_result.chunk)) + ), ) self.mark_last_action_timestamp() chunk_idx += 1 seconds_spoken += seconds_per_chunk if transcript_message: - transcript_message.text = synthesis_result.get_message_up_to( - seconds_spoken - ) + transcript_message.text = synthesis_result.get_message_up_to(seconds_spoken) + get_chunks_task.cancel() if self.transcriber.get_transcriber_config().mute_during_speech: - self.logger.debug("Unmuting transcriber") + logger.debug("Unmuting transcriber") self.transcriber.unmute() if transcript_message: transcript_message.text = message_sent + transcript_message.is_final = not cut_off + if synthesis_result.synthesis_total_span: + synthesis_result.synthesis_total_span.finish() return message_sent, cut_off - def mark_terminated(self): + async def mark_terminated(self, bot_disconnect: bool = False): self.active = False async def terminate(self): - self.mark_terminated() + await self.mark_terminated() self.broadcast_interrupt() self.events_manager.publish_event( - TranscriptCompleteEvent(conversation_id=self.id, transcript=self.transcript) + TranscriptCompleteEvent( + conversation_id=self.id, + transcript=self.transcript, + ), ) if self.check_for_idle_task: - self.logger.debug("Terminating check_for_idle Task") + logger.debug("Terminating check_for_idle Task") self.check_for_idle_task.cancel() - if self.track_bot_sentiment_task: - self.logger.debug("Terminating track_bot_sentiment Task") - self.track_bot_sentiment_task.cancel() if self.events_manager and self.events_task: - self.logger.debug("Terminating events Task") + logger.debug("Terminating events Task") + self.events_task.cancel() await self.events_manager.flush() - self.logger.debug("Tearing down synthesizer") + logger.debug("Tearing down synthesizer") await self.synthesizer.tear_down() - self.logger.debug("Terminating agent") - if ( - isinstance(self.agent, ChatGPTAgent) - and self.agent.agent_config.vector_db_config - ): + logger.debug("Terminating agent") + if isinstance(self.agent, ChatGPTAgent) and self.agent.agent_config.vector_db_config: # Shutting down the vector db should be done in the agent's terminate method, # but it is done here because `vector_db.tear_down()` is async and # `agent.terminate()` is not async. - self.logger.debug("Terminating vector db") + logger.debug("Terminating vector db") await self.agent.vector_db.tear_down() self.agent.terminate() - self.logger.debug("Terminating output device") + logger.debug("Terminating output device") self.output_device.terminate() - self.logger.debug("Terminating speech transcriber") + logger.debug("Terminating speech transcriber") self.transcriber.terminate() - self.logger.debug("Terminating transcriptions worker") + logger.debug("Terminating transcriptions worker") self.transcriptions_worker.terminate() - self.logger.debug("Terminating final transcriptions worker") + logger.debug("Terminating final transcriptions worker") self.agent_responses_worker.terminate() - self.logger.debug("Terminating synthesis results worker") + logger.debug("Terminating synthesis results worker") self.synthesis_results_worker.terminate() if self.filler_audio_worker is not None: - self.logger.debug("Terminating filler audio worker") + logger.debug("Terminating filler audio worker") self.filler_audio_worker.terminate() if self.actions_worker is not None: - self.logger.debug("Terminating actions worker") + logger.debug("Terminating actions worker") self.actions_worker.terminate() - self.logger.debug("Successfully terminated") + logger.debug("Successfully terminated") def is_active(self): return self.active diff --git a/vocode/streaming/synthesizer/__init__.py b/vocode/streaming/synthesizer/__init__.py index 167c785743..e69de29bb2 100644 --- a/vocode/streaming/synthesizer/__init__.py +++ b/vocode/streaming/synthesizer/__init__.py @@ -1,14 +0,0 @@ -from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer -from vocode.streaming.synthesizer.bark_synthesizer import BarkSynthesizer -from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer -from vocode.streaming.synthesizer.coqui_synthesizer import CoquiSynthesizer -from vocode.streaming.synthesizer.coqui_tts_synthesizer import CoquiTTSSynthesizer -from vocode.streaming.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer -from vocode.streaming.synthesizer.google_synthesizer import GoogleSynthesizer -from vocode.streaming.synthesizer.gtts_synthesizer import GTTSSynthesizer -from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer -from vocode.streaming.synthesizer.rime_synthesizer import RimeSynthesizer -from vocode.streaming.synthesizer.polly_synthesizer import PollySynthesizer -from vocode.streaming.synthesizer.stream_elements_synthesizer import ( - StreamElementsSynthesizer, -) diff --git a/vocode/streaming/synthesizer/abstract_factory.py b/vocode/streaming/synthesizer/abstract_factory.py new file mode 100644 index 0000000000..864dabcefe --- /dev/null +++ b/vocode/streaming/synthesizer/abstract_factory.py @@ -0,0 +1,15 @@ +from abc import ABC, abstractmethod + +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer +from vocode.streaming.utils.async_requester import AsyncRequestor + + +class AbstractSynthesizerFactory(ABC): + # TODO(DOW-48): Make this not require async_requestor + @abstractmethod + def create_synthesizer( + self, + synthesizer_config: SynthesizerConfig, + ) -> BaseSynthesizer: + pass diff --git a/vocode/streaming/synthesizer/audio_cache.py b/vocode/streaming/synthesizer/audio_cache.py new file mode 100644 index 0000000000..6d767b5bb7 --- /dev/null +++ b/vocode/streaming/synthesizer/audio_cache.py @@ -0,0 +1,47 @@ +from typing import Optional + +from loguru import logger + +from vocode.streaming.utils.redis import initialize_redis_bytes +from vocode.streaming.utils.singleton import Singleton + + +class AudioCache(Singleton): + def __init__(self): + self.redis = initialize_redis_bytes() + self.disabled = False + + @staticmethod + async def safe_create(): + if AudioCache in Singleton._instances: + return Singleton._instances[AudioCache] + + audio_cache = AudioCache() + try: + await audio_cache.redis.ping() + except Exception: + logger.warning("Redis ping failed on startup, disabling audio cache") + audio_cache.disabled = True + return audio_cache + + def get_audio_key(self, voice_identifier: str, text: str) -> str: + return f"audio_cache:{voice_identifier}:{text}" + + async def get_audio(self, voice_identifier: str, text: str) -> Optional[bytes]: + audio_key = self.get_audio_key(voice_identifier, text) + if self.disabled: + return None + return await self.redis.get(audio_key) + + async def set_audio( + self, voice_identifier: str, text: str, audio: bytes, ttl: Optional[int] = None + ): + # TODO: cache eviction + if self.disabled: + logger.warning("Audio cache is disabled") + return + logger.info(f"Setting audio for {voice_identifier} {text}") + audio_key = self.get_audio_key(voice_identifier, text) + await self.redis.set(audio_key, audio) + if ttl is not None: + await self.redis.expire(audio_key, ttl) diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index ceb7dd6d50..f2aaf2122c 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -1,31 +1,25 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor -import logging import os import re -from typing import Any, List, Optional, Tuple +from concurrent.futures import ThreadPoolExecutor +from typing import List, Optional from xml.etree import ElementTree -import aiohttp -from vocode import getenv -from opentelemetry.context.context import Context -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.message import BaseMessage, SSMLMessage +import azure.cognitiveservices.speech as speechsdk +from loguru import logger +from vocode import getenv +from vocode.streaming.models.audio import AudioEncoding, SamplingRate +from vocode.streaming.models.message import BaseMessage, SSMLMessage +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - FILLER_PHRASES, FILLER_AUDIO_PATH, + FILLER_PHRASES, + BaseSynthesizer, FillerAudio, + SynthesisResult, encode_as_wav, - tracer, ) -from vocode.streaming.models.synthesizer import AzureSynthesizerConfig, SynthesizerType -from vocode.streaming.models.audio_encoding import AudioEncoding - -import azure.cognitiveservices.speech as speechsdk - NAMESPACES = { "mstts": "https://www.w3.org/2001/mstts", @@ -35,6 +29,8 @@ ElementTree.register_namespace("", NAMESPACES[""]) ElementTree.register_namespace("mstts", NAMESPACES["mstts"]) +_AZURE_INSIDE_VOICE_REGEX = r"]*>(.*?)<\/voice>" + class WordBoundaryEventPool: def __init__(self): @@ -60,12 +56,10 @@ class AzureSynthesizer(BaseSynthesizer[AzureSynthesizerConfig]): def __init__( self, synthesizer_config: AzureSynthesizerConfig, - logger: Optional[logging.Logger] = None, azure_speech_key: Optional[str] = None, azure_speech_region: Optional[str] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__(synthesizer_config) # Instantiates a client azure_speech_key = azure_speech_key or getenv("AZURE_SPEECH_KEY") azure_speech_region = azure_speech_region or getenv("AZURE_SPEECH_REGION") @@ -81,23 +75,23 @@ def __init__( subscription=azure_speech_key, region=azure_speech_region ) if self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: - if self.synthesizer_config.sampling_rate == 44100: + if self.synthesizer_config.sampling_rate == SamplingRate.RATE_44100: speech_config.set_speech_synthesis_output_format( speechsdk.SpeechSynthesisOutputFormat.Raw44100Hz16BitMonoPcm ) - if self.synthesizer_config.sampling_rate == 48000: + if self.synthesizer_config.sampling_rate == SamplingRate.RATE_48000: speech_config.set_speech_synthesis_output_format( speechsdk.SpeechSynthesisOutputFormat.Raw48Khz16BitMonoPcm ) - if self.synthesizer_config.sampling_rate == 24000: + if self.synthesizer_config.sampling_rate == SamplingRate.RATE_24000: speech_config.set_speech_synthesis_output_format( speechsdk.SpeechSynthesisOutputFormat.Raw24Khz16BitMonoPcm ) - elif self.synthesizer_config.sampling_rate == 16000: + elif self.synthesizer_config.sampling_rate == SamplingRate.RATE_16000: speech_config.set_speech_synthesis_output_format( speechsdk.SpeechSynthesisOutputFormat.Raw16Khz16BitMonoPcm ) - elif self.synthesizer_config.sampling_rate == 8000: + elif self.synthesizer_config.sampling_rate == SamplingRate.RATE_8000: speech_config.set_speech_synthesis_output_format( speechsdk.SpeechSynthesisOutputFormat.Raw8Khz16BitMonoPcm ) @@ -113,7 +107,19 @@ def __init__( self.pitch = self.synthesizer_config.pitch self.rate = self.synthesizer_config.rate self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) - self.logger = logger or logging.getLogger(__name__) + + @classmethod + def get_voice_identifier(cls, synthesizer_config: AzureSynthesizerConfig) -> str: + return ":".join( + ( + "azure", + synthesizer_config.voice_name, + str(synthesizer_config.pitch), + str(synthesizer_config.rate), + synthesizer_config.language_code, + synthesizer_config.audio_encoding, + ) + ) async def get_phrase_filler_audios(self) -> List[FillerAudio]: filler_phrase_audios = [] @@ -133,7 +139,7 @@ async def get_phrase_filler_audios(self) -> List[FillerAudio]: if os.path.exists(filler_audio_path): audio_data = open(filler_audio_path, "rb").read() else: - self.logger.debug(f"Generating filler audio for {filler_phrase.text}") + logger.debug(f"Generating filler audio for {filler_phrase.text}") ssml = self.create_ssml(filler_phrase.text) result = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesizer.speak_ssml, ssml @@ -166,9 +172,7 @@ def add_marks(self, message: str, index=0) -> str: def word_boundary_cb(self, evt, pool): pool.add(evt) - def create_ssml( - self, message: str, bot_sentiment: Optional[BotSentiment] = None - ) -> str: + def create_ssml(self, message: str) -> str: voice_language_code = self.synthesizer_config.voice_name[:5] ssml_root = ElementTree.fromstring( f'' @@ -181,38 +185,33 @@ def create_ssml( voice_root = lang else: voice_root = voice - if bot_sentiment and bot_sentiment.emotion: - styled = ElementTree.SubElement( - voice, "{%s}express-as" % NAMESPACES.get("mstts") - ) - styled.set("style", bot_sentiment.emotion) - styled.set( - "styledegree", str(bot_sentiment.degree * 2) - ) # Azure specific, it's a scale of 0-2 - voice_root = styled # this ugly hack is necessary so we can limit the gap between sentences # for normal sentences, it seems like the gap is > 500ms, so we're able to reduce it to 500ms # for very tiny sentences, the API hangs - so we heuristically only update the silence gap # if there is more than one word in the sentence if " " in message: - silence = ElementTree.SubElement( - voice_root, "{%s}silence" % NAMESPACES.get("mstts") - ) + silence = ElementTree.SubElement(voice_root, "{%s}silence" % NAMESPACES.get("mstts")) silence.set("value", "500ms") silence.set("type", "Tailing-exact") prosody = ElementTree.SubElement(voice_root, "prosody") prosody.set("pitch", f"{self.pitch}%") prosody.set("rate", f"{self.rate}%") prosody.text = message.strip() - return ElementTree.tostring(ssml_root, encoding="unicode") + ssml = ElementTree.tostring(ssml_root, encoding="unicode") + regmatch = re.search(_AZURE_INSIDE_VOICE_REGEX, ssml, re.DOTALL) + if regmatch: + self.total_chars += len(regmatch.group(1)) + return ssml def synthesize_ssml(self, ssml: str) -> speechsdk.AudioDataStream: result = self.synthesizer.start_speaking_ssml_async(ssml).get() return speechsdk.AudioDataStream(result) - def ready_synthesizer(self): - connection = speechsdk.Connection.from_speech_synthesizer(self.synthesizer) - connection.open(True) + def ready_synthesizer(self, chunk_size: int): + # TODO: remove warming up the synthesizer for now + # connection = speechsdk.Connection.from_speech_synthesizer(self.synthesizer) + # connection.open(True) + pass # given the number of seconds the message was allowed to go until, where did we get in the message? def get_message_up_to( @@ -230,15 +229,16 @@ def get_message_up_to( return ssml_fragment.split(">")[-1] return message - async def create_speech( + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: # offset = int(self.OFFSET_MS * (self.synthesizer_config.sampling_rate / 1000)) offset = 0 - self.logger.debug(f"Synthesizing message: {message}") + logger.debug(f"Synthesizing message: {message}") # Azure will return no audio for certain strings like "-", "[-", and "!" # which causes the `chunk_generator` below to hang. Return an empty @@ -258,15 +258,12 @@ async def chunk_generator( lambda: audio_data_stream.read_data(audio_buffer), ) if filled_size != chunk_size: - yield SynthesisResult.ChunkResult( - chunk_transform(audio_buffer[offset:]), True - ) + yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer[offset:]), True) return else: - yield SynthesisResult.ChunkResult( - chunk_transform(audio_buffer[offset:]), False - ) + yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer[offset:]), False) while True: + audio_buffer = bytes(chunk_size) filled_size = audio_data_stream.read_data(audio_buffer) if filled_size != chunk_size: yield SynthesisResult.ChunkResult( @@ -279,11 +276,7 @@ async def chunk_generator( self.synthesizer.synthesis_word_boundary.connect( lambda event: self.word_boundary_cb(event, word_boundary_event_pool) ) - ssml = ( - message.ssml - if isinstance(message, SSMLMessage) - else self.create_ssml(message.text, bot_sentiment=bot_sentiment) - ) + ssml = message.ssml if isinstance(message, SSMLMessage) else self.create_ssml(message.text) audio_data_stream = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesize_ssml, ssml ) diff --git a/vocode/streaming/synthesizer/bark_synthesizer.py b/vocode/streaming/synthesizer/bark_synthesizer.py index d8a79d5c67..e6f9058baf 100644 --- a/vocode/streaming/synthesizer/bark_synthesizer.py +++ b/vocode/streaming/synthesizer/bark_synthesizer.py @@ -1,36 +1,27 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor import io +from concurrent.futures import ThreadPoolExecutor + import numpy as np -import logging -from typing import Optional +from bark import SAMPLE_RATE, generate_audio, preload_models +from loguru import logger from scipy.io.wavfile import write as write_wav -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) -from vocode.streaming.models.synthesizer import BarkSynthesizerConfig, SynthesizerType -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.message import BaseMessage -from opentelemetry.context.context import Context +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import BarkSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult class BarkSynthesizer(BaseSynthesizer[BarkSynthesizerConfig]): def __init__( self, synthesizer_config: BarkSynthesizerConfig, - logger: Optional[logging.Logger] = None, ) -> None: super().__init__(synthesizer_config) - from bark import SAMPLE_RATE, generate_audio, preload_models - self.SAMPLE_RATE = SAMPLE_RATE self.generate_audio = generate_audio - self.logger = logger or logging.getLogger(__name__) - self.logger.info("Loading Bark models") + logger.info("Loading Bark models") preload_models(**self.synthesizer_config.preload_kwargs) self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) @@ -38,22 +29,16 @@ async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.BARK.value.split('_', 1)[-1]}.create_total", - ) - self.logger.debug("Bark synthesizing audio") + logger.debug("Bark synthesizing audio") audio_array = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.generate_audio, message.text, **self.synthesizer_config.generate_kwargs, ) - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.BARK.value.split('_', 1)[-1]}.convert", - ) int_audio_arr = (audio_array * np.iinfo(np.int16).max).astype(np.int16) output_bytes_io = io.BytesIO() @@ -66,5 +51,4 @@ async def create_speech( chunk_size=chunk_size, ) - convert_span.end() return result diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 0ca78464a8..e3e86661fe 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -1,33 +1,27 @@ import asyncio -import os -from typing import ( - Any, - AsyncGenerator, - Generator, - Callable, - Generic, - List, - Optional, - Tuple, - TypeVar, - Union, -) -import math +import audioop import io +import math +import os import wave +from typing import Any, AsyncGenerator, Callable, Generic, List, Optional, Tuple, TypeVar, Union + import aiohttp +from loguru import logger from nltk.tokenize import word_tokenize from nltk.tokenize.treebank import TreebankWordDetokenizer -from opentelemetry import trace -from opentelemetry.trace import Span +from sentry_sdk.tracing import Span as SentrySpan -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.agent import FillerAudioConfig -from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.audio import AudioEncoding, SamplingRate +from vocode.streaming.models.message import BaseMessage, BotBackchannel, SilenceMessage +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.synthesizer.audio_cache import AudioCache from vocode.streaming.synthesizer.miniaudio_worker import MiniaudioWorker +from vocode.streaming.telephony.constants import MULAW_SILENCE_BYTE, PCM_SILENCE_BYTE from vocode.streaming.utils import convert_wav, get_chunk_size_per_second -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.utils.async_requester import AsyncRequestor +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log FILLER_PHRASES = [ BaseMessage(text="Um..."), @@ -55,9 +49,6 @@ def encode_as_wav(chunk: bytes, synthesizer_config: SynthesizerConfig) -> bytes: return output_bytes_io.read() -tracer = trace.get_tracer(__name__) - - class SynthesisResult: class ChunkResult: def __init__(self, chunk: bytes, is_last_chunk: bool): @@ -68,9 +59,17 @@ def __init__( self, chunk_generator: AsyncGenerator[ChunkResult, None], get_message_up_to: Callable[[float], str], + cached: bool = False, + is_first: bool = False, + synthesis_total_span: Optional[SentrySpan] = None, + ttft_span: Optional[SentrySpan] = None, ): self.chunk_generator = chunk_generator self.get_message_up_to = get_message_up_to + self.cached = cached + self.is_first = is_first + self.synthesis_total_span = synthesis_total_span + self.ttft_span = ttft_span class FillerAudio: @@ -100,9 +99,7 @@ def create_synthesis_result(self) -> SynthesisResult: async def chunk_generator(chunk_transform=lambda x: x): for i in range(0, len(self.audio_data), chunk_size): if i + chunk_size > len(self.audio_data): - yield SynthesisResult.ChunkResult( - chunk_transform(self.audio_data[i:]), True - ) + yield SynthesisResult.ChunkResult(chunk_transform(self.audio_data[i:]), True) else: yield SynthesisResult.ChunkResult( chunk_transform(self.audio_data[i : i + chunk_size]), False @@ -117,6 +114,104 @@ async def chunk_generator(chunk_transform=lambda x: x): return SynthesisResult(output_generator, lambda seconds: self.message.text) +class CachedAudio: + def __init__( + self, + message: BaseMessage, + audio_data: bytes, + synthesizer_config: SynthesizerConfig, + trailing_silence_seconds: float = 0.0, + ): + self.message = message + self.audio_data = audio_data + self.synthesizer_config = synthesizer_config + self.trailing_silence_seconds = trailing_silence_seconds + + def create_synthesis_result(self, chunk_size) -> SynthesisResult: + async def chunk_generator(): + if isinstance(self.message, BotBackchannel): + yield SynthesisResult.ChunkResult( + self.audio_data, self.trailing_silence_seconds == 0.0 + ) + else: + for i in range(0, len(self.audio_data), chunk_size): + if i + chunk_size > len(self.audio_data): + yield SynthesisResult.ChunkResult( + self.audio_data[i:], self.trailing_silence_seconds == 0.0 + ) + else: + yield SynthesisResult.ChunkResult( + self.audio_data[i : i + chunk_size], False + ) + if self.trailing_silence_seconds > 0: + silence_synthesis_result = self.create_silence_synthesis_result(chunk_size) + async for chunk_result in silence_synthesis_result.chunk_generator: + yield chunk_result + + if isinstance(self.message, BotBackchannel): + + def get_message_up_to(seconds): + return self.message.text + + else: + + def get_message_up_to(seconds): + return BaseSynthesizer.get_message_cutoff_from_total_response_length( + self.synthesizer_config, self.message, seconds, len(self.audio_data) + ) + + return SynthesisResult( + chunk_generator=chunk_generator(), + get_message_up_to=get_message_up_to, + cached=True, + ) + + def create_silence_synthesis_result(self, chunk_size) -> SynthesisResult: + async def chunk_generator(): + size_of_silence = int( + self.trailing_silence_seconds * self.synthesizer_config.sampling_rate + ) + silence_byte: bytes + if self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + silence_byte = PCM_SILENCE_BYTE + size_of_silence *= 2 + elif self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + silence_byte = MULAW_SILENCE_BYTE + + for _ in range( + 0, + size_of_silence, + chunk_size, + ): + yield SynthesisResult.ChunkResult(silence_byte * chunk_size, False) + yield SynthesisResult.ChunkResult(silence_byte * chunk_size, True) + + def get_message_up_to(seconds): + return "" + + return SynthesisResult( + chunk_generator(), + get_message_up_to, + ) + + +class SilenceAudio(CachedAudio): + def __init__( + self, + message: SilenceMessage, + synthesizer_config: SynthesizerConfig, + ): + super().__init__( + message, + b"", + synthesizer_config, + trailing_silence_seconds=message.trailing_silence_seconds, + ) + + def create_synthesis_result(self, chunk_size) -> SynthesisResult: + return self.create_silence_synthesis_result(chunk_size) + + SynthesizerConfigType = TypeVar("SynthesizerConfigType", bound=SynthesizerConfig) @@ -124,21 +219,20 @@ class BaseSynthesizer(Generic[SynthesizerConfigType]): def __init__( self, synthesizer_config: SynthesizerConfigType, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): self.synthesizer_config = synthesizer_config if synthesizer_config.audio_encoding == AudioEncoding.MULAW: assert ( - synthesizer_config.sampling_rate == 8000 + synthesizer_config.sampling_rate == SamplingRate.RATE_8000 ), "MuLaw encoding only supports 8kHz sampling rate" self.filler_audios: List[FillerAudio] = [] - if aiohttp_session: - # the caller is responsible for closing the session - self.aiohttp_session = aiohttp_session - self.should_close_session_on_tear_down = False - else: - self.aiohttp_session = aiohttp.ClientSession() - self.should_close_session_on_tear_down = True + self.async_requestor = AsyncRequestor() + self.total_chars: int = 0 + self.cost_per_char: Optional[float] = None + + @classmethod + def get_voice_identifier(cls, synthesizer_config: SynthesizerConfigType) -> str: + raise NotImplementedError async def empty_generator(self): yield SynthesisResult.ChunkResult(b"", True) @@ -159,6 +253,9 @@ def get_typing_noise_filler_audio(self) -> FillerAudio: seconds_per_chunk=2, ) + def get_cost(self) -> float: + raise NotImplementedError + async def set_filler_audios(self, filler_audio_config: FillerAudioConfig): if filler_audio_config.use_phrases: self.filler_audios = await self.get_phrase_filler_audios() @@ -168,7 +265,7 @@ async def set_filler_audios(self, filler_audio_config: FillerAudioConfig): async def get_phrase_filler_audios(self) -> List[FillerAudio]: return [] - def ready_synthesizer(self): + def ready_synthesizer(self, chunk_size: int): pass # given the number of seconds the message was allowed to go until, where did we get in the message? @@ -195,16 +292,69 @@ def get_message_cutoff_from_voice_speed( tokens = word_tokenize(message.text) return TreebankWordDetokenizer().detokenize(tokens[:estimated_words_spoken]) - # returns a chunk generator and a thunk that can tell you what part of the message was read given the number of seconds spoken - # chunk generator must return a ChunkResult, essentially a tuple (bytes of size chunk_size, flag if it is the last chunk) - async def create_speech( + async def get_cached_audio( + self, + message: BaseMessage, + ) -> Optional[CachedAudio]: + audio_cache = await AudioCache.safe_create() + cache_phrase = message.cache_phrase or message.text.strip() + audio_data = await audio_cache.get_audio( + self.get_voice_identifier(self.synthesizer_config), cache_phrase + ) + if audio_data is None: + return None + logger.info(f"Got cached audio for {cache_phrase}") + + trailing_silence_seconds = 0.0 + if isinstance(message, BotBackchannel): + trailing_silence_seconds = message.trailing_silence_seconds + return CachedAudio(message, audio_data, self.synthesizer_config, trailing_silence_seconds) + + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: raise NotImplementedError + async def create_speech( + self, + message: BaseMessage, + chunk_size: int, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, + ) -> SynthesisResult: + if isinstance(message, SilenceMessage): + return SilenceAudio( + message, + self.synthesizer_config, + ).create_synthesis_result(chunk_size) + + maybe_cached_audio = await self.get_cached_audio(message) + if maybe_cached_audio is not None: + return maybe_cached_audio.create_synthesis_result(chunk_size) + return await self.create_speech_uncached( + message, + chunk_size, + is_first_text_chunk=is_first_text_chunk, + is_sole_text_chunk=is_sole_text_chunk, + ) + + async def chunk_result_generator_from_queue(self, chunk_queue: asyncio.Queue[Optional[bytes]]): + while True: + try: + chunk = await chunk_queue.get() + if chunk is None: + break + yield SynthesisResult.ChunkResult( + chunk=chunk, + is_last_chunk=False, + ) + except asyncio.CancelledError: + break + # @param file - a file-like object in wav format @staticmethod def create_synthesis_result_from_wav( @@ -220,16 +370,15 @@ def create_synthesis_result_from_wav( ) if synthesizer_config.should_encode_as_wav: - chunk_transform = lambda chunk: encode_as_wav(chunk, synthesizer_config) + chunk_transform = lambda chunk: encode_as_wav(chunk, synthesizer_config) # noqa: E731 + else: - chunk_transform = lambda chunk: chunk + chunk_transform = lambda chunk: chunk # noqa: E731 async def chunk_generator(output_bytes): for i in range(0, len(output_bytes), chunk_size): if i + chunk_size > len(output_bytes): - yield SynthesisResult.ChunkResult( - chunk_transform(output_bytes[i:]), True - ) + yield SynthesisResult.ChunkResult(chunk_transform(output_bytes[i:]), True) else: yield SynthesisResult.ChunkResult( chunk_transform(output_bytes[i : i + chunk_size]), False @@ -246,14 +395,9 @@ async def experimental_mp3_streaming_output_generator( self, response: aiohttp.ClientResponse, chunk_size: int, - create_speech_span: Optional[Span], ) -> AsyncGenerator[SynthesisResult.ChunkResult, None]: - miniaudio_worker_input_queue: asyncio.Queue[Union[bytes, None]] = ( - asyncio.Queue() - ) - miniaudio_worker_output_queue: asyncio.Queue[Tuple[bytes, bool]] = ( - asyncio.Queue() - ) + miniaudio_worker_input_queue: asyncio.Queue[Union[bytes, None]] = asyncio.Queue() + miniaudio_worker_output_queue: asyncio.Queue[Tuple[bytes, bool]] = asyncio.Queue() miniaudio_worker = MiniaudioWorker( self.synthesizer_config, chunk_size, @@ -270,7 +414,7 @@ async def send_chunks(): miniaudio_worker.consume_nonblocking(None) # sentinel try: - asyncio.create_task(send_chunks()) + asyncio_create_task_with_done_error_log(send_chunks(), reraise_cancelled=True) # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop while True: @@ -279,16 +423,34 @@ async def send_chunks(): if self.synthesizer_config.should_encode_as_wav: wav_chunk = encode_as_wav(wav_chunk, self.synthesizer_config) + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + wav_chunk = audioop.lin2ulaw(wav_chunk, 2) + yield SynthesisResult.ChunkResult(wav_chunk, is_last) # If this is the last chunk, break the loop - if is_last and create_speech_span is not None: - create_speech_span.end() + if is_last: break except asyncio.CancelledError: pass finally: miniaudio_worker.terminate() + def _resample_chunk( + self, + chunk: bytes, + current_sample_rate: int, + target_sample_rate: int, + ) -> bytes: + resampled_chunk, _ = audioop.ratecv( + chunk, + 2, + 1, + current_sample_rate, + target_sample_rate, + None, + ) + + return resampled_chunk + async def tear_down(self): - if self.should_close_session_on_tear_down: - await self.aiohttp_session.close() + pass diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py new file mode 100644 index 0000000000..9e1392e6ad --- /dev/null +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -0,0 +1,114 @@ +import io +import wave +import hashlib + +from vocode import getenv +from vocode.streaming.models.audio import AudioEncoding, SamplingRate +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import CartesiaSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log + + +class CartesiaSynthesizer(BaseSynthesizer[CartesiaSynthesizerConfig]): + def __init__( + self, + synthesizer_config: CartesiaSynthesizerConfig, + ): + super().__init__(synthesizer_config) + + # Lazy import the cartesia module + try: + from cartesia.tts import AsyncCartesiaTTS + except ImportError as e: + raise ImportError( + f"Missing required dependancies for CartesiaSynthesizer" + ) from e + + self.cartesia_tts = AsyncCartesiaTTS + + self.api_key = synthesizer_config.api_key or getenv("CARTESIA_API_KEY") + if not self.api_key: + raise ValueError("Missing Cartesia API key") + + + if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + self.channel_width = 2 + match synthesizer_config.sampling_rate: + case SamplingRate.RATE_44100: + self.sampling_rate = 44100 + self.output_format = "pcm_44100" + case SamplingRate.RATE_22050: + self.sampling_rate = 22050 + self.output_format = "pcm_22050" + case SamplingRate.RATE_16000: + self.sampling_rate = 16000 + self.output_format = "pcm_16000" + case _: + raise ValueError( + f"Unsupported PCM sampling rate {synthesizer_config.sampling_rate}" + ) + elif synthesizer_config.audio_encoding == AudioEncoding.MULAW: + # Cartesia has issues with MuLaw/8000. Use pcm/16000 and + # create_synthesis_result_from_wav will handle the conversion to mulaw/8000 + self.channel_width = 2 + self.output_format = "pcm_16000" + self.sampling_rate = 16000 + else: + raise ValueError( + f"Unsupported audio encoding {synthesizer_config.audio_encoding}" + ) + + self.num_channels = 1 + self.model_id = synthesizer_config.model_id + self.voice_id = synthesizer_config.voice_id + self.client = self.cartesia_tts(api_key=self.api_key) + self.voice_embedding = self.client.get_voice_embedding(voice_id=self.voice_id) + + + async def create_speech_uncached( + self, + message: BaseMessage, + chunk_size: int, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, + ) -> SynthesisResult: + generator = await self.client.generate( + transcript=message.text, + voice=self.voice_embedding, + stream=True, + model_id=self.model_id, + data_rtype='bytes', + output_format=self.output_format + ) + + audio_file = io.BytesIO() + with wave.open(audio_file, 'wb') as wav_file: + wav_file.setnchannels(self.num_channels) + wav_file.setsampwidth(self.channel_width) + wav_file.setframerate(self.sampling_rate) + async for chunk in generator: + wav_file.writeframes(chunk['audio']) + audio_file.seek(0) + + result = self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, + file=audio_file, + message=message, + chunk_size=chunk_size, + ) + + return result + + @classmethod + def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): + hashed_api_key = hashlib.sha256(f"{synthesizer_config.api_key}".encode("utf-8")).hexdigest() + return ":".join( + ( + "cartesia", + hashed_api_key, + str(synthesizer_config.voice_id), + str(synthesizer_config.model_id), + synthesizer_config.audio_encoding + ) + ) \ No newline at end of file diff --git a/vocode/streaming/synthesizer/coqui_synthesizer.py b/vocode/streaming/synthesizer/coqui_synthesizer.py index 8bd8093aa0..2feedb10d7 100644 --- a/vocode/streaming/synthesizer/coqui_synthesizer.py +++ b/vocode/streaming/synthesizer/coqui_synthesizer.py @@ -1,20 +1,15 @@ import io -from typing import Optional, Tuple, Dict +from typing import Dict, Tuple + import aiohttp -from pydub import AudioSegment from vocode import getenv -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) -from vocode.streaming.models.synthesizer import CoquiSynthesizerConfig, SynthesizerType -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import CoquiSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult +from vocode.streaming.utils.async_requester import AsyncRequestor -from opentelemetry.context.context import Context - +raise DeprecationWarning("This Synthesizer is deprecated and will be removed in the future.") COQUI_BASE_URL = "https://app.coqui.ai/api/v2" @@ -60,14 +55,12 @@ async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: url, headers, body = self.get_request(message.text) - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.COQUI.value.split('_', 1)[-1]}.create_total" - ) - async with self.aiohttp_session.request( + async with AsyncRequestor().get_session().request( "POST", url, json=body, @@ -75,15 +68,11 @@ async def create_speech( timeout=aiohttp.ClientTimeout(total=15), ) as response: sample = await response.json() - async with self.aiohttp_session.request( + async with AsyncRequestor().get_session().request( "GET", sample["audio_url"], ) as response: read_response = await response.read() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.COQUI.value.split('_', 1)[-1]}.convert", - ) result = self.create_synthesis_result_from_wav( synthesizer_config=self.synthesizer_config, @@ -91,5 +80,4 @@ async def create_speech( message=message, chunk_size=chunk_size, ) - convert_span.end() return result diff --git a/vocode/streaming/synthesizer/coqui_tts_synthesizer.py b/vocode/streaming/synthesizer/coqui_tts_synthesizer.py index 45bacb8956..ad7d6b7de6 100644 --- a/vocode/streaming/synthesizer/coqui_tts_synthesizer.py +++ b/vocode/streaming/synthesizer/coqui_tts_synthesizer.py @@ -1,39 +1,22 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor -import logging -from typing import Optional -import aiohttp -from pydub import AudioSegment -import numpy as np import io -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.message import BaseMessage - -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) +from concurrent.futures import ThreadPoolExecutor -from vocode.streaming.models.synthesizer import ( - CoquiTTSSynthesizerConfig, - SynthesizerType, -) +import numpy as np +from pydub import AudioSegment +from TTS.api import TTS -from opentelemetry.context.context import Context +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import CoquiTTSSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult class CoquiTTSSynthesizer(BaseSynthesizer[CoquiTTSSynthesizerConfig]): def __init__( self, synthesizer_config: CoquiTTSSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) - - from TTS.api import TTS + super().__init__(synthesizer_config) self.tts = TTS(**synthesizer_config.tts_kwargs) self.speaker = synthesizer_config.speaker @@ -44,11 +27,9 @@ async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.COQUI_TTS.value.split('_', 1)[-1]}.create_total", - ) tts = self.tts audio_data = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, @@ -57,10 +38,6 @@ async def create_speech( self.speaker, self.language, ) - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.COQUI_TTS.value.split('_', 1)[-1]}.convert", - ) audio_data = np.array(audio_data) # Convert the NumPy array to bytes @@ -83,5 +60,4 @@ async def create_speech( chunk_size=chunk_size, ) - convert_span.end() return result diff --git a/vocode/streaming/synthesizer/default_factory.py b/vocode/streaming/synthesizer/default_factory.py new file mode 100644 index 0000000000..16574d4e5a --- /dev/null +++ b/vocode/streaming/synthesizer/default_factory.py @@ -0,0 +1,47 @@ +from typing import Type +from vocode.streaming.models.synthesizer import ( + AzureSynthesizerConfig, + CartesiaSynthesizerConfig, + ElevenLabsSynthesizerConfig, + PlayHtSynthesizerConfig, + RimeSynthesizerConfig, + StreamElementsSynthesizerConfig, + SynthesizerConfig, +) +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer +from vocode.streaming.synthesizer.cartesia_synthesizer import CartesiaSynthesizer +from vocode.streaming.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer +from vocode.streaming.synthesizer.eleven_labs_websocket_synthesizer import ElevenLabsWSSynthesizer +from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer +from vocode.streaming.synthesizer.play_ht_synthesizer_v2 import PlayHtSynthesizerV2 +from vocode.streaming.synthesizer.rime_synthesizer import RimeSynthesizer +from vocode.streaming.synthesizer.stream_elements_synthesizer import StreamElementsSynthesizer + + +class DefaultSynthesizerFactory(AbstractSynthesizerFactory): + def create_synthesizer( + self, + synthesizer_config: SynthesizerConfig, + ): + if isinstance(synthesizer_config, AzureSynthesizerConfig): + return AzureSynthesizer(synthesizer_config) + elif isinstance(synthesizer_config, CartesiaSynthesizerConfig): + return CartesiaSynthesizer(synthesizer_config) + elif isinstance(synthesizer_config, ElevenLabsSynthesizerConfig): + eleven_labs_synthesizer_class_type: Type[BaseSynthesizer] = ElevenLabsSynthesizer + if synthesizer_config.experimental_websocket: + eleven_labs_synthesizer_class_type = ElevenLabsWSSynthesizer + return eleven_labs_synthesizer_class_type(synthesizer_config) + elif isinstance(synthesizer_config, PlayHtSynthesizerConfig): + if synthesizer_config.version == "2": + return PlayHtSynthesizerV2(synthesizer_config) + else: + return PlayHtSynthesizer(synthesizer_config) + elif isinstance(synthesizer_config, RimeSynthesizerConfig): + return RimeSynthesizer(synthesizer_config) + elif isinstance(synthesizer_config, StreamElementsSynthesizerConfig): + return StreamElementsSynthesizer(synthesizer_config) + else: + raise Exception("Invalid synthesizer config") diff --git a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py index 051d0900bd..714b5bf720 100644 --- a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py @@ -1,72 +1,93 @@ import asyncio -import logging -import time -from typing import Any, AsyncGenerator, Optional, Tuple, Union -import wave -import aiohttp -from opentelemetry.trace import Span +import hashlib +from typing import Optional -from vocode import getenv -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - encode_as_wav, - tracer, -) -from vocode.streaming.models.synthesizer import ( - ElevenLabsSynthesizerConfig, - SynthesizerType, -) -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.utils.mp3_helper import decode_mp3 -from vocode.streaming.synthesizer.miniaudio_worker import MiniaudioWorker +from elevenlabs import Voice, VoiceSettings +from elevenlabs.client import AsyncElevenLabs +from loguru import logger +from vocode.streaming.models.audio import AudioEncoding, SamplingRate +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log -ADAM_VOICE_ID = "pNInz6obpgDQGcFmaJgB" ELEVEN_LABS_BASE_URL = "https://api.elevenlabs.io/v1/" +STREAMED_CHUNK_SIZE = 16000 * 2 // 4 # 1/8 of a second of 16kHz audio with 16-bit samples class ElevenLabsSynthesizer(BaseSynthesizer[ElevenLabsSynthesizerConfig]): def __init__( self, synthesizer_config: ElevenLabsSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__(synthesizer_config) - import elevenlabs + assert synthesizer_config.api_key is not None, "API key must be set" + assert synthesizer_config.voice_id is not None, "Voice ID must be set" + self.api_key = synthesizer_config.api_key - self.elevenlabs = elevenlabs + self.elevenlabs_client = AsyncElevenLabs( + api_key=self.api_key, + ) - self.api_key = synthesizer_config.api_key or getenv("ELEVEN_LABS_API_KEY") - self.voice_id = synthesizer_config.voice_id or ADAM_VOICE_ID + self.voice_id = synthesizer_config.voice_id self.stability = synthesizer_config.stability self.similarity_boost = synthesizer_config.similarity_boost self.model_id = synthesizer_config.model_id self.optimize_streaming_latency = synthesizer_config.optimize_streaming_latency self.words_per_minute = 150 - self.experimental_streaming = synthesizer_config.experimental_streaming + self.upsample = None + self.sample_rate = self.synthesizer_config.sampling_rate + + if self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + match self.synthesizer_config.sampling_rate: + case SamplingRate.RATE_16000: + self.output_format = "pcm_16000" + case SamplingRate.RATE_22050: + self.output_format = "pcm_22050" + case SamplingRate.RATE_24000: + self.output_format = "pcm_24000" + case SamplingRate.RATE_44100: + self.output_format = "pcm_44100" + case SamplingRate.RATE_48000: + self.output_format = "pcm_44100" + self.upsample = SamplingRate.RATE_48000.value + self.sample_rate = SamplingRate.RATE_44100.value + case _: + raise ValueError( + f"Unsupported sampling rate: {self.synthesizer_config.sampling_rate}. Elevenlabs only supports 16000, 22050, 24000, and 44100 Hz." + ) + elif self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + self.output_format = "ulaw_8000" + else: + raise ValueError( + f"Unsupported audio encoding: {self.synthesizer_config.audio_encoding}" + ) - async def create_speech( + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: - voice = self.elevenlabs.Voice(voice_id=self.voice_id) + self.total_chars += len(message.text) if self.stability is not None and self.similarity_boost is not None: - voice.settings = self.elevenlabs.VoiceSettings( - stability=self.stability, similarity_boost=self.similarity_boost + voice = Voice( + voice_id=self.voice_id, + settings=VoiceSettings( + stability=self.stability, similarity_boost=self.similarity_boost + ), ) - url = ELEVEN_LABS_BASE_URL + f"text-to-speech/{self.voice_id}" - - if self.experimental_streaming: - url += "/stream" - + else: + voice = Voice(voice_id=self.voice_id) + url = ( + ELEVEN_LABS_BASE_URL + + f"text-to-speech/{self.voice_id}/stream?output_format={self.output_format}" + ) if self.optimize_streaming_latency: - url += f"?optimize_streaming_latency={self.optimize_streaming_latency}" + url += f"&optimize_streaming_latency={self.optimize_streaming_latency}" headers = {"xi-api-key": self.api_key} body = { "text": message.text, @@ -75,44 +96,65 @@ async def create_speech( if self.model_id: body["model_id"] = self.model_id - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.ELEVEN_LABS.value.split('_', 1)[-1]}.create_total", + chunk_queue: asyncio.Queue[Optional[bytes]] = asyncio.Queue() + asyncio_create_task_with_done_error_log( + self.get_chunks(url, headers, body, chunk_size, chunk_queue), ) - session = self.aiohttp_session - - response = await session.request( - "POST", - url, - json=body, - headers=headers, - timeout=aiohttp.ClientTimeout(total=15), + return SynthesisResult( + self.chunk_result_generator_from_queue(chunk_queue), + lambda seconds: self.get_message_cutoff_from_voice_speed(message, seconds, 150), ) - if not response.ok: - raise Exception(f"ElevenLabs API returned {response.status} status code") - if self.experimental_streaming: - return SynthesisResult( - self.experimental_mp3_streaming_output_generator( - response, chunk_size, create_speech_span - ), # should be wav - lambda seconds: self.get_message_cutoff_from_voice_speed( - message, seconds, self.words_per_minute - ), - ) - else: - audio_data = await response.read() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.ELEVEN_LABS.value.split('_', 1)[-1]}.convert", + + @classmethod + def get_voice_identifier(cls, synthesizer_config: ElevenLabsSynthesizerConfig): + hashed_api_key = hashlib.sha256(f"{synthesizer_config.api_key}".encode("utf-8")).hexdigest() + return ":".join( + ( + "eleven_labs", + hashed_api_key, + str(synthesizer_config.voice_id), + str(synthesizer_config.model_id), + str(synthesizer_config.stability), + str(synthesizer_config.similarity_boost), + str(synthesizer_config.optimize_streaming_latency), + synthesizer_config.audio_encoding, ) - output_bytes_io = decode_mp3(audio_data) + ) - result = self.create_synthesis_result_from_wav( - synthesizer_config=self.synthesizer_config, - file=output_bytes_io, - message=message, - chunk_size=chunk_size, + async def get_chunks( + self, + url: str, + headers: dict, + body: dict, + chunk_size: int, + chunk_queue: asyncio.Queue[Optional[bytes]], + ): + try: + async_client = self.async_requestor.get_client() + stream = await async_client.send( + async_client.build_request( + "POST", + url, + headers=headers, + json=body, + ), + stream=True, ) - convert_span.end() - return result + if not stream.is_success: + error = await stream.aread() + logger.error(f"ElevenLabs API failed: {stream.status_code} {error.decode('utf-8')}") + raise Exception(f"ElevenLabs API returned {stream.status_code} status code") + async for chunk in stream.aiter_bytes(chunk_size): + if self.upsample: + chunk = self._resample_chunk( + chunk, + self.sample_rate, + self.upsample, + ) + chunk_queue.put_nowait(chunk) + except asyncio.CancelledError: + pass + finally: + chunk_queue.put_nowait(None) # treated as sentinel diff --git a/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py new file mode 100644 index 0000000000..c4644ad6c4 --- /dev/null +++ b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py @@ -0,0 +1,356 @@ +import asyncio +import audioop +import base64 +from typing import AsyncGenerator, List, Optional, Tuple + +import numpy as np +import websockets +from loguru import logger +from pydantic import BaseModel, conint + +from vocode.streaming.models.audio import AudioEncoding, SamplingRate +from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken +from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult +from vocode.streaming.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer +from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer + +NONCE = "071b5f21-3b24-4427-817e-62508007ae60" +ELEVEN_LABS_BASE_URL = "wss://api.elevenlabs.io/v1/" + + +# Based on https://github.com/elevenlabs/elevenlabs-python/blob/main/src/elevenlabs/tts.py +async def string_chunker(string: str) -> AsyncGenerator[str, None]: + splitters = (".", ",", "?", "!", ";", ":", "—", "-", "(", ")", "[", "]", "}", " ") + buffer = "" + for text in string: + if buffer.endswith(splitters): + yield buffer if buffer.endswith(" ") else buffer + " " + buffer = text + elif text.startswith(splitters): + output = buffer + text[0] + yield output if output.endswith(" ") else output + " " + buffer = text[1:] + else: + buffer += text + if buffer != "": + yield buffer + " " + + +class ElevenLabsWebsocketVoiceSettings(BaseModel): + stability: float + similarity_boost: float + + +class ElevenLabsWebsocketGenerationConfig(BaseModel): + chunk_length_schedule: list[conint(ge=50, le=500)] # type: ignore + # TODO: Replace above with below for pydantic 2.X + # chunk_length_schedule: list[Annotated[int, Field(strict=True, ge=50, le=500)]] + + +class ElevenLabsWebsocketMessage(BaseModel): + text: str + try_trigger_generation: bool = True + flush: bool = False + + +class ElevenLabsWebsocketFirstMessage(ElevenLabsWebsocketMessage, BaseModel): + voice_settings: ElevenLabsWebsocketVoiceSettings | None = None + generation_config: ElevenLabsWebsocketGenerationConfig | None = None + xi_api_key: str + + +class ElevenLabsWebsocketResponseAlignment(BaseModel): + chars: list[str] + charStartTimesMs: list[int] + charDurationsMs: list[int] + + +class ElevenLabsWebsocketResponse(BaseModel): + audio: Optional[str] = None + isFinal: Optional[bool] = None + normalizedAlignment: Optional[ElevenLabsWebsocketResponseAlignment] = None + alignment: Optional[ElevenLabsWebsocketResponseAlignment] = None + + def __str__(self): + return f"ElevenLabsWebsocketResponse(has_audio={self.audio is not None}, isFinal={self.isFinal}, alignment={self.alignment})" + + +class ElevenLabsWSSynthesizer( + BaseSynthesizer[ElevenLabsSynthesizerConfig], InputStreamingSynthesizer +): + def __init__( + self, + synthesizer_config: ElevenLabsSynthesizerConfig, + ): + super().__init__( + synthesizer_config, + ) + + assert synthesizer_config.api_key is not None, "API key must be set" + assert synthesizer_config.voice_id is not None, "Voice ID must be set" + self.api_key = synthesizer_config.api_key + self.voice_id = synthesizer_config.voice_id + self.stability = synthesizer_config.stability + self.similarity_boost = synthesizer_config.similarity_boost + self.model_id = synthesizer_config.model_id + self.optimize_streaming_latency = synthesizer_config.optimize_streaming_latency + self.words_per_minute = 150 + + self.text_chunk_queue: asyncio.Queue[Optional[BotBackchannel | LLMToken]] = asyncio.Queue() + self.voice_packet_queue: asyncio.Queue[Optional[bytes]] = asyncio.Queue() + self.current_turn_utterances_by_chunk: List[Tuple[str, float]] = [] + self.sample_width = 2 if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16 else 1 + + self.websocket_listener: asyncio.Task | None = None + self.websocket_tasks: dict[str, asyncio.Task | None] = { + "listener": None, + "writer": None, + } + self.end_of_turn = False + + self.upsample = None + self.sample_rate = self.synthesizer_config.sampling_rate + + # While this looks useless, we need to assign the response of `asyncio.gather` + # to *something* or we risk garbage collection of the running coroutines spawned + # by `asyncio.gather`. + self.websocket_functions: list[None] | None = None + + if self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + match self.synthesizer_config.sampling_rate: + case SamplingRate.RATE_16000: + self.output_format = "pcm_16000" + case SamplingRate.RATE_22050: + self.output_format = "pcm_22050" + case SamplingRate.RATE_24000: + self.output_format = "pcm_24000" + case SamplingRate.RATE_44100: + self.output_format = "pcm_44100" + case SamplingRate.RATE_48000: + self.output_format = "pcm_44100" + self.upsample = SamplingRate.RATE_48000.value + self.sample_rate = SamplingRate.RATE_44100.value + case _: + raise ValueError( + f"Unsupported sampling rate: {self.synthesizer_config.sampling_rate}. Elevenlabs only supports 16000, 22050, 24000, and 44100 Hz." + ) + elif self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + self.output_format = "ulaw_8000" + else: + raise ValueError( + f"Unsupported audio encoding: {self.synthesizer_config.audio_encoding}" + ) + + def get_eleven_labs_websocket_voice_settings(self): + if self.stability is None or self.similarity_boost is None: + return None + return ElevenLabsWebsocketVoiceSettings( + stability=self.stability, + similarity_boost=self.similarity_boost, + ) + + def reduce_chunk_amplitude(self, chunk: bytes, factor: float) -> bytes: + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + chunk = audioop.ulaw2lin(chunk, 2) + pcm = np.frombuffer(chunk, dtype=np.int16) + pcm = (pcm * factor).astype(np.int16) + pcm_bytes = pcm.tobytes() + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + return audioop.lin2ulaw(pcm_bytes, 2) + else: + return pcm_bytes + + async def establish_websocket_listeners(self, chunk_size): + url = ( + ELEVEN_LABS_BASE_URL + + f"text-to-speech/{self.voice_id}/stream-input?output_format={self.output_format}" + ) + if self.optimize_streaming_latency: + url += f"&optimize_streaming_latency={self.optimize_streaming_latency}" + if self.model_id: + url += f"&model_id={self.model_id}" + headers = {"xi-api-key": self.api_key} + + backchannelled = False + + async with websockets.connect( + url, + extra_headers=headers, + ) as ws: + + async def write() -> None: + nonlocal backchannelled + try: + first_message = True + while True: + message = await self.text_chunk_queue.get() + if not message: + break + if first_message and isinstance(message, BotBackchannel): + backchannelled = True + eleven_labs_ws_message = ( + ElevenLabsWebsocketMessage( + text=message.text, + flush=not isinstance(message, LLMToken), + ).json() + if not first_message + else ElevenLabsWebsocketFirstMessage( + text=message.text, + voice_settings=self.get_eleven_labs_websocket_voice_settings(), + generation_config=ElevenLabsWebsocketGenerationConfig( + chunk_length_schedule=[50], + ), + flush=not isinstance(message, LLMToken), + xi_api_key=self.api_key, + ).json(exclude_none=True) + ) + await ws.send(eleven_labs_ws_message) + first_message = False + finally: + await ws.send(ElevenLabsWebsocketMessage(text="").json()) + + async def listen() -> None: + """Listen to the websocket for audio data and stream it.""" + + first_message = True + buffer = bytearray() + while True: + message = await ws.recv() + if "audio" not in message: + continue + response = ElevenLabsWebsocketResponse.model_validate_json(message) + if response.audio: + decoded = base64.b64decode(response.audio) + seconds = len(decoded) / ( + self.sample_width * self.synthesizer_config.sampling_rate + ) + + if self.upsample: + decoded = self._resample_chunk( + decoded, + self.sample_rate, + self.upsample, + ) + seconds = len(decoded) / (self.sample_width * self.sample_rate) + + if response.alignment: + utterance_chunk = "".join(response.alignment.chars) + " " + self.current_turn_utterances_by_chunk.append((utterance_chunk, seconds)) + # For backchannels, send them all as one chunk (so it can't be interrupted) and reduce the volume + # so that in the case of a false endpoint, the backchannel is not too loud. + if first_message and backchannelled: + buffer.extend(decoded) + logger.info("First message was a backchannel, reducing volume.") + reduced_amplitude_buffer = self.reduce_chunk_amplitude( + buffer, factor=self.synthesizer_config.backchannel_amplitude_factor + ) + await self.voice_packet_queue.put(reduced_amplitude_buffer) + buffer = bytearray() + first_message = False + else: + buffer.extend(decoded) + for chunk_idx in range(0, len(buffer) - chunk_size, chunk_size): + await self.voice_packet_queue.put( + buffer[chunk_idx : chunk_idx + chunk_size] + ) + buffer = buffer[len(buffer) - (len(buffer) % chunk_size) :] + + if response.isFinal: + await self.voice_packet_queue.put(None) + break + + self.websocket_tasks["listener"] = asyncio.create_task(listen()) + self.websocket_tasks["writer"] = asyncio.create_task(write()) + self.websocket_functions = await asyncio.gather(*self.websocket_tasks.values()) + + def get_current_utterance_synthesis_result(self): + return SynthesisResult( + self.chunk_result_generator_from_queue(self.voice_packet_queue), + lambda seconds: self.get_current_message_so_far(seconds), + ) + + async def create_speech_uncached( + self, + message: BaseMessage, + chunk_size: int, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, + ): + """ + Ran when doing utterance parsing. + ie: "Hello, my name is foo." + """ + if not self.websocket_listener: + self.websocket_listener = asyncio.create_task( + self.establish_websocket_listeners(chunk_size) + ) + + if isinstance(message, BotBackchannel): + if not message.text.endswith(" "): + message.text += " " + await self.text_chunk_queue.put(message) + self.total_chars += len(message.text) + else: + async for text in string_chunker(message.text): + await self.text_chunk_queue.put(LLMToken(text=text)) + self.total_chars += len(text) + + return self.get_current_utterance_synthesis_result() + + async def send_token_to_synthesizer(self, message: LLMToken, chunk_size: int): + """ + Ran when parsing a single chunk of text. + + ie: "Hello," + """ + self.total_chars += len(message.text) + + if not self.websocket_listener: + self.websocket_listener = asyncio.create_task( + self.establish_websocket_listeners(chunk_size) + ) + + await self.text_chunk_queue.put(message) + return None + + def _cleanup_websocket_tasks(self): + for task in self.websocket_tasks.values(): + if task is not None: + task.cancel() + self.text_chunk_queue = asyncio.Queue() + self.voice_packet_queue = asyncio.Queue() + if self.websocket_listener is not None: + self.websocket_listener.cancel() + + def ready_synthesizer(self, chunk_size: int): + self._cleanup_websocket_tasks() + self.websocket_listener = asyncio.create_task( + self.establish_websocket_listeners(chunk_size) + ) + + def get_current_message_so_far(self, seconds: float) -> str: + seconds_idx = 0.0 + buffer = "" + for utterance, duration in self.current_turn_utterances_by_chunk: + if seconds_idx > seconds: + return buffer + buffer += utterance + seconds_idx += duration + return buffer + + @classmethod + def get_voice_identifier(cls, synthesizer_config: ElevenLabsSynthesizerConfig): + return ElevenLabsSynthesizer.get_voice_identifier(synthesizer_config) + + async def handle_end_of_turn(self): + self.end_of_turn = True + await self.text_chunk_queue.put(None) + self.current_turn_utterances_by_chunk = [] + + async def cancel_websocket_tasks(self): + self._cleanup_websocket_tasks() + + async def tear_down(self): + await self.cancel_websocket_tasks() + await super().tear_down() diff --git a/vocode/streaming/synthesizer/factory.py b/vocode/streaming/synthesizer/factory.py deleted file mode 100644 index 24a4f3f9d5..0000000000 --- a/vocode/streaming/synthesizer/factory.py +++ /dev/null @@ -1,76 +0,0 @@ -import logging -from typing import Optional -import typing -import aiohttp - -from vocode.streaming.models.synthesizer import ( - AzureSynthesizerConfig, - CoquiTTSSynthesizerConfig, - ElevenLabsSynthesizerConfig, - GTTSSynthesizerConfig, - GoogleSynthesizerConfig, - PlayHtSynthesizerConfig, - RimeSynthesizerConfig, - PollySynthesizerConfig, - StreamElementsSynthesizerConfig, - SynthesizerConfig, - SynthesizerType, -) -from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer -from vocode.streaming.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer -from vocode.streaming.synthesizer.google_synthesizer import GoogleSynthesizer -from vocode.streaming.synthesizer.gtts_synthesizer import GTTSSynthesizer -from vocode.streaming.synthesizer.play_ht_synthesizer import PlayHtSynthesizer -from vocode.streaming.synthesizer.rime_synthesizer import RimeSynthesizer -from vocode.streaming.synthesizer.polly_synthesizer import PollySynthesizer -from vocode.streaming.synthesizer.stream_elements_synthesizer import ( - StreamElementsSynthesizer, -) -from vocode.streaming.synthesizer.coqui_tts_synthesizer import CoquiTTSSynthesizer - - -class SynthesizerFactory: - def create_synthesizer( - self, - synthesizer_config: SynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, - ): - if isinstance(synthesizer_config, GoogleSynthesizerConfig): - return GoogleSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, AzureSynthesizerConfig): - return AzureSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, ElevenLabsSynthesizerConfig): - return ElevenLabsSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, PlayHtSynthesizerConfig): - return PlayHtSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, RimeSynthesizerConfig): - return RimeSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, GTTSSynthesizerConfig): - return GTTSSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, StreamElementsSynthesizerConfig): - return StreamElementsSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, CoquiTTSSynthesizerConfig): - return CoquiTTSSynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - elif isinstance(synthesizer_config, PollySynthesizerConfig): - return PollySynthesizer( - synthesizer_config, logger=logger, aiohttp_session=aiohttp_session - ) - else: - raise Exception("Invalid synthesizer config") diff --git a/vocode/streaming/synthesizer/google_synthesizer.py b/vocode/streaming/synthesizer/google_synthesizer.py index d834eef27f..225ab2d5d2 100644 --- a/vocode/streaming/synthesizer/google_synthesizer.py +++ b/vocode/streaming/synthesizer/google_synthesizer.py @@ -1,45 +1,26 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor import io -import logging -import os import wave -from typing import Any, Optional -import aiohttp +from concurrent.futures import ThreadPoolExecutor +from typing import Any -from vocode import getenv +import google.auth +from google.cloud import texttospeech as tts # type: ignore -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.message import BaseMessage -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - encode_as_wav, - tracer, -) -from vocode.streaming.models.synthesizer import GoogleSynthesizerConfig, SynthesizerType -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.utils import convert_wav - -from opentelemetry.context.context import Context +from vocode.streaming.models.synthesizer import GoogleSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult class GoogleSynthesizer(BaseSynthesizer[GoogleSynthesizerConfig]): def __init__( self, synthesizer_config: GoogleSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) - - from google.cloud import texttospeech as tts - import google.auth + super().__init__(synthesizer_config) google.auth.default() - self.tts = tts - # Instantiates a client self.client = tts.TextToSpeechClient() @@ -61,18 +42,16 @@ def __init__( self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) def synthesize(self, message: str) -> Any: - synthesis_input = self.tts.SynthesisInput(text=message) + synthesis_input = tts.SynthesisInput(text=message) # Perform the text-to-speech request on the text input with the selected # voice parameters and audio file type return self.client.synthesize_speech( - request=self.tts.SynthesizeSpeechRequest( + request=tts.SynthesizeSpeechRequest( input=synthesis_input, voice=self.voice, audio_config=self.audio_config, - enable_time_pointing=[ - self.tts.SynthesizeSpeechRequest.TimepointType.SSML_MARK - ], + enable_time_pointing=[tts.SynthesizeSpeechRequest.TimepointType.SSML_MARK], ) ) @@ -81,20 +60,14 @@ async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.GOOGLE.value.split('_', 1)[-1]}.create_total", - ) - response: self.tts.SynthesizeSpeechResponse = ( # type: ignore + response: tts.SynthesizeSpeechResponse = ( # type: ignore await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesize, message.text ) ) - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.GOOGLE.value.split('_', 1)[-1]}.convert", - ) output_sample_rate = response.audio_config.sample_rate_hertz output_bytes_io = io.BytesIO() @@ -111,5 +84,4 @@ async def create_speech( message=message, chunk_size=chunk_size, ) - convert_span.end() return result diff --git a/vocode/streaming/synthesizer/gtts_synthesizer.py b/vocode/streaming/synthesizer/gtts_synthesizer.py index 5c49fb905e..8ad8a31d50 100644 --- a/vocode/streaming/synthesizer/gtts_synthesizer.py +++ b/vocode/streaming/synthesizer/gtts_synthesizer.py @@ -1,58 +1,38 @@ import asyncio from concurrent.futures import ThreadPoolExecutor -import logging -import aiohttp -from pydub import AudioSegment -from typing import Optional from io import BytesIO -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.synthesizer import GTTSSynthesizerConfig, SynthesizerType -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) -from opentelemetry.context.context import Context +from gtts import gTTS +from pydub import AudioSegment + +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import GTTSSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult class GTTSSynthesizer(BaseSynthesizer): def __init__( self, synthesizer_config: GTTSSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__(synthesizer_config) - from gtts import gTTS - - self.gTTS = gTTS self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: audio_file = BytesIO() def thread(): - tts = self.gTTS(message.text) + tts = gTTS(message.text) tts.write_to_fp(audio_file) - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.GTTS.value.split('_', 1)[-1]}.create_total" - ) - await asyncio.get_event_loop().run_in_executor( - self.thread_pool_executor, thread - ) - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.GTTS.value.split('_', 1)[-1]}.convert", - ) + await asyncio.get_event_loop().run_in_executor(self.thread_pool_executor, thread) audio_file.seek(0) # TODO: probably needs to be in a thread audio_segment: AudioSegment = AudioSegment.from_mp3(audio_file) # type: ignore @@ -65,5 +45,4 @@ def thread(): message=message, chunk_size=chunk_size, ) - convert_span.end() return result diff --git a/vocode/streaming/synthesizer/input_streaming_synthesizer.py b/vocode/streaming/synthesizer/input_streaming_synthesizer.py new file mode 100644 index 0000000000..cb3d8d425f --- /dev/null +++ b/vocode/streaming/synthesizer/input_streaming_synthesizer.py @@ -0,0 +1,16 @@ +from vocode.streaming.models.message import LLMToken + + +class InputStreamingSynthesizer: + async def handle_end_of_turn(self): + pass + + def get_current_utterance_synthesis_result(self): + raise NotImplementedError + + async def send_token_to_synthesizer( + self, + message: LLMToken, + chunk_size: int, + ): + raise NotImplementedError diff --git a/vocode/streaming/synthesizer/miniaudio_worker.py b/vocode/streaming/synthesizer/miniaudio_worker.py index e6a05a6bd9..92d33adc33 100644 --- a/vocode/streaming/synthesizer/miniaudio_worker.py +++ b/vocode/streaming/synthesizer/miniaudio_worker.py @@ -1,14 +1,16 @@ from __future__ import annotations -import queue -from typing import Optional, Tuple, Union import asyncio +import queue +from typing import Tuple, Union + import miniaudio +from loguru import logger from vocode.streaming.models.synthesizer import SynthesizerConfig from vocode.streaming.utils import convert_wav from vocode.streaming.utils.mp3_helper import decode_mp3 -from vocode.streaming.utils.worker import ThreadAsyncWorker, logger +from vocode.streaming.utils.worker import ThreadAsyncWorker class MiniaudioWorker(ThreadAsyncWorker[Union[bytes, None]]): @@ -41,9 +43,7 @@ def _run_loop(self): if mp3_chunk is None: current_mp3_buffer.clear() current_wav_buffer.clear() - self.output_janus_queue.sync_q.put( - (bytes(current_wav_output_buffer), True) - ) + self.output_janus_queue.sync_q.put((bytes(current_wav_output_buffer), True)) current_wav_output_buffer.clear() continue try: diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer.py b/vocode/streaming/synthesizer/play_ht_synthesizer.py index d6deb49afd..05405af9d3 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer.py @@ -1,18 +1,13 @@ import asyncio -import logging -from typing import Optional +from typing import Literal -from aiohttp import ClientSession, ClientTimeout -from vocode import getenv -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment +import aiohttp +from aiohttp import ClientTimeout + +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig, SynthesizerType -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) -from vocode.streaming.utils.mp3_helper import decode_mp3 +from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult TTS_ENDPOINT = "https://play.ht/api/v2/tts/stream" @@ -21,15 +16,15 @@ class PlayHtSynthesizer(BaseSynthesizer[PlayHtSynthesizerConfig]): def __init__( self, synthesizer_config: PlayHtSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[ClientSession] = None, max_backoff_retries=3, backoff_retry_delay=2, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__( + synthesizer_config, + ) self.synthesizer_config = synthesizer_config - self.api_key = synthesizer_config.api_key or getenv("PLAY_HT_API_KEY") - self.user_id = synthesizer_config.user_id or getenv("PLAY_HT_USER_ID") + self.api_key = synthesizer_config.api_key + self.user_id = synthesizer_config.user_id if not self.api_key or not self.user_id: raise ValueError( "You must set the PLAY_HT_API_KEY and PLAY_HT_USER_ID environment variables" @@ -39,23 +34,30 @@ def __init__( self.max_backoff_retries = max_backoff_retries self.backoff_retry_delay = backoff_retry_delay - async def create_speech( + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: + self.total_chars += len(message.text) headers = { "AUTHORIZATION": f"Bearer {self.api_key}", "X-USER-ID": self.user_id, - "Accept": "audio/mpeg", "Content-Type": "application/json", } + output_format: Literal["wav", "mulaw"] + if self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + output_format = "wav" + elif self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + output_format = "mulaw" body = { "quality": "draft", "voice": self.synthesizer_config.voice_id, "text": message.text, "sample_rate": self.synthesizer_config.sampling_rate, + "output_format": output_format, } if self.synthesizer_config.speed: body["speed"] = self.synthesizer_config.speed @@ -63,22 +65,20 @@ async def create_speech( body["seed"] = self.synthesizer_config.seed if self.synthesizer_config.temperature: body["temperature"] = self.synthesizer_config.temperature - - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.create_total", - ) + if self.synthesizer_config.quality: + body["quality"] = self.synthesizer_config.quality backoff_retry_delay = self.backoff_retry_delay max_backoff_retries = self.max_backoff_retries - for attempt in range(max_backoff_retries): - response = await self.aiohttp_session.post( + response = await self.async_requestor.get_session().post( TTS_ENDPOINT, headers=headers, json=body, timeout=ClientTimeout(total=15), ) - + if not response.ok: + raise Exception(f"Play.ht API error status code {response.status}") if response.status == 429 and attempt < max_backoff_retries - 1: await asyncio.sleep(backoff_retry_delay) backoff_retry_delay *= 2 # Exponentially increase delay @@ -90,27 +90,56 @@ async def create_speech( if self.experimental_streaming: return SynthesisResult( self.experimental_mp3_streaming_output_generator( - response, chunk_size, create_speech_span - ), + response, chunk_size + ), # should be wav lambda seconds: self.get_message_cutoff_from_voice_speed( message, seconds, self.words_per_minute ), ) else: - read_response = await response.read() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.PLAY_HT.value.split('_', 1)[-1]}.convert", - ) - output_bytes_io = decode_mp3(read_response) - - result = self.create_synthesis_result_from_wav( - synthesizer_config=self.synthesizer_config, - file=output_bytes_io, - message=message, - chunk_size=chunk_size, + return SynthesisResult( + self._streaming_chunk_generator(response, chunk_size, output_format), + lambda seconds: self.get_message_cutoff_from_voice_speed(message, seconds, 150), ) - convert_span.end() - return result raise Exception("Max retries reached for Play.ht API") + + @classmethod + def get_voice_identifier(cls, synthesizer_config: PlayHtSynthesizerConfig): + return ":".join( + ( + "play_ht", + str(synthesizer_config.user_id), + synthesizer_config.voice_id, + str(synthesizer_config.speed), + str(synthesizer_config.seed), + str(synthesizer_config.temperature), + str(synthesizer_config.quality), + synthesizer_config.audio_encoding, + ) + ) + + @staticmethod + async def _streaming_chunk_generator( + response: aiohttp.ClientResponse, + chunk_size: int, + output_format: Literal["wav", "mulaw"], + ): + if output_format == "wav": + buffer = b"" + is_first_chunk = True + async for chunk in response.content.iter_any(): + if is_first_chunk: + is_first_chunk = False + buffer += chunk[88:] # size of the wav header + else: + buffer += chunk + i = 0 + while i < len(buffer) - chunk_size: + yield SynthesisResult.ChunkResult(buffer[i : i + chunk_size], False) + i += chunk_size + buffer = buffer[i:] + elif output_format == "mulaw": + async for chunk in response.content.iter_chunked(chunk_size): + yield SynthesisResult.ChunkResult(chunk, False) + await response.release() diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py b/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py new file mode 100644 index 0000000000..6db09ef7d3 --- /dev/null +++ b/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py @@ -0,0 +1,300 @@ +import asyncio +import audioop +import os +from typing import AsyncGenerator, AsyncIterator, Optional + +import numpy as np +from loguru import logger +from pyht import AsyncClient +from pyht.client import CongestionCtrl, TTSOptions +from pyht.protos import api_pb2 + +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult +from vocode.streaming.synthesizer.play_ht_synthesizer import ( + PlayHtSynthesizer as VocodePlayHtSynthesizer, +) +from vocode.streaming.synthesizer.synthesizer_utils import split_text +from vocode.streaming.utils import generate_from_async_iter_with_lookahead, generate_with_is_last +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log + +PLAY_HT_ON_PREM_ADDR = os.environ.get("VOCODE_PLAYHT_ON_PREM_ADDR", None) +PLAY_HT_V2_MAX_CHARS = 200 +EXPERIMENTAL_VOICE_AMPLITUDE_THRESHOLD = 200 + + +class PlayHtSynthesizerV2(VocodePlayHtSynthesizer): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.playht_client_saas = AsyncClient( + user_id=self.user_id, + api_key=self.api_key, + ) + self.playht_client_on_prem = None + + if self.synthesizer_config.on_prem: + logger.info(f"Creating on-prem PlayHT with gRPC address {PLAY_HT_ON_PREM_ADDR}") + advanced_options = AsyncClient.AdvancedOptions( + grpc_addr=PLAY_HT_ON_PREM_ADDR, + fallback_enabled=True, + congestion_ctrl=CongestionCtrl.STATIC_MAR_2023, + ) + + self.playht_client_on_prem = AsyncClient( + user_id=self.user_id, + api_key=self.api_key, + advanced=advanced_options, + ) + + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + audio_format = api_pb2.FORMAT_MULAW + elif self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + audio_format = api_pb2.FORMAT_WAV + + sample_rate = self.synthesizer_config.sampling_rate + self.playht_options = TTSOptions( + voice=self.synthesizer_config.voice_id, + # PlayHT runs significantly slower when sampling rate is not 24KHz + # 24KHz is the default for PlayHT + sample_rate=sample_rate if sample_rate > 24000 else 24000, + speed=self.synthesizer_config.speed if self.synthesizer_config.speed else 1, + format=audio_format, + text_guidance=self.synthesizer_config.text_guidance, + voice_guidance=self.synthesizer_config.voice_guidance, + temperature=self.synthesizer_config.temperature, + top_p=self.synthesizer_config.top_p, + ) + if self.synthesizer_config.quality: + self.playht_options.quality = self.synthesizer_config.quality + + @property + def playht_client(self) -> AsyncClient: + if self.playht_client_on_prem is not None: + return self.playht_client_on_prem + return self.playht_client_saas + + async def create_speech_uncached( + self, + message: BaseMessage, + chunk_size: int, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, + ) -> SynthesisResult: + + self.total_chars += len(message.text) + chunk_queue: asyncio.Queue[Optional[bytes]] = asyncio.Queue() + asyncio_create_task_with_done_error_log( + self.get_chunks( + message, + chunk_size, + chunk_queue, + cut_leading_silence=not is_first_text_chunk + and self.synthesizer_config.experimental_remove_silence, + cut_trailing_silence=not is_sole_text_chunk + and self.synthesizer_config.experimental_remove_silence, + ), + ) + + return SynthesisResult( + self.chunk_result_generator_from_queue(chunk_queue), + lambda seconds: self.get_message_cutoff_from_voice_speed( + message, + seconds, + self.words_per_minute, + ), + ) + + def _contains_voice_experimental(self, chunk: bytes): + pcm = np.frombuffer( + ( + audioop.ulaw2lin(chunk, 2) + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW + else chunk + ), + dtype=np.int16, + ) + return np.max(np.abs(pcm)) > EXPERIMENTAL_VOICE_AMPLITUDE_THRESHOLD + + @staticmethod + def _enumerate_by_chunk_size(buffer: bytes, chunk_size: int): + for buffer_idx in range(0, len(buffer) - chunk_size, chunk_size): + yield buffer_idx, buffer[buffer_idx : buffer_idx + chunk_size] + + async def _downsample_from_24khz(self, chunk: bytes) -> bytes: + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + return await self._downsample_mulaw(chunk) + elif self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: + return await self._downsample_pcm(chunk) + else: + raise Exception(f"Unsupported audio format: {self.synthesizer_config.audio_encoding}") + + async def _downsample_pcm(self, chunk: bytes) -> bytes: + downsampled_chunk, _ = audioop.ratecv( + chunk, + 2, + 1, + 24000, + self.synthesizer_config.sampling_rate, + None, + ) + + return downsampled_chunk + + async def _downsample_mulaw(self, chunk: bytes) -> bytes: + pcm_data = audioop.ulaw2lin(chunk, 2) + downsampled_pcm_data = await self._downsample_pcm(pcm_data) + downsampled_chunk = audioop.lin2ulaw(downsampled_pcm_data, 2) + return downsampled_chunk + + async def downsample_async_generator(self, async_gen: AsyncGenerator[bytes, None]): + async for play_ht_chunk in async_gen: + if self.synthesizer_config.sampling_rate >= 24000: + yield play_ht_chunk + else: + downsampled_chunk = await self._downsample_from_24khz(play_ht_chunk) + yield downsampled_chunk + + async def _cut_leading_trailing_silence( + self, + async_iter: AsyncIterator[bytes], + chunk_size: int, + cut_leading_silence: bool = True, + cut_trailing_silence: bool = True, + ) -> AsyncGenerator[bytes, None]: + buffer: bytearray = bytearray() + + async def generate_chunks( + play_ht_chunk: bytes, + cut_leading_silence=False, + ) -> AsyncGenerator[bytes, None]: + """Yields chunks of size chunk_size from play_ht_chunk and leaves the remainder in buffer. + + If cut_leading_silence is True, does not yield chunks until it detects voice. + """ + nonlocal buffer + + buffer.extend(play_ht_chunk) + detected_voice = False + for buffer_idx, chunk in self._enumerate_by_chunk_size(buffer, chunk_size): + if cut_leading_silence and not detected_voice: + if self._contains_voice_experimental(chunk): + detected_voice = True + yield chunk + if detected_voice: + logger.debug(f"Cut off {buffer_idx} bytes of leading silence") + else: + yield chunk + buffer = buffer[len(buffer) - (len(buffer) % chunk_size) :] + + async def _cut_out_trailing_silence( + trailing_chunk: bytes, + ) -> AsyncGenerator[bytes, None]: + """Yields chunks of size chunk_size from trailing_chunk until it detects silence.""" + for buffer_idx, chunk in self._enumerate_by_chunk_size(trailing_chunk, chunk_size): + if not self._contains_voice_experimental(chunk): + logger.debug( + f"Cutting off {len(trailing_chunk) - buffer_idx} bytes of trailing silence", + ) + break + yield chunk + + # Yield from the first audio chunk, no matter what, for latency + try: + play_ht_chunk = await async_iter.__anext__() + except StopAsyncIteration: + return + + async for chunk in generate_chunks(play_ht_chunk, cut_leading_silence=cut_leading_silence): + yield chunk + + async for lookahead_buffer, is_last in generate_with_is_last( + generate_from_async_iter_with_lookahead(async_iter, 2), + ): + if not is_last: + async for chunk in generate_chunks(lookahead_buffer[0]): + yield chunk + else: + trailing_chunk = b"".join(lookahead_buffer) + async for chunk in ( + _cut_out_trailing_silence(trailing_chunk) + if cut_trailing_silence + else generate_chunks(trailing_chunk) + ): + yield chunk + + async def get_chunks( + self, + message: BaseMessage, + chunk_size: int, + chunk_queue: asyncio.Queue[Optional[bytes]], + cut_leading_silence: bool, + cut_trailing_silence: bool, + ): + buffer = bytearray() + try: + playht_bytes_generators = [ + self.playht_client.tts( + text, + self.playht_options, + ) + for text in split_text( + string_to_split=message.text, + max_text_length=PLAY_HT_V2_MAX_CHARS, + ) + ] + downsampled_generators = [ + self.downsample_async_generator(gen) for gen in playht_bytes_generators + ] + + for async_gen in downsampled_generators: + async_iter = async_gen.__aiter__() + if ( + self.synthesizer_config.audio_encoding == AudioEncoding.LINEAR16 + ): # skip the first chunk, which contains wav header + await async_iter.__anext__() + if not cut_trailing_silence and not cut_leading_silence: + while True: + try: + play_ht_chunk = await async_iter.__anext__() + except StopAsyncIteration: + break + + buffer.extend(play_ht_chunk) + for _, chunk in self._enumerate_by_chunk_size(buffer, chunk_size): + chunk_queue.put_nowait(chunk) + buffer = buffer[len(buffer) - (len(buffer) % chunk_size) :] + if len(buffer) > 0: + chunk_queue.put_nowait(buffer) + else: + async for chunk in self._cut_leading_trailing_silence( + async_iter, + chunk_size, + cut_leading_silence=cut_leading_silence, + cut_trailing_silence=cut_trailing_silence, + ): + chunk_queue.put_nowait(chunk) + except asyncio.CancelledError: + pass + finally: + chunk_queue.put_nowait(None) # treated as sentinel + + @classmethod + def get_voice_identifier(cls, synthesizer_config: PlayHtSynthesizerConfig): + return ":".join( + ( + "play_ht_v2", + synthesizer_config.voice_id, + str(synthesizer_config.user_id), + str(synthesizer_config.speed), + str(synthesizer_config.seed), + str(synthesizer_config.temperature), + synthesizer_config.audio_encoding, + ), + ) + + async def tear_down(self): + await self.playht_client.close() + await super().tear_down() diff --git a/vocode/streaming/synthesizer/polly_synthesizer.py b/vocode/streaming/synthesizer/polly_synthesizer.py index da7bfc614a..4f36cd9057 100644 --- a/vocode/streaming/synthesizer/polly_synthesizer.py +++ b/vocode/streaming/synthesizer/polly_synthesizer.py @@ -1,32 +1,25 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor -import logging -from typing import Any, Optional -import aiohttp import json +from concurrent.futures import ThreadPoolExecutor +from typing import Any + +import boto3 -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import PollySynthesizerConfig from vocode.streaming.synthesizer.base_synthesizer import ( BaseSynthesizer, SynthesisResult, - tracer, encode_as_wav, ) -from vocode.streaming.models.synthesizer import PollySynthesizerConfig, SynthesizerType -from vocode.streaming.utils.mp3_helper import decode_mp3 - -import boto3 class PollySynthesizer(BaseSynthesizer[PollySynthesizerConfig]): def __init__( self, synthesizer_config: PollySynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__(synthesizer_config) client = boto3.client("polly") @@ -83,11 +76,9 @@ async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.POLLY.value.split('_', 1)[-1]}.create_total", - ) audio_response = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesize, message.text ) @@ -102,8 +93,6 @@ async def create_speech( if v ] - create_speech_span.end() - async def chunk_generator(audio_data_stream, chunk_transform=lambda x: x): audio_buffer = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, diff --git a/vocode/streaming/synthesizer/rime_synthesizer.py b/vocode/streaming/synthesizer/rime_synthesizer.py index 0d103d041a..f776da4a81 100644 --- a/vocode/streaming/synthesizer/rime_synthesizer.py +++ b/vocode/streaming/synthesizer/rime_synthesizer.py @@ -1,89 +1,144 @@ +import asyncio import audioop -import logging -import aiohttp -from pydub import AudioSegment import base64 +import io +import json +from typing import Optional + +import aiohttp +from loguru import logger + from vocode import getenv -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.message import BaseMessage - -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - encode_as_wav, - tracer, +from vocode.streaming.models.synthesizer import ( + RIME_DEFAULT_REDUCE_LATENCY, + RIME_DEFAULT_SPEED_ALPHA, + RimeSynthesizerConfig, ) +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult -from typing import Any, Optional -import io -import requests - -from vocode.streaming.models.synthesizer import RimeSynthesizerConfig, SynthesizerType - -from opentelemetry.context.context import Context +# TODO: [OSS] Remove call to internal library with Synthesizers refactor # https://rime.ai/docs/quickstart +WAV_HEADER_LENGTH = 44 + class RimeSynthesizer(BaseSynthesizer[RimeSynthesizerConfig]): def __init__( self, synthesizer_config: RimeSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) - self.api_key = getenv("RIME_API_KEY") + super().__init__(synthesizer_config) + + self.base_url = synthesizer_config.base_url + self.model_id = synthesizer_config.model_id self.speaker = synthesizer_config.speaker + self.speed_alpha = synthesizer_config.speed_alpha self.sampling_rate = synthesizer_config.sampling_rate - self.base_url = synthesizer_config.base_url + self.reduce_latency = synthesizer_config.reduce_latency + self.api_key = f"Bearer {getenv('RIME_API_KEY')}" - async def create_speech( + @classmethod + def get_voice_identifier(cls, synthesizer_config: RimeSynthesizerConfig): + return ":".join( + ( + "rime", + synthesizer_config.speaker, + str(synthesizer_config.speed_alpha), + synthesizer_config.audio_encoding, + ) + ) + + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: + self.total_chars += len(message.text) headers = { - "Authorization": f"Bearer {self.api_key}", + "Authorization": self.api_key, "Content-Type": "application/json", } - body = { - "text": message.text, - "speaker": self.speaker, - "samplingRate": self.sampling_rate, - } - if self.synthesizer_config.speed_alpha is not None: - body["speedAlpha"] = self.synthesizer_config.speed_alpha + body = self.get_request_body(message.text) - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.RIME.value.split('_', 1)[-1]}.create_total", - ) - async with self.aiohttp_session.post( + async with self.async_requestor.get_session().post( self.base_url, headers=headers, json=body, timeout=aiohttp.ClientTimeout(total=15), ) as response: if not response.ok: - raise Exception( - f"Rime API error: {response.status}, {await response.text()}" - ) - data = await response.json() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.RIME.value.split('_', 1)[-1]}.convert", + raise Exception(f"Rime API error: {response.status}, {await response.text()}") + data = json.loads(await response.text()) + + audio_content = data.get("audioContent") + output_bytes = base64.b64decode(audio_content)[WAV_HEADER_LENGTH:] + + if self.synthesizer_config.audio_encoding == AudioEncoding.MULAW: + output_bytes = audioop.lin2ulaw(output_bytes, 2) + + return SynthesisResult( + self._chunk_generator(output_bytes, chunk_size), + lambda seconds: self.get_message_cutoff_from_total_response_length( + self.synthesizer_config, message, seconds, len(output_bytes) + ), ) - audio_file = io.BytesIO(base64.b64decode(data.get("audioContent"))) + @staticmethod + async def _chunk_generator(output_bytes, chunk_size): + for i in range(0, len(output_bytes), chunk_size): + if i + chunk_size > len(output_bytes): + yield SynthesisResult.ChunkResult(output_bytes[i:], True) + else: + yield SynthesisResult.ChunkResult(output_bytes[i : i + chunk_size], False) - result = self.create_synthesis_result_from_wav( - synthesizer_config=self.synthesizer_config, - file=audio_file, - message=message, - chunk_size=chunk_size, + async def get_chunks( + self, + headers: dict, + body: dict, + chunk_size: int, + chunk_queue: asyncio.Queue[Optional[bytes]], + ): + try: + async_client = self.async_requestor.get_client() + stream = await async_client.send( + async_client.build_request( + "POST", + self.base_url, + headers=headers, + json=body, + ), + stream=True, ) - convert_span.end() - return result + if not stream.is_success: + error = await stream.aread() + logger.error(f"Rime API failed: {stream.status_code} {error.decode('utf-8')}") + raise Exception(f"Rime API returned {stream.status_code} status code") + async for chunk in stream.aiter_bytes(chunk_size): + chunk_queue.put_nowait(chunk) + except asyncio.CancelledError: + pass + finally: + chunk_queue.put_nowait(None) # treated as sentinel + + def get_request_body(self, text): + speed_alpha = self.speed_alpha if self.speed_alpha else RIME_DEFAULT_SPEED_ALPHA + reduce_latency = self.reduce_latency if self.reduce_latency else RIME_DEFAULT_REDUCE_LATENCY + + body = { + "text": text, + "speaker": self.speaker, + "samplingRate": self.sampling_rate, + "speedAlpha": speed_alpha, + "reduceLatency": reduce_latency, + } + + if self.model_id: + body["modelId"] = self.model_id + + return body diff --git a/vocode/streaming/synthesizer/stream_elements_synthesizer.py b/vocode/streaming/synthesizer/stream_elements_synthesizer.py index b3a627b457..3d656f5cce 100644 --- a/vocode/streaming/synthesizer/stream_elements_synthesizer.py +++ b/vocode/streaming/synthesizer/stream_elements_synthesizer.py @@ -1,23 +1,11 @@ import io + import aiohttp from pydub import AudioSegment -import logging -from typing import Optional -import requests -from vocode.streaming.agent.bot_sentiment_analyser import BotSentiment from vocode.streaming.models.message import BaseMessage -from vocode.streaming.models.synthesizer import ( - StreamElementsSynthesizerConfig, - SynthesizerType, -) -from vocode.streaming.synthesizer.base_synthesizer import ( - BaseSynthesizer, - SynthesisResult, - tracer, -) - -from opentelemetry.context.context import Context +from vocode.streaming.models.synthesizer import StreamElementsSynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult class StreamElementsSynthesizer(BaseSynthesizer[StreamElementsSynthesizerConfig]): @@ -26,35 +14,27 @@ class StreamElementsSynthesizer(BaseSynthesizer[StreamElementsSynthesizerConfig] def __init__( self, synthesizer_config: StreamElementsSynthesizerConfig, - logger: Optional[logging.Logger] = None, - aiohttp_session: Optional[aiohttp.ClientSession] = None, ): - super().__init__(synthesizer_config, aiohttp_session) + super().__init__(synthesizer_config) self.voice = synthesizer_config.voice async def create_speech( self, message: BaseMessage, chunk_size: int, - bot_sentiment: Optional[BotSentiment] = None, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, ) -> SynthesisResult: url_params = { "voice": self.voice, "text": message.text, } - create_speech_span = tracer.start_span( - f"synthesizer.{SynthesizerType.STREAM_ELEMENTS.value.split('_', 1)[-1]}.create_total", - ) - async with self.aiohttp_session.get( + async with self.async_requestor.get_session().get( self.TTS_ENDPOINT, params=url_params, timeout=aiohttp.ClientTimeout(total=15), ) as response: read_response = await response.read() - create_speech_span.end() - convert_span = tracer.start_span( - f"synthesizer.{SynthesizerType.STREAM_ELEMENTS.value.split('_', 1)[-1]}.convert", - ) # TODO: probably needs to be in a thread audio_segment: AudioSegment = AudioSegment.from_mp3( @@ -69,5 +49,5 @@ async def create_speech( message=message, chunk_size=chunk_size, ) - convert_span.end() + return result diff --git a/vocode/streaming/synthesizer/synthesizer_utils.py b/vocode/streaming/synthesizer/synthesizer_utils.py new file mode 100644 index 0000000000..ac69633adf --- /dev/null +++ b/vocode/streaming/synthesizer/synthesizer_utils.py @@ -0,0 +1,50 @@ +from typing import List + + +def split_text(string_to_split: str, max_text_length: int) -> List[str]: + # Base case: if the string_to_split is less than or equal to max_text_length characters, return it as a single element array + if len(string_to_split) <= max_text_length: + return [string_to_split.strip()] + + # Recursive case: find the index of the last sentence ender in the first max_text_length characters of the string_to_split + sentence_enders = [".", "!", "?"] + index = -1 + for ender in sentence_enders: + i = string_to_split[:max_text_length].rfind(ender) + if i > index: + index = i + + # If there is a sentence ender, split the string_to_split at that index plus one and strip any spaces from both parts + if index != -1: + first_part = string_to_split[: index + 1].strip() + second_part = string_to_split[index + 1 :].strip() + + # If there is no sentence ender, find the index of the last comma in the first max_text_length characters of the string_to_split + else: + index = string_to_split[:max_text_length].rfind(",") + # If there is a comma, split the string_to_split at that index plus one and strip any spaces from both parts + if index != -1: + first_part = string_to_split[: index + 1].strip() + second_part = string_to_split[index + 1 :].strip() + # If there is no comma, find the index of the last space in the first max_text_length characters of the string_to_split + else: + index = string_to_split[:max_text_length].rfind(" ") + # If there is a space, split the string_to_split at that index and strip any spaces from both parts + if index != -1: + first_part = string_to_split[:index].strip() + second_part = string_to_split[index:].strip() + + # If there is no space, split the string_to_split at max_text_length characters and strip any spaces from both parts + else: + first_part = string_to_split[:max_text_length].strip() + second_part = string_to_split[max_text_length:].strip() + + # Append the first part to the result array + result = [first_part] + + # Call the function recursively on the remaining part of the string_to_split and extend the result array with it, unless it is empty + if second_part != "": + result.extend(split_text(string_to_split=second_part, max_text_length=max_text_length)) + + # Return the result array + return result diff --git a/vocode/streaming/telephony/client/abstract_telephony_client.py b/vocode/streaming/telephony/client/abstract_telephony_client.py new file mode 100644 index 0000000000..2cdf92b84c --- /dev/null +++ b/vocode/streaming/telephony/client/abstract_telephony_client.py @@ -0,0 +1,29 @@ +from abc import ABC, abstractmethod +from typing import Dict, Optional + +from vocode.streaming.models.telephony import TelephonyProviderConfig + + +class AbstractTelephonyClient(ABC): + def __init__(self, base_url: str): + self.base_url = base_url + + @abstractmethod + def get_telephony_config(self) -> TelephonyProviderConfig: + pass + + @abstractmethod + async def create_call( + self, + conversation_id: str, + to_phone: str, + from_phone: str, + record: bool = False, + digits: Optional[str] = None, + telephony_params: Optional[Dict[str, str]] = None, + ) -> str: # returns identifier of the call on the telephony provider + pass + + @abstractmethod + async def end_call(self, id) -> bool: + raise NotImplementedError diff --git a/vocode/streaming/telephony/client/base_telephony_client.py b/vocode/streaming/telephony/client/base_telephony_client.py deleted file mode 100644 index 157e6e9e57..0000000000 --- a/vocode/streaming/telephony/client/base_telephony_client.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Optional - -from vocode.streaming.models.telephony import BaseCallConfig - - -class BaseTelephonyClient: - def __init__(self, base_url): - self.base_url = base_url - - def get_telephony_config(self): - raise NotImplementedError - - async def create_call( - self, - conversation_id: str, - to_phone: str, - from_phone: str, - record: bool = False, - digits: Optional[str] = None, - ) -> str: # identifier of the call on the telephony provider - raise NotImplementedError - - async def end_call(self, id) -> bool: - raise NotImplementedError - - def validate_outbound_call( - self, - to_phone: str, - from_phone: str, - mobile_only: bool = True, - ): - raise NotImplementedError diff --git a/vocode/streaming/telephony/client/twilio_client.py b/vocode/streaming/telephony/client/twilio_client.py index 7325a2f871..254318cf9e 100644 --- a/vocode/streaming/telephony/client/twilio_client.py +++ b/vocode/streaming/telephony/client/twilio_client.py @@ -1,25 +1,34 @@ -from typing import Optional -from twilio.rest import Client +import os +from typing import Dict, Optional -from vocode.streaming.models.telephony import BaseCallConfig, TwilioConfig -from vocode.streaming.telephony.client.base_telephony_client import BaseTelephonyClient -from vocode.streaming.telephony.templater import Templater +import aiohttp +from loguru import logger +from vocode.streaming.models.telephony import TwilioConfig +from vocode.streaming.telephony.client.abstract_telephony_client import AbstractTelephonyClient +from vocode.streaming.telephony.templater import get_connection_twiml +from vocode.streaming.utils.async_requester import AsyncRequestor -class TwilioClient(BaseTelephonyClient): - def __init__(self, base_url: str, twilio_config: TwilioConfig): - super().__init__(base_url) - self.twilio_config = twilio_config - # TODO: this is blocking - self.twilio_client = Client(twilio_config.account_sid, twilio_config.auth_token) - try: - # Test credentials - self.twilio_client.api.accounts(twilio_config.account_sid).fetch() - except Exception as e: - raise RuntimeError( - "Could not create Twilio client. Invalid credentials" - ) from e - self.templater = Templater() + +class TwilioBadRequestException(ValueError): + pass + + +class TwilioClient(AbstractTelephonyClient): + def __init__( + self, + base_url: str, + maybe_twilio_config: Optional[TwilioConfig] = None, + ): + self.twilio_config = maybe_twilio_config or TwilioConfig( + account_sid=os.environ["TWILIO_ACCOUNT_SID"], + auth_token=os.environ["TWILIO_AUTH_TOKEN"], + ) + self.auth = aiohttp.BasicAuth( + login=self.twilio_config.account_sid, + password=self.twilio_config.auth_token, + ) + super().__init__(base_url=base_url) def get_telephony_config(self): return self.twilio_config @@ -29,48 +38,49 @@ async def create_call( conversation_id: str, to_phone: str, from_phone: str, - record: bool = False, - digits: Optional[str] = None, + record: bool = False, # currently no-op + digits: Optional[str] = None, # currently no-op + telephony_params: Optional[Dict[str, str]] = None, ) -> str: - # TODO: Make this async. This is blocking. - twiml = self.get_connection_twiml(conversation_id=conversation_id) - twilio_call = self.twilio_client.calls.create( - twiml=twiml.body.decode("utf-8"), - to=to_phone, - from_=from_phone, - send_digits=digits, - record=record, - **self.get_telephony_config().extra_params, - ) - return twilio_call.sid + data = { + "Twiml": self.get_connection_twiml(conversation_id=conversation_id).body.decode( + "utf-8" + ), + "To": f"+{to_phone}", + "From": f"+{from_phone}", + **(telephony_params or {}), + } + if digits: + data["SendDigits"] = digits + async with AsyncRequestor().get_session().post( + f"https://api.twilio.com/2010-04-01/Accounts/{self.twilio_config.account_sid}/Calls.json", + auth=self.auth, + data=data, + ) as response: + if not response.ok: + if response.status == 400: + logger.error( + f"Failed to create call: {response.status} {response.reason} {await response.json()}" + ) + raise TwilioBadRequestException( + "Telephony provider rejected call; this is usually due to a bad/malformed number. " + "If this persists, and you're sure that the number is well-formed, " + "please contact us." + ) + raise RuntimeError(f"Failed to create call: {response.status} {response.reason}") + response = await response.json() + return response["sid"] def get_connection_twiml(self, conversation_id: str): - return self.templater.get_connection_twiml( - base_url=self.base_url, call_id=conversation_id - ) + return get_connection_twiml(call_id=conversation_id, base_url=self.base_url) async def end_call(self, twilio_sid): - # TODO: Make this async. This is blocking. - response = self.twilio_client.calls(twilio_sid).update(status="completed") - return response.status == "completed" - - def validate_outbound_call( - self, - to_phone: str, - from_phone: str, - mobile_only: bool = True, - ): - if len(to_phone) < 8: - raise ValueError("Invalid 'to' phone") - - if not mobile_only: - return - line_type_intelligence = ( - self.twilio_client.lookups.v2.phone_numbers(to_phone) - .fetch(fields="line_type_intelligence") - .line_type_intelligence - ) - if not line_type_intelligence or ( - line_type_intelligence and line_type_intelligence["type"] != "mobile" - ): - raise ValueError("Can only call mobile phones") + async with AsyncRequestor().get_session().post( + f"https://api.twilio.com/2010-04-01/Accounts/{self.twilio_config.account_sid}/Calls/{twilio_sid}.json", + auth=self.auth, + data={"Status": "completed"}, + ) as response: + if not response.ok: + raise RuntimeError(f"Failed to end call: {response.status} {response.reason}") + response = await response.json() + return response["status"] == "completed" diff --git a/vocode/streaming/telephony/client/vonage_client.py b/vocode/streaming/telephony/client/vonage_client.py index d7582a149d..ffc70f7b31 100644 --- a/vocode/streaming/telephony/client/vonage_client.py +++ b/vocode/streaming/telephony/client/vonage_client.py @@ -1,69 +1,49 @@ +import os from typing import Any, Dict, List, Optional -import aiohttp -from vocode.streaming.models.telephony import VonageConfig -from vocode.streaming.telephony.client.base_telephony_client import BaseTelephonyClient -import vonage +from vocode.streaming.models.telephony import VonageConfig +from vocode.streaming.telephony.client.abstract_telephony_client import AbstractTelephonyClient from vocode.streaming.telephony.constants import VONAGE_CONTENT_TYPE +from vocode.streaming.utils.async_requester import AsyncRequestor + +class VonageBadRequestException(ValueError): + pass -class VonageClient(BaseTelephonyClient): + +class VonageClient(AbstractTelephonyClient): def __init__( self, - base_url, - vonage_config: VonageConfig, - aiohttp_session: Optional[aiohttp.ClientSession] = None, + base_url: str, + maybe_vonage_config: Optional[VonageConfig] = None, + record_calls: bool = False, ): - super().__init__(base_url) - self.vonage_config = vonage_config - self.client = vonage.Client( - key=vonage_config.api_key, - secret=vonage_config.api_secret, - application_id=vonage_config.application_id, - private_key=vonage_config.private_key, + + import vonage + + self.vonage = vonage + + super().__init__( + base_url=base_url, + ) + self.vonage_config = maybe_vonage_config or VonageConfig( + api_key=os.environ["VONAGE_API_KEY"], + api_secret=os.environ["VONAGE_API_SECRET"], + application_id=os.environ["VONAGE_APPLICATION_ID"], + private_key=os.environ["VONAGE_PRIVATE_KEY"], + record=record_calls, + ) + # Vonage's sync client: only used for authentication helpers + self.client = self.vonage.Client( + key=self.vonage_config.api_key, + secret=self.vonage_config.api_secret, + application_id=self.vonage_config.application_id, + private_key=self.vonage_config.private_key, ) - self.voice = vonage.Voice(self.client) - self.maybe_aiohttp_session = aiohttp_session def get_telephony_config(self): return self.vonage_config - async def create_vonage_call( - self, - to_phone: str, - from_phone: str, - ncco: str, - digits: Optional[str] = None, - event_urls: List[str] = [], - **kwargs, - ) -> str: # returns the Vonage UUID - aiohttp_session = self.maybe_aiohttp_session or aiohttp.ClientSession() - vonage_call_uuid: str - async with aiohttp_session.post( - f"https://api.nexmo.com/v1/calls", - json={ - "to": [{"type": "phone", "number": to_phone, "dtmfAnswer": digits}], - "from": {"type": "phone", "number": from_phone}, - "ncco": ncco, - "event_url": event_urls, - **kwargs, - }, - headers={ - "Authorization": f"Bearer {self.client._generate_application_jwt().decode()}" - }, - ) as response: - if not response.ok: - raise RuntimeError( - f"Failed to start call: {response.status} {response.reason}" - ) - data = await response.json() - if not data["status"] == "started": - raise RuntimeError(f"Failed to start call: {response}") - vonage_call_uuid = data["uuid"] - if not self.maybe_aiohttp_session: - await aiohttp_session.close() - return vonage_call_uuid - async def create_call( self, conversation_id: str, @@ -71,63 +51,106 @@ async def create_call( from_phone: str, record: bool = False, digits: Optional[str] = None, + telephony_params: Optional[Dict[str, str]] = None, ) -> str: # identifier of the call on the telephony provider - return await self.create_vonage_call( + return await self._create_vonage_call( to_phone, from_phone, self.create_call_ncco( - self.base_url, conversation_id, record, is_outbound=True + conversation_id=conversation_id, + record=record, + is_outbound=True, ), digits, + event_urls=[], ) - @staticmethod - def create_call_ncco(base_url, conversation_id, record, is_outbound: bool = False): + async def end_call(self, id) -> bool: + async with AsyncRequestor().get_session().put( + f"https://api.nexmo.com/v1/calls/{id}", + json={"action": "hangup"}, + headers={"Authorization": f"Bearer {self.client._generate_application_jwt().decode()}"}, + ) as response: + if not response.ok: + raise RuntimeError(f"Failed to end call: {response.status} {response.reason}") + return True + + async def update_call(self, vonage_uuid, new_ncco): + async with AsyncRequestor().get_session().put( + f"https://api.nexmo.com/v1/calls/{vonage_uuid}", + json={ + "action": "transfer", + "destination": {"type": "ncco", "ncco": new_ncco}, + }, + headers={"Authorization": self.client._create_jwt_auth_string().decode()}, + ) as response: + if not response.ok: + raise RuntimeError(f"Failed to update call: {response.status} {response.reason}") + return True + + def create_call_ncco( + self, + conversation_id, + record, # currently no-op + is_outbound: bool = False, + ): ncco: List[Dict[str, Any]] = [] - if record: - ncco.append( - { - "action": "record", - "eventUrl": [f"https://{base_url}/recordings/{conversation_id}"], - } - ) ncco.append( { "action": "connect", "endpoint": [ { "type": "websocket", - "uri": f"wss://{base_url}/connect_call/{conversation_id}", + "uri": f"wss://{self.base_url}/connect_call/{conversation_id}", "content-type": VONAGE_CONTENT_TYPE, "headers": {}, } ], - } + }, ) return ncco - async def end_call(self, id) -> bool: - aiohttp_session = self.maybe_aiohttp_session or aiohttp.ClientSession() - async with aiohttp_session.put( - f"https://api.nexmo.com/v1/calls/{id}", - json={"action": "hangup"}, - headers={ - "Authorization": f"Bearer {self.client._generate_application_jwt().decode()}" + async def _create_vonage_call( + self, + to_phone: str, + from_phone: str, + ncco: str, + digits: Optional[str] = None, + event_urls: List[str] = [], + **kwargs, + ) -> str: # returns the Vonage UUID + vonage_call_uuid: str + async with AsyncRequestor().get_session().post( + "https://api.nexmo.com/v1/calls", + json={ + "to": [{"type": "phone", "number": to_phone, "dtmfAnswer": digits}], + "from": {"type": "phone", "number": from_phone}, + "ncco": ncco, + "event_url": event_urls, + **kwargs, }, + headers={"Authorization": f"Bearer {self.client._generate_application_jwt().decode()}"}, ) as response: if not response.ok: - raise RuntimeError( - f"Failed to end call: {response.status} {response.reason}" - ) - if not self.maybe_aiohttp_session: - await aiohttp_session.close() - return True + if response.status == 400: + raise VonageBadRequestException( + "Failed to start call; this is usually due to a bad/malformed number. " + "If this persists, and you're sure that the number is well-formed, " + "please contact us." + ) + raise RuntimeError(f"Failed to start call: {response.status} {response.reason}") + data = await response.json() + if not data["status"] == "started": + raise RuntimeError(f"Failed to start call: {response}") + vonage_call_uuid = data["uuid"] + return vonage_call_uuid - # TODO(EPD-186) - def validate_outbound_call( - self, - to_phone: str, - from_phone: str, - mobile_only: bool = True, - ): - pass + async def send_dtmf(self, vonage_uuid: str, digits: str): + async with AsyncRequestor().get_session().put( + f"https://api.nexmo.com/v1/calls/{vonage_uuid}/dtmf", + json={"digits": digits}, + headers={"Authorization": self.client._create_jwt_auth_string().decode()}, + ) as response: + if not response.ok: + raise RuntimeError(f"Failed to send DTMF: {response.status} {response.reason}") + await response.json() diff --git a/vocode/streaming/telephony/config_manager/in_memory_config_manager.py b/vocode/streaming/telephony/config_manager/in_memory_config_manager.py index 09d8ba94f9..d71b9a3516 100644 --- a/vocode/streaming/telephony/config_manager/in_memory_config_manager.py +++ b/vocode/streaming/telephony/config_manager/in_memory_config_manager.py @@ -1,8 +1,7 @@ from typing import Optional + from vocode.streaming.models.telephony import BaseCallConfig -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager class InMemoryConfigManager(BaseConfigManager): diff --git a/vocode/streaming/telephony/config_manager/redis_config_manager.py b/vocode/streaming/telephony/config_manager/redis_config_manager.py index af3d9a2fb7..33f4aabcf9 100644 --- a/vocode/streaming/telephony/config_manager/redis_config_manager.py +++ b/vocode/streaming/telephony/config_manager/redis_config_manager.py @@ -1,37 +1,32 @@ -import logging -import os from typing import Optional -from redis.asyncio import Redis + +from loguru import logger +from redis import Redis from vocode.streaming.models.telephony import BaseCallConfig -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.utils.redis import initialize_redis class RedisConfigManager(BaseConfigManager): - def __init__(self, logger: Optional[logging.Logger] = None): - self.redis: Redis = Redis( - host=os.environ.get("REDISHOST", "localhost"), - port=int(os.environ.get("REDISPORT", 6379)), - username=os.environ.get("REDISUSER", None), - password=os.environ.get("REDISPASSWORD", None), - db=0, - decode_responses=True, - ) - self.logger = logger or logging.getLogger(__name__) + def __init__(self): + self.redis: Redis = initialize_redis() + + async def _set_with_one_day_expiration(self, *args, **kwargs): + ONE_DAY_SECONDS = 60 * 60 * 24 + return await self.redis.set(*args, **{**kwargs, "ex": ONE_DAY_SECONDS}) async def save_config(self, conversation_id: str, config: BaseCallConfig): - self.logger.debug(f"Saving config for {conversation_id}") - await self.redis.set(conversation_id, config.json()) + logger.debug(f"Saving config for {conversation_id}") + await self._set_with_one_day_expiration(conversation_id, config.json()) async def get_config(self, conversation_id) -> Optional[BaseCallConfig]: - self.logger.debug(f"Getting config for {conversation_id}") - raw_config = await self.redis.get(conversation_id) + logger.debug(f"Getting config for {conversation_id}") + raw_config = await self.redis.get(conversation_id) # type: ignore if raw_config: return BaseCallConfig.parse_raw(raw_config) return None async def delete_config(self, conversation_id): - self.logger.debug(f"Deleting config for {conversation_id}") + logger.debug(f"Deleting config for {conversation_id}") await self.redis.delete(conversation_id) diff --git a/vocode/streaming/telephony/constants.py b/vocode/streaming/telephony/constants.py index c9647357fb..889971bbf0 100644 --- a/vocode/streaming/telephony/constants.py +++ b/vocode/streaming/telephony/constants.py @@ -1,11 +1,13 @@ -from vocode.streaming.models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding, SamplingRate # TODO(EPD-186): namespace as Twilio -DEFAULT_SAMPLING_RATE = 8000 +DEFAULT_SAMPLING_RATE = SamplingRate.RATE_8000 DEFAULT_AUDIO_ENCODING = AudioEncoding.MULAW DEFAULT_CHUNK_SIZE = 20 * 160 +MULAW_SILENCE_BYTE = b"\xff" -VONAGE_SAMPLING_RATE = 16000 +VONAGE_SAMPLING_RATE = SamplingRate.RATE_16000 VONAGE_AUDIO_ENCODING = AudioEncoding.LINEAR16 VONAGE_CHUNK_SIZE = 640 # 20ms at 16kHz with 16bit samples VONAGE_CONTENT_TYPE = "audio/l16;rate=16000" +PCM_SILENCE_BYTE = b"\x00" diff --git a/vocode/streaming/telephony/conversation/abstract_phone_conversation.py b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py new file mode 100644 index 0000000000..308919a403 --- /dev/null +++ b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py @@ -0,0 +1,90 @@ +from abc import abstractmethod +from typing import Literal, Optional, TypeVar, Union + +from fastapi import WebSocket +from loguru import logger + +from vocode import conversation_id as ctx_conversation_id +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.models.agent import AgentConfig +from vocode.streaming.models.events import PhoneCallEndedEvent +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.models.telephony import PhoneCallDirection +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice +from vocode.streaming.output_device.vonage_output_device import VonageOutputDevice +from vocode.streaming.streaming_conversation import StreamingConversation +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory +from vocode.streaming.utils import create_conversation_id +from vocode.streaming.utils.events_manager import EventsManager + +TelephonyOutputDeviceType = TypeVar( + "TelephonyOutputDeviceType", bound=Union[TwilioOutputDevice, VonageOutputDevice] +) + +LOW_INTERRUPT_SENSITIVITY_THRESHOLD = 0.9 + +TelephonyProvider = Literal["twilio", "vonage"] + + +class AbstractPhoneConversation(StreamingConversation[TelephonyOutputDeviceType]): + telephony_provider: TelephonyProvider + + def __init__( + self, + direction: PhoneCallDirection, + from_phone: str, + to_phone: str, + base_url: str, + config_manager: BaseConfigManager, + output_device: TelephonyOutputDeviceType, + agent_config: AgentConfig, + transcriber_config: TranscriberConfig, + synthesizer_config: SynthesizerConfig, + agent_factory: AbstractAgentFactory, + transcriber_factory: AbstractTranscriberFactory, + synthesizer_factory: AbstractSynthesizerFactory, + conversation_id: Optional[str] = None, + events_manager: Optional[EventsManager] = None, + speed_coefficient: float = 1.0, + per_chunk_allowance_seconds: float = 0.01, + ): + conversation_id = conversation_id or create_conversation_id() + ctx_conversation_id.set(conversation_id) + + self.direction = direction + self.from_phone = from_phone + self.to_phone = to_phone + self.base_url = base_url + super().__init__( + output_device, + transcriber_factory.create_transcriber(transcriber_config), + agent_factory.create_agent(agent_config), + synthesizer_factory.create_synthesizer(synthesizer_config), + conversation_id=conversation_id, + per_chunk_allowance_seconds=per_chunk_allowance_seconds, + events_manager=events_manager, + speed_coefficient=speed_coefficient, + ) + self.transcriptions_worker = self.TranscriptionsWorker( + input_queue=self.transcriber.output_queue, + output_queue=self.agent.get_input_queue(), + conversation=self, + interruptible_event_factory=self.interruptible_event_factory, + ) + self.config_manager = config_manager + + def attach_ws(self, ws: WebSocket): + logger.debug("Trying to attach WS to outbound call") + self.output_device.ws = ws + logger.debug("Attached WS to outbound call") + + @abstractmethod + async def attach_ws_and_start(self, ws: WebSocket): + pass + + async def terminate(self): + self.events_manager.publish_event(PhoneCallEndedEvent(conversation_id=self.id)) + await super().terminate() diff --git a/vocode/streaming/telephony/conversation/call.py b/vocode/streaming/telephony/conversation/call.py deleted file mode 100644 index 37fb442738..0000000000 --- a/vocode/streaming/telephony/conversation/call.py +++ /dev/null @@ -1,83 +0,0 @@ -from fastapi import WebSocket -from enum import Enum -import logging -from typing import Optional, TypeVar, Union -from vocode.streaming.agent.factory import AgentFactory -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.events import PhoneCallEndedEvent -from vocode.streaming.output_device.vonage_output_device import VonageOutputDevice - -from vocode.streaming.streaming_conversation import StreamingConversation -from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice -from vocode.streaming.models.synthesizer import ( - SynthesizerConfig, -) -from vocode.streaming.models.transcriber import ( - TranscriberConfig, -) -from vocode.streaming.synthesizer.factory import SynthesizerFactory -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) -from vocode.streaming.telephony.constants import DEFAULT_SAMPLING_RATE -from vocode.streaming.streaming_conversation import StreamingConversation -from vocode.streaming.transcriber.factory import TranscriberFactory -from vocode.streaming.utils.events_manager import EventsManager -from vocode.streaming.utils.conversation_logger_adapter import wrap_logger -from vocode.streaming.utils import create_conversation_id - -TelephonyOutputDeviceType = TypeVar( - "TelephonyOutputDeviceType", bound=Union[TwilioOutputDevice, VonageOutputDevice] -) - - -class Call(StreamingConversation[TelephonyOutputDeviceType]): - def __init__( - self, - from_phone: str, - to_phone: str, - base_url: str, - config_manager: BaseConfigManager, - output_device: TelephonyOutputDeviceType, - agent_config: AgentConfig, - transcriber_config: TranscriberConfig, - synthesizer_config: SynthesizerConfig, - conversation_id: Optional[str] = None, - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), - events_manager: Optional[EventsManager] = None, - logger: Optional[logging.Logger] = None, - ): - conversation_id = conversation_id or create_conversation_id() - logger = wrap_logger( - logger or logging.getLogger(__name__), - conversation_id=conversation_id, - ) - - self.from_phone = from_phone - self.to_phone = to_phone - self.base_url = base_url - self.config_manager = config_manager - super().__init__( - output_device, - transcriber_factory.create_transcriber(transcriber_config, logger=logger), - agent_factory.create_agent(agent_config, logger=logger), - synthesizer_factory.create_synthesizer(synthesizer_config, logger=logger), - conversation_id=conversation_id, - per_chunk_allowance_seconds=0.01, - events_manager=events_manager, - logger=logger, - ) - - def attach_ws(self, ws: WebSocket): - self.logger.debug("Trying to attach WS to outbound call") - self.output_device.ws = ws - self.logger.debug("Attached WS to outbound call") - - async def attach_ws_and_start(self, ws: WebSocket): - raise NotImplementedError - - async def tear_down(self): - self.events_manager.publish_event(PhoneCallEndedEvent(conversation_id=self.id)) - await self.terminate() diff --git a/vocode/streaming/telephony/conversation/mark_message_queue.py b/vocode/streaming/telephony/conversation/mark_message_queue.py new file mode 100644 index 0000000000..c4b17b9319 --- /dev/null +++ b/vocode/streaming/telephony/conversation/mark_message_queue.py @@ -0,0 +1,46 @@ +import asyncio +from typing import Dict, Union + +from pydantic.v1 import BaseModel + + +class ChunkFinishedMarkMessage(BaseModel): + chunk_idx: int + + +class UtteranceFinishedMarkMessage(BaseModel): + pass + + +MarkMessage = Union[ChunkFinishedMarkMessage, UtteranceFinishedMarkMessage] + + +class MarkMessageQueue: + """A keyed asyncio.Queue for MarkMessage objects""" + + def __init__(self): + self.utterance_queues: Dict[str, asyncio.Queue[MarkMessage]] = {} + + def create_utterance_queue(self, utterance_id: str): + if utterance_id in self.utterance_queues: + raise ValueError(f"utterance_id {utterance_id} already exists") + self.utterance_queues[utterance_id] = asyncio.Queue() + + def put_nowait( + self, + utterance_id: str, + mark_message: MarkMessage, + ): + if utterance_id in self.utterance_queues: + self.utterance_queues[utterance_id].put_nowait(mark_message) + + async def get( + self, + utterance_id: str, + ) -> MarkMessage: + if utterance_id not in self.utterance_queues: + raise ValueError(f"utterance_id {utterance_id} not found") + return await self.utterance_queues[utterance_id].get() + + def delete_utterance_queue(self, utterance_id: str): + del self.utterance_queues[utterance_id] diff --git a/vocode/streaming/telephony/conversation/outbound_call.py b/vocode/streaming/telephony/conversation/outbound_call.py index 88bc77ccb5..5570ebdf7e 100644 --- a/vocode/streaming/telephony/conversation/outbound_call.py +++ b/vocode/streaming/telephony/conversation/outbound_call.py @@ -1,27 +1,21 @@ -import logging -from typing import Optional, Union -from vocode import getenv +from typing import Dict, Optional + +from loguru import logger from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.synthesizer import ( - SynthesizerConfig, -) +from vocode.streaming.models.synthesizer import SynthesizerConfig from vocode.streaming.models.telephony import ( + TelephonyConfig, TwilioCallConfig, TwilioConfig, VonageCallConfig, VonageConfig, ) -from vocode.streaming.models.transcriber import ( - TranscriberConfig, -) -from vocode.streaming.telephony.client.base_telephony_client import BaseTelephonyClient +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.telephony.client.abstract_telephony_client import AbstractTelephonyClient from vocode.streaming.telephony.client.twilio_client import TwilioClient from vocode.streaming.telephony.client.vonage_client import VonageClient -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager from vocode.streaming.utils import create_conversation_id @@ -33,13 +27,12 @@ def __init__( from_phone: str, config_manager: BaseConfigManager, agent_config: AgentConfig, - twilio_config: Optional[TwilioConfig] = None, - vonage_config: Optional[VonageConfig] = None, + telephony_config: TelephonyConfig, + telephony_params: Optional[Dict[str, str]] = None, transcriber_config: Optional[TranscriberConfig] = None, synthesizer_config: Optional[SynthesizerConfig] = None, conversation_id: Optional[str] = None, - logger: Optional[logging.Logger] = None, - mobile_only: bool = True, + sentry_tags: Dict[str, str] = {}, digits: Optional[ str ] = None, # Keys to press when the call connects, see send_digits https://www.twilio.com/docs/voice/api/call-resource#create-a-call-resource @@ -47,52 +40,33 @@ def __init__( ): self.base_url = base_url self.to_phone = to_phone - self.digits = digits self.from_phone = from_phone - self.mobile_only = mobile_only self.config_manager = config_manager self.agent_config = agent_config self.conversation_id = conversation_id or create_conversation_id() - self.logger = logger or logging.getLogger(__name__) - self.twilio_config = twilio_config - self.vonage_config = vonage_config - if not self.twilio_config and not self.vonage_config: - self.logger.debug( - "No telephony config provided, defaulting to Twilio env vars" - ) - self.twilio_config = TwilioConfig( - account_sid=getenv("TWILIO_ACCOUNT_SID"), - auth_token=getenv("TWILIO_AUTH_TOKEN"), - ) + self.telephony_config = telephony_config + self.telephony_params = telephony_params or {} self.telephony_client = self.create_telephony_client() - assert not output_to_speaker or isinstance( - self.telephony_client, VonageClient - ), "Output to speaker is only supported for Vonage calls" self.transcriber_config = self.create_transcriber_config(transcriber_config) self.synthesizer_config = self.create_synthesizer_config(synthesizer_config) - self.telephony_id = None self.output_to_speaker = output_to_speaker + self.sentry_tags = sentry_tags + self.digits = digits - def create_telephony_client(self) -> BaseTelephonyClient: - if self.twilio_config is not None: - return TwilioClient( - base_url=self.base_url, twilio_config=self.twilio_config - ) - elif self.vonage_config is not None: - return VonageClient( - base_url=self.base_url, vonage_config=self.vonage_config - ) - else: - raise ValueError("No telephony config provided") + def create_telephony_client(self) -> AbstractTelephonyClient: + if isinstance(self.telephony_config, TwilioConfig): + return TwilioClient(base_url=self.base_url, maybe_twilio_config=self.telephony_config) + elif isinstance(self.telephony_config, VonageConfig): + return VonageClient(base_url=self.base_url, maybe_vonage_config=self.telephony_config) def create_transcriber_config( self, transcriber_config_override: Optional[TranscriberConfig] ) -> TranscriberConfig: if transcriber_config_override is not None: return transcriber_config_override - if self.twilio_config is not None: + if isinstance(self.telephony_config, TwilioConfig): return TwilioCallConfig.default_transcriber_config() - elif self.vonage_config is not None: + elif isinstance(self.telephony_config, VonageConfig): return VonageCallConfig.default_transcriber_config() else: raise ValueError("No telephony config provided") @@ -102,25 +76,21 @@ def create_synthesizer_config( ) -> SynthesizerConfig: if synthesizer_config_override is not None: return synthesizer_config_override - if self.twilio_config is not None: + if isinstance(self.telephony_config, TwilioConfig): return TwilioCallConfig.default_synthesizer_config() - elif self.vonage_config is not None: + elif isinstance(self.telephony_config, VonageConfig): return VonageCallConfig.default_synthesizer_config() else: raise ValueError("No telephony config provided") async def start(self): - self.logger.debug("Starting outbound call") - self.telephony_client.validate_outbound_call( - to_phone=self.to_phone, - from_phone=self.from_phone, - mobile_only=self.mobile_only, - ) + logger.debug("Starting outbound call") self.telephony_id = await self.telephony_client.create_call( conversation_id=self.conversation_id, to_phone=self.to_phone, from_phone=self.from_phone, - record=self.telephony_client.get_telephony_config().record, + record=self.telephony_client.get_telephony_config().record, # note twilio does not use this + telephony_params=self.telephony_params, digits=self.digits, ) if isinstance(self.telephony_client, TwilioClient): @@ -132,6 +102,9 @@ async def start(self): twilio_sid=self.telephony_id, from_phone=self.from_phone, to_phone=self.to_phone, + sentry_tags=self.sentry_tags, + telephony_params=self.telephony_params, + direction="outbound", ) elif isinstance(self.telephony_client, VonageClient): call_config = VonageCallConfig( @@ -142,7 +115,10 @@ async def start(self): vonage_uuid=self.telephony_id, from_phone=self.from_phone, to_phone=self.to_phone, - output_to_speaker=self.output_to_speaker, + output_to_speaker=False, + sentry_tags=self.sentry_tags, + telephony_params=self.telephony_params, + direction="outbound", ) else: raise ValueError("Unknown telephony client") diff --git a/vocode/streaming/telephony/conversation/twilio_call.py b/vocode/streaming/telephony/conversation/twilio_call.py deleted file mode 100644 index 6d436f30bd..0000000000 --- a/vocode/streaming/telephony/conversation/twilio_call.py +++ /dev/null @@ -1,161 +0,0 @@ -import asyncio -from fastapi import WebSocket -import base64 -from enum import Enum -import json -import logging -from typing import Optional -from vocode import getenv -from vocode.streaming.agent.factory import AgentFactory -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.events import PhoneCallConnectedEvent - -from vocode.streaming.models.telephony import TwilioConfig -from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice -from vocode.streaming.models.synthesizer import ( - SynthesizerConfig, -) -from vocode.streaming.models.transcriber import ( - TranscriberConfig, -) -from vocode.streaming.synthesizer.factory import SynthesizerFactory -from vocode.streaming.telephony.client.twilio_client import TwilioClient -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) -from vocode.streaming.telephony.conversation.call import Call -from vocode.streaming.transcriber.factory import TranscriberFactory -from vocode.streaming.utils.events_manager import EventsManager -from vocode.streaming.utils.state_manager import TwilioCallStateManager - - -class PhoneCallWebsocketAction(Enum): - CLOSE_WEBSOCKET = 1 - - -class TwilioCall(Call[TwilioOutputDevice]): - def __init__( - self, - from_phone: str, - to_phone: str, - base_url: str, - config_manager: BaseConfigManager, - agent_config: AgentConfig, - transcriber_config: TranscriberConfig, - synthesizer_config: SynthesizerConfig, - twilio_sid: str, - twilio_config: Optional[TwilioConfig] = None, - conversation_id: Optional[str] = None, - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), - events_manager: Optional[EventsManager] = None, - logger: Optional[logging.Logger] = None, - ): - super().__init__( - from_phone, - to_phone, - base_url, - config_manager, - TwilioOutputDevice(), - agent_config, - transcriber_config, - synthesizer_config, - conversation_id=conversation_id, - events_manager=events_manager, - transcriber_factory=transcriber_factory, - agent_factory=agent_factory, - synthesizer_factory=synthesizer_factory, - logger=logger, - ) - self.base_url = base_url - self.config_manager = config_manager - self.twilio_config = twilio_config or TwilioConfig( - account_sid=getenv("TWILIO_ACCOUNT_SID"), - auth_token=getenv("TWILIO_AUTH_TOKEN"), - ) - self.telephony_client = TwilioClient( - base_url=base_url, twilio_config=self.twilio_config - ) - self.twilio_sid = twilio_sid - self.latest_media_timestamp = 0 - - def create_state_manager(self) -> TwilioCallStateManager: - return TwilioCallStateManager(self) - - async def attach_ws_and_start(self, ws: WebSocket): - super().attach_ws(ws) - - twilio_call_ref = self.telephony_client.twilio_client.calls(self.twilio_sid) - twilio_call = twilio_call_ref.fetch() - - if self.twilio_config.record: - recordings_create_params = ( - self.twilio_config.extra_params.get("recordings_create_params") - if self.twilio_config.extra_params - else None - ) - recording = ( - twilio_call_ref.recordings.create(**recordings_create_params) - if recordings_create_params - else twilio_call_ref.recordings.create() - ) - self.logger.info(f"Recording: {recording.sid}") - - if twilio_call.answered_by in ("machine_start", "fax"): - self.logger.info(f"Call answered by {twilio_call.answered_by}") - twilio_call.update(status="completed") - else: - await self.wait_for_twilio_start(ws) - await super().start() - self.events_manager.publish_event( - PhoneCallConnectedEvent( - conversation_id=self.id, - to_phone_number=self.to_phone, - from_phone_number=self.from_phone, - ) - ) - while self.active: - message = await ws.receive_text() - response = await self.handle_ws_message(message) - if response == PhoneCallWebsocketAction.CLOSE_WEBSOCKET: - break - await self.config_manager.delete_config(self.id) - await self.tear_down() - - async def wait_for_twilio_start(self, ws: WebSocket): - assert isinstance(self.output_device, TwilioOutputDevice) - while True: - message = await ws.receive_text() - if not message: - continue - data = json.loads(message) - if data["event"] == "start": - self.logger.debug( - f"Media WS: Received event '{data['event']}': {message}" - ) - self.output_device.stream_sid = data["start"]["streamSid"] - break - - async def handle_ws_message(self, message) -> Optional[PhoneCallWebsocketAction]: - if message is None: - return PhoneCallWebsocketAction.CLOSE_WEBSOCKET - - data = json.loads(message) - if data["event"] == "media": - media = data["media"] - chunk = base64.b64decode(media["payload"]) - if self.latest_media_timestamp + 20 < int(media["timestamp"]): - bytes_to_fill = 8 * ( - int(media["timestamp"]) - (self.latest_media_timestamp + 20) - ) - self.logger.debug(f"Filling {bytes_to_fill} bytes of silence") - # NOTE: 0xff is silence for mulaw audio - self.receive_audio(b"\xff" * bytes_to_fill) - self.latest_media_timestamp = int(media["timestamp"]) - self.receive_audio(chunk) - elif data["event"] == "stop": - self.logger.debug(f"Media WS: Received event 'stop': {message}") - self.logger.debug("Stopping...") - return PhoneCallWebsocketAction.CLOSE_WEBSOCKET - return None diff --git a/vocode/streaming/telephony/conversation/twilio_phone_conversation.py b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py new file mode 100644 index 0000000000..6145d53b05 --- /dev/null +++ b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py @@ -0,0 +1,274 @@ +import asyncio +import base64 +import json +import os +import threading +from enum import Enum +from typing import AsyncGenerator, Optional + +from fastapi import WebSocket +from loguru import logger + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.models.agent import AgentConfig +from vocode.streaming.models.events import PhoneCallConnectedEvent +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.models.telephony import PhoneCallDirection, TwilioConfig +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.models.transcript import Message +from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult +from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer +from vocode.streaming.telephony.client.twilio_client import TwilioClient +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.telephony.conversation.abstract_phone_conversation import ( + AbstractPhoneConversation, +) +from vocode.streaming.telephony.conversation.mark_message_queue import ( + ChunkFinishedMarkMessage, + MarkMessage, + MarkMessageQueue, + UtteranceFinishedMarkMessage, +) +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory +from vocode.streaming.utils import create_utterance_id +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.events_manager import EventsManager +from vocode.streaming.utils.state_manager import TwilioPhoneConversationStateManager + + +class TwilioPhoneConversationWebsocketAction(Enum): + CLOSE_WEBSOCKET = 1 + + +class TwilioPhoneConversation(AbstractPhoneConversation[TwilioOutputDevice]): + telephony_provider = "twilio" + + def __init__( + self, + direction: PhoneCallDirection, + from_phone: str, + to_phone: str, + base_url: str, + config_manager: BaseConfigManager, + agent_config: AgentConfig, + transcriber_config: TranscriberConfig, + synthesizer_config: SynthesizerConfig, + twilio_sid: str, + agent_factory: AbstractAgentFactory, + transcriber_factory: AbstractTranscriberFactory, + synthesizer_factory: AbstractSynthesizerFactory, + twilio_config: Optional[TwilioConfig] = None, + conversation_id: Optional[str] = None, + events_manager: Optional[EventsManager] = None, + record_call: bool = False, + speed_coefficient: float = 1.0, + noise_suppression: bool = False, # is currently a no-op + ): + super().__init__( + direction=direction, + from_phone=from_phone, + to_phone=to_phone, + base_url=base_url, + config_manager=config_manager, + output_device=TwilioOutputDevice(), + agent_config=agent_config, + transcriber_config=transcriber_config, + synthesizer_config=synthesizer_config, + conversation_id=conversation_id, + events_manager=events_manager, + transcriber_factory=transcriber_factory, + agent_factory=agent_factory, + synthesizer_factory=synthesizer_factory, + speed_coefficient=speed_coefficient, + ) + self.mark_message_queue: MarkMessageQueue = MarkMessageQueue() + self.config_manager = config_manager + self.twilio_config = twilio_config or TwilioConfig( + account_sid=os.environ["TWILIO_ACCOUNT_SID"], + auth_token=os.environ["TWILIO_AUTH_TOKEN"], + ) + self.telephony_client = TwilioClient( + base_url=self.base_url, maybe_twilio_config=self.twilio_config + ) + self.twilio_sid = twilio_sid + self.record_call = record_call + + def create_state_manager(self) -> TwilioPhoneConversationStateManager: + return TwilioPhoneConversationStateManager(self) + + async def attach_ws_and_start(self, ws: WebSocket): + super().attach_ws(ws) + + await self._wait_for_twilio_start(ws) + await self.start() + self.events_manager.publish_event( + PhoneCallConnectedEvent( + conversation_id=self.id, + to_phone_number=self.to_phone, + from_phone_number=self.from_phone, + ) + ) + while self.active: + message = await ws.receive_text() + response = await self._handle_ws_message(message) + if response == TwilioPhoneConversationWebsocketAction.CLOSE_WEBSOCKET: + break + await ws.close(code=1000, reason=None) + await self.terminate() + + async def _wait_for_twilio_start(self, ws: WebSocket): + assert isinstance(self.output_device, TwilioOutputDevice) + while True: + message = await ws.receive_text() + if not message: + continue + data = json.loads(message) + if data["event"] == "start": + logger.debug(f"Media WS: Received event '{data['event']}': {message}") + self.output_device.stream_sid = data["start"]["streamSid"] + break + + async def _handle_ws_message(self, message) -> Optional[TwilioPhoneConversationWebsocketAction]: + if message is None: + return TwilioPhoneConversationWebsocketAction.CLOSE_WEBSOCKET + + data = json.loads(message) + if data["event"] == "media": + media = data["media"] + chunk = base64.b64decode(media["payload"]) + self.receive_audio(chunk) + if data["event"] == "mark": + mark_name = data["mark"]["name"] + if mark_name.startswith("chunk-"): + utterance_id, chunk_idx = mark_name.split("-")[1:] + self.mark_message_queue.put_nowait( + utterance_id=utterance_id, + mark_message=ChunkFinishedMarkMessage(chunk_idx=int(chunk_idx)), + ) + elif mark_name.startswith("utterance"): + utterance_id = mark_name.split("-")[1] + self.mark_message_queue.put_nowait( + utterance_id=utterance_id, + mark_message=UtteranceFinishedMarkMessage(), + ) + elif data["event"] == "stop": + logger.debug(f"Media WS: Received event 'stop': {message}") + logger.debug("Stopping...") + return TwilioPhoneConversationWebsocketAction.CLOSE_WEBSOCKET + return None + + async def _send_chunks( + self, + utterance_id: str, + chunk_generator: AsyncGenerator[SynthesisResult.ChunkResult, None], + clear_message_lock: asyncio.Lock, + stop_event: threading.Event, + ): + chunk_idx = 0 + try: + async for chunk_result in chunk_generator: + async with clear_message_lock: + if stop_event.is_set(): + break + self.output_device.consume_nonblocking(chunk_result.chunk) + self.output_device.send_chunk_finished_mark(utterance_id, chunk_idx) + chunk_idx += 1 + except asyncio.CancelledError: + pass + finally: + logger.debug("Finished sending all chunks to Twilio") + self.output_device.send_utterance_finished_mark(utterance_id) + + async def send_speech_to_output( + self, + message: str, + synthesis_result: SynthesisResult, + stop_event: threading.Event, + seconds_per_chunk: float, + transcript_message: Optional[Message] = None, + started_event: Optional[threading.Event] = None, + ): + """In contrast with send_speech_to_output in the base class, this function uses mark messages + to support interruption - we send all chunks to the output device, and then wait for mark messages[0] + that indicate that each chunk has been played. This means that we don't need to depends on asyncio.sleep + to support interruptions. + + Once we receive an interruption signal: + - we send a clear message to Twilio to stop playing all queued audio + - based on the number of mark messages we've received back, we know how many chunks were played and can indicate on the transcript + + [0] https://www.twilio.com/docs/voice/twiml/stream#websocket-messages-to-twilio + """ + + if self.transcriber.get_transcriber_config().mute_during_speech: + logger.debug("Muting transcriber") + self.transcriber.mute() + message_sent = message + cut_off = False + chunk_idx = 0 + seconds_spoken = 0.0 + logger.debug(f"Start sending speech {message} to output") + + utterance_id = create_utterance_id() + self.mark_message_queue.create_utterance_queue(utterance_id) + + first_chunk_span = self._maybe_create_first_chunk_span(synthesis_result, message) + + clear_message_lock = asyncio.Lock() + + asyncio_create_task_with_done_error_log( + self._send_chunks( + utterance_id, + synthesis_result.chunk_generator, + clear_message_lock, + stop_event, + ), + ) + mark_event: MarkMessage + first = True + while True: + mark_event = await self.mark_message_queue.get(utterance_id) + if isinstance(mark_event, UtteranceFinishedMarkMessage): + break + if first and first_chunk_span: + self._track_first_chunk(first_chunk_span, synthesis_result) + first = False + seconds_spoken = mark_event.chunk_idx * seconds_per_chunk + # Lock here so that we check the stop event and send the clear message atomically + # w.r.t. the _send_chunks task which also checks the stop event + # Otherwise, we could send the clear message while _send_chunks is in the middle of sending a chunk + # and the synthesis wouldn't be cleared + async with clear_message_lock: + if stop_event.is_set(): + self.output_device.send_clear_message() + logger.debug( + "Interrupted, stopping text to speech after {} chunks".format(chunk_idx) + ) + message_sent = synthesis_result.get_message_up_to(seconds_spoken) + cut_off = True + break + if chunk_idx == 0: + if started_event: + started_event.set() + self.mark_last_action_timestamp() + chunk_idx += 1 + seconds_spoken += seconds_per_chunk + if transcript_message: + transcript_message.text = synthesis_result.get_message_up_to(seconds_spoken) + self.mark_message_queue.delete_utterance_queue(utterance_id) + if self.transcriber.get_transcriber_config().mute_during_speech: + logger.debug("Unmuting transcriber") + self.transcriber.unmute() + if transcript_message: + # For input streaming synthesizers, we have to buffer the message as it is streamed in + # What is said is federated fully by synthesis_result.get_message_up_to + if isinstance(self.synthesizer, InputStreamingSynthesizer): + message_sent = transcript_message.text + else: + transcript_message.text = message_sent + transcript_message.is_final = not cut_off + if synthesis_result.synthesis_total_span: + synthesis_result.synthesis_total_span.finish() + return message_sent, cut_off diff --git a/vocode/streaming/telephony/conversation/vonage_call.py b/vocode/streaming/telephony/conversation/vonage_call.py deleted file mode 100644 index 251c39950e..0000000000 --- a/vocode/streaming/telephony/conversation/vonage_call.py +++ /dev/null @@ -1,131 +0,0 @@ -from fastapi import WebSocket, WebSocketDisconnect -import logging -from typing import Optional -from vocode import getenv -from vocode.streaming.agent.factory import AgentFactory -from vocode.streaming.models.agent import AgentConfig -from vocode.streaming.models.events import PhoneCallConnectedEvent, PhoneCallEndedEvent -from vocode.streaming.output_device.vonage_output_device import VonageOutputDevice - -from vocode.streaming.models.telephony import VonageConfig -from vocode.streaming.models.synthesizer import ( - SynthesizerConfig, -) -from vocode.streaming.models.transcriber import ( - TranscriberConfig, -) -from vocode.streaming.synthesizer.factory import SynthesizerFactory -from vocode.streaming.telephony.client.vonage_client import VonageClient -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) -from vocode.streaming.telephony.conversation.call import Call -from vocode.streaming.transcriber.factory import TranscriberFactory -from vocode.streaming.utils.events_manager import EventsManager - -from vocode.streaming.output_device.speaker_output import SpeakerOutput -from vocode.streaming.telephony.constants import VONAGE_CHUNK_SIZE, VONAGE_SAMPLING_RATE -from vocode.streaming.utils.state_manager import ( - ConversationStateManager, - VonageCallStateManager, -) - - -class VonageCall(Call[VonageOutputDevice]): - def __init__( - self, - from_phone: str, - to_phone: str, - base_url: str, - config_manager: BaseConfigManager, - agent_config: AgentConfig, - transcriber_config: TranscriberConfig, - synthesizer_config: SynthesizerConfig, - vonage_uuid: str, - vonage_config: Optional[VonageConfig] = None, - conversation_id: Optional[str] = None, - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), - events_manager: Optional[EventsManager] = None, - output_to_speaker: bool = False, - logger: Optional[logging.Logger] = None, - ): - super().__init__( - from_phone, - to_phone, - base_url, - config_manager, - VonageOutputDevice(output_to_speaker=output_to_speaker), - agent_config, - transcriber_config, - synthesizer_config, - conversation_id=conversation_id, - events_manager=events_manager, - transcriber_factory=transcriber_factory, - agent_factory=agent_factory, - synthesizer_factory=synthesizer_factory, - logger=logger, - ) - self.output_to_speaker = output_to_speaker - self.base_url = base_url - self.config_manager = config_manager - self.vonage_config = vonage_config or VonageConfig( - api_key=getenv("VONAGE_API_KEY"), - api_secret=getenv("VONAGE_API_SECRET"), - application_id=getenv("VONAGE_APPLICATION_ID"), - private_key=getenv("VONAGE_PRIVATE_KEY"), - ) - self.telephony_client = VonageClient( - base_url=base_url, vonage_config=self.vonage_config - ) - self.vonage_uuid = vonage_uuid - if output_to_speaker: - self.output_speaker = SpeakerOutput.from_default_device( - sampling_rate=VONAGE_SAMPLING_RATE, blocksize=VONAGE_CHUNK_SIZE // 2 - ) - - def create_state_manager(self) -> VonageCallStateManager: - return VonageCallStateManager(self) - - # TODO(EPD-186) - make this function async and use aiohttp with the vonage client - def send_dtmf(self, digits: str): - self.telephony_client.voice.send_dtmf(self.vonage_uuid, {"digits": digits}) - - async def attach_ws_and_start(self, ws: WebSocket): - # start message - await ws.receive() - self.logger.debug("Trying to attach WS to outbound call") - self.output_device.ws = ws - self.logger.debug("Attached WS to outbound call") - - await super().start() - self.events_manager.publish_event( - PhoneCallConnectedEvent( - conversation_id=self.id, - to_phone_number=self.to_phone, - from_phone_number=self.from_phone, - ) - ) - disconnected = False - while self.active: - try: - chunk = await ws.receive_bytes() - self.receive_audio(chunk) - except WebSocketDisconnect: - self.logger.debug("Websocket disconnected") - disconnected = True - break - if not disconnected: - await ws.close() - await self.config_manager.delete_config(self.id) - await self.tear_down() - - def receive_audio(self, chunk: bytes): - super().receive_audio(chunk) - if self.output_to_speaker: - self.output_speaker.consume_nonblocking(chunk) - - async def tear_down(self): - self.events_manager.publish_event(PhoneCallEndedEvent(conversation_id=self.id)) - await self.terminate() diff --git a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py new file mode 100644 index 0000000000..65adc73f4a --- /dev/null +++ b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py @@ -0,0 +1,139 @@ +import os +from typing import Optional + +import numpy as np +import pvkoala +from fastapi import WebSocket, WebSocketDisconnect +from loguru import logger + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.models.agent import AgentConfig +from vocode.streaming.models.events import PhoneCallConnectedEvent +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.models.telephony import PhoneCallDirection, VonageConfig +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.output_device.vonage_output_device import VonageOutputDevice +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.telephony.client.vonage_client import VonageClient +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.telephony.conversation.abstract_phone_conversation import ( + AbstractPhoneConversation, +) +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory +from vocode.streaming.utils.events_manager import EventsManager +from vocode.streaming.utils.state_manager import VonagePhoneConversationStateManager + +KOALA_CHUNK_SIZE = 512 # 16 bit samples, size 256 + + +class VonagePhoneConversation(AbstractPhoneConversation[VonageOutputDevice]): + telephony_provider = "vonage" + + def __init__( + self, + direction: PhoneCallDirection, + from_phone: str, + to_phone: str, + base_url: str, + config_manager: BaseConfigManager, + agent_config: AgentConfig, + transcriber_config: TranscriberConfig, + synthesizer_config: SynthesizerConfig, + vonage_uuid: str, + vonage_config: VonageConfig, + agent_factory: AbstractAgentFactory, + transcriber_factory: AbstractTranscriberFactory, + synthesizer_factory: AbstractSynthesizerFactory, + conversation_id: Optional[str] = None, + events_manager: Optional[EventsManager] = None, + output_to_speaker: bool = False, + speed_coefficient: float = 1.0, + per_chunk_allowance_seconds: float = 0.01, + noise_suppression: bool = False, + ): + self.speed_coefficient = speed_coefficient + super().__init__( + direction=direction, + speed_coefficient=speed_coefficient, + from_phone=from_phone, + to_phone=to_phone, + base_url=base_url, + config_manager=config_manager, + output_device=VonageOutputDevice(output_to_speaker=output_to_speaker), + agent_config=agent_config, + transcriber_config=transcriber_config, + synthesizer_config=synthesizer_config, + conversation_id=conversation_id, + events_manager=events_manager, + transcriber_factory=transcriber_factory, + agent_factory=agent_factory, + synthesizer_factory=synthesizer_factory, + per_chunk_allowance_seconds=per_chunk_allowance_seconds, + ) + self.vonage_config = vonage_config + self.telephony_client = VonageClient( + base_url=self.base_url, + maybe_vonage_config=self.vonage_config, + ) + self.vonage_uuid = vonage_uuid + self.noise_suppression = noise_suppression + if self.noise_suppression: + logger.info("Using PV koala noise suppression") + self.buffer = bytearray() + self.koala = pvkoala.create( + access_key=os.environ["KOALA_ACCESS_KEY"], + ) + + def create_state_manager(self) -> VonagePhoneConversationStateManager: + return VonagePhoneConversationStateManager(self) + + async def attach_ws_and_start(self, ws: WebSocket): + # start message + await ws.receive() + super().attach_ws(ws) + + await self.start() + self.events_manager.publish_event( + PhoneCallConnectedEvent( + conversation_id=self.id, + to_phone_number=self.to_phone, + from_phone_number=self.from_phone, + ) + ) + disconnected = False + while self.active: + try: + message = await ws.receive() + if message["type"] == "websocket.disconnect": + raise WebSocketDisconnect(message["code"]) + if "bytes" in message: + chunk = message["bytes"] + self.receive_audio(chunk) + else: + logger.debug(f"Received non-bytes message: {message}") + except WebSocketDisconnect as e: + logger.debug("Websocket disconnected") + if e.code != 1000: + logger.error(f"Websocket disconnected abnormally with code {e.code} {e.reason}") + disconnected = True + break + await self.terminate() + if not disconnected: + await ws.close() + + def receive_audio(self, chunk: bytes): + if self.noise_suppression: + self.buffer.extend(chunk) + + while len(self.buffer) >= KOALA_CHUNK_SIZE: + koala_chunk = np.frombuffer(self.buffer[:KOALA_CHUNK_SIZE], dtype=np.int16) + try: + denoised_chunk = np.array( + self.koala.process(koala_chunk), dtype=np.int16 + ).tobytes() + except Exception: + denoised_chunk = koala_chunk.tobytes() + super().receive_audio(denoised_chunk) + self.buffer = self.buffer[KOALA_CHUNK_SIZE:] + else: + super().receive_audio(chunk) diff --git a/vocode/streaming/telephony/conversation/zoom_dial_in.py b/vocode/streaming/telephony/conversation/zoom_dial_in.py index 5b29584c12..0e497b555c 100644 --- a/vocode/streaming/telephony/conversation/zoom_dial_in.py +++ b/vocode/streaming/telephony/conversation/zoom_dial_in.py @@ -1,12 +1,10 @@ -import logging from typing import Optional + from vocode.streaming.models.agent import AgentConfig from vocode.streaming.models.synthesizer import SynthesizerConfig from vocode.streaming.models.telephony import TwilioConfig from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager from vocode.streaming.telephony.conversation.outbound_call import OutboundCall @@ -20,11 +18,10 @@ def __init__( from_phone: str, config_manager: BaseConfigManager, agent_config: AgentConfig, + twilio_config: TwilioConfig, transcriber_config: Optional[TranscriberConfig] = None, synthesizer_config: Optional[SynthesizerConfig] = None, - twilio_config: Optional[TwilioConfig] = None, conversation_id: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): digits = f"wwww{zoom_meeting_id}#" if zoom_meeting_password: @@ -38,10 +35,8 @@ def __init__( transcriber_config=transcriber_config, agent_config=agent_config, synthesizer_config=synthesizer_config, - twilio_config=twilio_config, + telephony_config=twilio_config, conversation_id=conversation_id, - logger=logger, - mobile_only=False, digits=digits, ) diff --git a/vocode/streaming/telephony/server/base.py b/vocode/streaming/telephony/server/base.py index 10c2b365ac..5e04c3c05c 100644 --- a/vocode/streaming/telephony/server/base.py +++ b/vocode/streaming/telephony/server/base.py @@ -1,40 +1,33 @@ import abc from functools import partial -import logging from typing import List, Optional + from fastapi import APIRouter, Form, Request, Response +from loguru import logger from pydantic.v1 import BaseModel, Field -from vocode.streaming.agent.factory import AgentFactory + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.agent.default_factory import DefaultAgentFactory from vocode.streaming.models.agent import AgentConfig from vocode.streaming.models.events import RecordingEvent from vocode.streaming.models.synthesizer import SynthesizerConfig -from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.synthesizer.factory import SynthesizerFactory -from vocode.streaming.telephony.client.base_telephony_client import BaseTelephonyClient -from vocode.streaming.telephony.client.twilio_client import TwilioClient -from vocode.streaming.telephony.client.vonage_client import VonageClient -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, -) -from vocode.streaming.telephony.constants import ( - DEFAULT_AUDIO_ENCODING, - DEFAULT_CHUNK_SIZE, - DEFAULT_SAMPLING_RATE, - VONAGE_AUDIO_ENCODING, - VONAGE_SAMPLING_RATE, -) - -from vocode.streaming.telephony.server.router.calls import CallsRouter from vocode.streaming.models.telephony import ( TwilioCallConfig, TwilioConfig, VonageCallConfig, VonageConfig, ) - -from vocode.streaming.telephony.templater import Templater -from vocode.streaming.transcriber.base_transcriber import BaseTranscriber -from vocode.streaming.transcriber.factory import TranscriberFactory +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.synthesizer.default_factory import DefaultSynthesizerFactory +from vocode.streaming.telephony.client.abstract_telephony_client import AbstractTelephonyClient +from vocode.streaming.telephony.client.twilio_client import TwilioClient +from vocode.streaming.telephony.client.vonage_client import VonageClient +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.telephony.server.router.calls import CallsRouter +from vocode.streaming.telephony.templater import get_connection_twiml +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory +from vocode.streaming.transcriber.default_factory import DefaultTranscriberFactory from vocode.streaming.utils import create_conversation_id from vocode.streaming.utils.events_manager import EventsManager @@ -66,17 +59,14 @@ def __init__( base_url: str, config_manager: BaseConfigManager, inbound_call_configs: List[AbstractInboundCallConfig] = [], - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), + transcriber_factory: AbstractTranscriberFactory = DefaultTranscriberFactory(), + agent_factory: AbstractAgentFactory = DefaultAgentFactory(), + synthesizer_factory: AbstractSynthesizerFactory = DefaultSynthesizerFactory(), events_manager: Optional[EventsManager] = None, - logger: Optional[logging.Logger] = None, ): self.base_url = base_url - self.logger = logger or logging.getLogger(__name__) self.router = APIRouter() self.config_manager = config_manager - self.templater = Templater() self.events_manager = events_manager self.router.include_router( CallsRouter( @@ -86,7 +76,6 @@ def __init__( agent_factory=agent_factory, synthesizer_factory=synthesizer_factory, events_manager=self.events_manager, - logger=self.logger, ).get_router() ) for config in inbound_call_configs: @@ -97,12 +86,12 @@ def __init__( ) # vonage requires an events endpoint self.router.add_api_route("/events", self.events, methods=["GET", "POST"]) - self.logger.info(f"Set up events endpoint at https://{self.base_url}/events") + logger.info(f"Set up events endpoint at https://{self.base_url}/events") self.router.add_api_route( "/recordings/{conversation_id}", self.recordings, methods=["GET", "POST"] ) - self.logger.info( + logger.info( f"Set up recordings endpoint at https://{self.base_url}/recordings/{{conversation_id}}" ) @@ -113,9 +102,7 @@ async def recordings(self, request: Request, conversation_id: str): recording_url = (await request.json())["recording_url"] if self.events_manager is not None and recording_url is not None: self.events_manager.publish_event( - RecordingEvent( - recording_url=recording_url, conversation_id=conversation_id - ) + RecordingEvent(recording_url=recording_url, conversation_id=conversation_id) ) return Response() @@ -139,17 +126,15 @@ async def twilio_route( twilio_sid=twilio_sid, from_phone=twilio_from, to_phone=twilio_to, + direction="inbound", ) conversation_id = create_conversation_id() await self.config_manager.save_config(conversation_id, call_config) - return self.templater.get_connection_twiml( - base_url=self.base_url, call_id=conversation_id - ) + return get_connection_twiml(base_url=self.base_url, call_id=conversation_id) - async def vonage_route( - vonage_config: VonageConfig, vonage_answer_request: VonageAnswerRequest - ): + async def vonage_route(vonage_config: VonageConfig, request: Request): + vonage_answer_request = VonageAnswerRequest.parse_obj(await request.json()) call_config = VonageCallConfig( transcriber_config=inbound_call_config.transcriber_config or VonageCallConfig.default_transcriber_config(), @@ -160,44 +145,47 @@ async def vonage_route( vonage_uuid=vonage_answer_request.uuid, to_phone=vonage_answer_request.from_, from_phone=vonage_answer_request.to, + direction="inbound", ) conversation_id = create_conversation_id() await self.config_manager.save_config(conversation_id, call_config) - return VonageClient.create_call_ncco( + vonage_client = VonageClient( base_url=self.base_url, + maybe_vonage_config=vonage_config, + record_calls=vonage_config.record, + ) + return vonage_client.create_call_ncco( conversation_id=conversation_id, record=vonage_config.record, ) if isinstance(inbound_call_config, TwilioInboundCallConfig): - self.logger.info( + logger.info( f"Set up inbound call TwiML at https://{self.base_url}{inbound_call_config.url}" ) return partial(twilio_route, inbound_call_config.twilio_config) elif isinstance(inbound_call_config, VonageInboundCallConfig): - self.logger.info( + logger.info( f"Set up inbound call NCCO at https://{self.base_url}{inbound_call_config.url}" ) return partial(vonage_route, inbound_call_config.vonage_config) else: - raise ValueError( - f"Unknown inbound call config type {type(inbound_call_config)}" - ) + raise ValueError(f"Unknown inbound call config type {type(inbound_call_config)}") async def end_outbound_call(self, conversation_id: str): # TODO validation via twilio_client call_config = await self.config_manager.get_config(conversation_id) if not call_config: raise ValueError(f"Could not find call config for {conversation_id}") - telephony_client: BaseTelephonyClient + telephony_client: AbstractTelephonyClient if isinstance(call_config, TwilioCallConfig): telephony_client = TwilioClient( - base_url=self.base_url, twilio_config=call_config.twilio_config + base_url=self.base_url, maybe_twilio_config=call_config.twilio_config ) await telephony_client.end_call(call_config.twilio_sid) elif isinstance(call_config, VonageCallConfig): telephony_client = VonageClient( - base_url=self.base_url, vonage_config=call_config.vonage_config + base_url=self.base_url, maybe_vonage_config=call_config.vonage_config ) await telephony_client.end_call(call_config.vonage_uuid) return {"id": conversation_id} diff --git a/vocode/streaming/telephony/server/router/calls.py b/vocode/streaming/telephony/server/router/calls.py index f62338531a..486b697a3b 100644 --- a/vocode/streaming/telephony/server/router/calls.py +++ b/vocode/streaming/telephony/server/router/calls.py @@ -1,22 +1,25 @@ from typing import Optional -import logging from fastapi import APIRouter, HTTPException, WebSocket -from vocode.streaming.agent.factory import AgentFactory -from vocode.streaming.models.telephony import ( - BaseCallConfig, - TwilioCallConfig, - VonageCallConfig, +from loguru import logger + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.agent.default_factory import DefaultAgentFactory +from vocode.streaming.models.telephony import BaseCallConfig, TwilioCallConfig, VonageCallConfig +from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory +from vocode.streaming.synthesizer.default_factory import DefaultSynthesizerFactory +from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager +from vocode.streaming.telephony.conversation.abstract_phone_conversation import ( + AbstractPhoneConversation, ) -from vocode.streaming.synthesizer.factory import SynthesizerFactory -from vocode.streaming.telephony.config_manager.base_config_manager import ( - BaseConfigManager, +from vocode.streaming.telephony.conversation.twilio_phone_conversation import ( + TwilioPhoneConversation, ) - -from vocode.streaming.telephony.conversation.call import Call -from vocode.streaming.telephony.conversation.twilio_call import TwilioCall -from vocode.streaming.telephony.conversation.vonage_call import VonageCall -from vocode.streaming.transcriber.factory import TranscriberFactory +from vocode.streaming.telephony.conversation.vonage_phone_conversation import ( + VonagePhoneConversation, +) +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory +from vocode.streaming.transcriber.default_factory import DefaultTranscriberFactory from vocode.streaming.utils.base_router import BaseRouter from vocode.streaming.utils.events_manager import EventsManager @@ -26,11 +29,10 @@ def __init__( self, base_url: str, config_manager: BaseConfigManager, - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), + transcriber_factory: AbstractTranscriberFactory = DefaultTranscriberFactory(), + agent_factory: AbstractAgentFactory = DefaultAgentFactory(), + synthesizer_factory: AbstractSynthesizerFactory = DefaultSynthesizerFactory(), events_manager: Optional[EventsManager] = None, - logger: Optional[logging.Logger] = None, ): super().__init__() self.base_url = base_url @@ -39,7 +41,6 @@ def __init__( self.agent_factory = agent_factory self.synthesizer_factory = synthesizer_factory self.events_manager = events_manager - self.logger = logger or logging.getLogger(__name__) self.router = APIRouter() self.router.websocket("/connect_call/{id}")(self.connect_call) @@ -49,18 +50,16 @@ def _from_call_config( call_config: BaseCallConfig, config_manager: BaseConfigManager, conversation_id: str, - logger: logging.Logger, - transcriber_factory: TranscriberFactory = TranscriberFactory(), - agent_factory: AgentFactory = AgentFactory(), - synthesizer_factory: SynthesizerFactory = SynthesizerFactory(), + transcriber_factory: AbstractTranscriberFactory = DefaultTranscriberFactory(), + agent_factory: AbstractAgentFactory = DefaultAgentFactory(), + synthesizer_factory: AbstractSynthesizerFactory = DefaultSynthesizerFactory(), events_manager: Optional[EventsManager] = None, - ): + ) -> AbstractPhoneConversation: if isinstance(call_config, TwilioCallConfig): - return TwilioCall( + return TwilioPhoneConversation( to_phone=call_config.to_phone, from_phone=call_config.from_phone, base_url=base_url, - logger=logger, config_manager=config_manager, agent_config=call_config.agent_config, transcriber_config=call_config.transcriber_config, @@ -72,13 +71,13 @@ def _from_call_config( agent_factory=agent_factory, synthesizer_factory=synthesizer_factory, events_manager=events_manager, + direction=call_config.direction, ) elif isinstance(call_config, VonageCallConfig): - return VonageCall( + return VonagePhoneConversation( to_phone=call_config.to_phone, from_phone=call_config.from_phone, base_url=base_url, - logger=logger, config_manager=config_manager, agent_config=call_config.agent_config, transcriber_config=call_config.transcriber_config, @@ -91,18 +90,19 @@ def _from_call_config( synthesizer_factory=synthesizer_factory, events_manager=events_manager, output_to_speaker=call_config.output_to_speaker, + direction=call_config.direction, ) else: raise ValueError(f"Unknown call config type {call_config.type}") async def connect_call(self, websocket: WebSocket, id: str): await websocket.accept() - self.logger.debug("Phone WS connection opened for chat {}".format(id)) + logger.debug("Phone WS connection opened for chat {}".format(id)) call_config = await self.config_manager.get_config(id) if not call_config: raise HTTPException(status_code=400, detail="No active phone call") - call = self._from_call_config( + phone_conversation = self._from_call_config( base_url=self.base_url, call_config=call_config, config_manager=self.config_manager, @@ -111,11 +111,10 @@ async def connect_call(self, websocket: WebSocket, id: str): agent_factory=self.agent_factory, synthesizer_factory=self.synthesizer_factory, events_manager=self.events_manager, - logger=self.logger, ) - await call.attach_ws_and_start(websocket) - self.logger.debug("Phone WS connection closed for chat {}".format(id)) + await phone_conversation.attach_ws_and_start(websocket) + logger.debug("Phone WS connection closed for chat {}".format(id)) def get_router(self) -> APIRouter: return self.router diff --git a/vocode/streaming/telephony/templater.py b/vocode/streaming/telephony/templater.py index e6863f62e5..a7019d2eac 100644 --- a/vocode/streaming/telephony/templater.py +++ b/vocode/streaming/telephony/templater.py @@ -1,20 +1,29 @@ import os -from jinja2 import Environment, FileSystemLoader + from fastapi import Response +from jinja2 import Environment, FileSystemLoader + +DEFAULT_TEMPLATE_ENVIRONMENT = Environment( + loader=FileSystemLoader("%s/templates/" % os.path.dirname(__file__)) +) -class Templater: - def __init__(self): - self.templates = Environment( - loader=FileSystemLoader("%s/templates/" % os.path.dirname(__file__)) - ) +def render_template(template_name: str, template_environment: Environment, **kwargs): + template = template_environment.get_template(template_name) + return template.render(**kwargs) - def render_template(self, template_name: str, **kwargs): - template = self.templates.get_template(template_name) - return template.render(**kwargs) - def get_connection_twiml(self, call_id: str, base_url: str): - return Response( - self.render_template("connect_call.xml", base_url=base_url, id=call_id), - media_type="application/xml", - ) +def get_connection_twiml( + call_id: str, + base_url: str, + template_environment: Environment = DEFAULT_TEMPLATE_ENVIRONMENT, +): + return Response( + render_template( + template_name="twilio_connect_call.xml", + template_environment=template_environment, + base_url=base_url, + id=call_id, + ), + media_type="application/xml", + ) diff --git a/vocode/streaming/telephony/templates/connect_call.xml b/vocode/streaming/telephony/templates/twilio_connect_call.xml similarity index 92% rename from vocode/streaming/telephony/templates/connect_call.xml rename to vocode/streaming/telephony/templates/twilio_connect_call.xml index 036ffe1bb8..75d5036fdc 100644 --- a/vocode/streaming/telephony/templates/connect_call.xml +++ b/vocode/streaming/telephony/templates/twilio_connect_call.xml @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/vocode/streaming/transcriber/__init__.py b/vocode/streaming/transcriber/__init__.py deleted file mode 100644 index 6e2eef40c3..0000000000 --- a/vocode/streaming/transcriber/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from vocode.streaming.transcriber.assembly_ai_transcriber import AssemblyAITranscriber -from vocode.streaming.transcriber.azure_transcriber import AzureTranscriber -from vocode.streaming.transcriber.base_transcriber import BaseTranscriber -from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber -from vocode.streaming.transcriber.google_transcriber import GoogleTranscriber -from vocode.streaming.transcriber.rev_ai_transcriber import RevAITranscriber -from vocode.streaming.transcriber.whisper_cpp_transcriber import WhisperCPPTranscriber diff --git a/vocode/streaming/transcriber/abstract_factory.py b/vocode/streaming/transcriber/abstract_factory.py new file mode 100644 index 0000000000..e89501476f --- /dev/null +++ b/vocode/streaming/transcriber/abstract_factory.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod + +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.transcriber.base_transcriber import ( + BaseAsyncTranscriber, + BaseThreadAsyncTranscriber, +) + + +class AbstractTranscriberFactory(ABC): + @abstractmethod + def create_transcriber( + self, + transcriber_config: TranscriberConfig, + ) -> BaseAsyncTranscriber[TranscriberConfig] | BaseThreadAsyncTranscriber[TranscriberConfig]: + pass diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index 9d18e0a26a..47fa12c361 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -1,54 +1,32 @@ import asyncio +import audioop import json -import logging from typing import Optional -import websockets -import audioop -import numpy as np from urllib.parse import urlencode -from vocode import getenv +import numpy as np +import websockets +from loguru import logger + +from vocode import getenv +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcriber import ( AssemblyAITranscriberConfig, - TimeEndpointingConfig, PunctuationEndpointingConfig, -) -from vocode.streaming.models.websocket import AudioMessage -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, + TimeEndpointingConfig, Transcription, - meter, ) -from vocode.streaming.models.audio_encoding import AudioEncoding - +from vocode.streaming.models.websocket import AudioMessage +from vocode.streaming.transcriber.base_transcriber import BaseAsyncTranscriber ASSEMBLY_AI_URL = "wss://api.assemblyai.com/v2/realtime/ws" -avg_latency_hist = meter.create_histogram( - name="transcriber.assemblyai.avg_latency", - unit="seconds", -) -max_latency_hist = meter.create_histogram( - name="transcriber.assemblyai.max_latency", - unit="seconds", -) -min_latency_hist = meter.create_histogram( - name="transcriber.assemblyai.min_latency", - unit="seconds", -) -duration_hist = meter.create_histogram( - name="transcriber.assemblyai.duration", - unit="seconds", -) - - class AssemblyAITranscriber(BaseAsyncTranscriber[AssemblyAITranscriberConfig]): def __init__( self, transcriber_config: AssemblyAITranscriberConfig, api_key: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) self.api_key = api_key or getenv("ASSEMBLY_AI_API_KEY") @@ -57,7 +35,6 @@ def __init__( "Please set ASSEMBLY_AI_API_KEY environment variable or pass it as a parameter" ) self._ended = False - self.logger = logger or logging.getLogger(__name__) self.buffer = bytearray() self.audio_cursor = 0 @@ -71,8 +48,7 @@ def __init__( self.terminate_msg = json.dumps({"terminate_session": True}) self.end_utterance_silence_threshold_msg = ( None - if self.transcriber_config.end_utterance_silence_threshold_milliseconds - is None + if self.transcriber_config.end_utterance_silence_threshold_milliseconds is None else json.dumps( { "end_utterance_silence_threshold": self.transcriber_config.end_utterance_silence_threshold_milliseconds @@ -109,9 +85,7 @@ def terminate(self): def get_assembly_ai_url(self): url_params = {"sample_rate": self.transcriber_config.sampling_rate} if self.transcriber_config.word_boost: - url_params.update( - {"word_boost": json.dumps(self.transcriber_config.word_boost)} - ) + url_params.update({"word_boost": json.dumps(self.transcriber_config.word_boost)}) return ASSEMBLY_AI_URL + f"?{urlencode(url_params)}" async def process(self): @@ -138,18 +112,13 @@ async def sender(ws): # sends audio to websocket num_channels = 1 sample_width = 2 self.audio_cursor += len(data) / ( - self.transcriber_config.sampling_rate - * num_channels - * sample_width - ) - await ws.send( - json.dumps({"audio_data": AudioMessage.from_bytes(data).data}) + self.transcriber_config.sampling_rate * num_channels * sample_width ) + await ws.send(json.dumps({"audio_data": AudioMessage.from_bytes(data).data})) await ws.send(self.terminate_msg) - self.logger.debug("Terminating AssemblyAI transcriber sender") + logger.debug("Terminating AssemblyAI transcriber sender") async def receiver(ws): - transcript_cursor = 0.0 while not self._ended: try: result_str = await ws.recv() @@ -157,30 +126,13 @@ async def receiver(ws): if "error" in data and data["error"]: raise Exception(data["error"]) except websockets.exceptions.ConnectionClosedError as e: - self.logger.debug(e) + logger.debug(e) break data = json.loads(result_str) - is_final = ( - "message_type" in data - and data["message_type"] == "FinalTranscript" - ) + is_final = "message_type" in data and data["message_type"] == "FinalTranscript" if "text" in data and data["text"]: - cur_max_latency = self.audio_cursor - transcript_cursor - transcript_cursor = data["audio_end"] / 1000 - cur_min_latency = self.audio_cursor - transcript_cursor - duration = data["audio_end"] / 1000 - data["audio_start"] / 1000 - - avg_latency_hist.record( - (cur_min_latency + cur_max_latency) / 2 * duration - ) - duration_hist.record(duration) - - # Log max and min latencies - max_latency_hist.record(cur_max_latency) - min_latency_hist.record(max(cur_min_latency, 0)) - self.output_queue.put_nowait( Transcription( message=data["text"], diff --git a/vocode/streaming/transcriber/azure_transcriber.py b/vocode/streaming/transcriber/azure_transcriber.py index cebf5d58f9..c272fdf890 100644 --- a/vocode/streaming/transcriber/azure_transcriber.py +++ b/vocode/streaming/transcriber/azure_transcriber.py @@ -1,31 +1,27 @@ -import logging import queue -from typing import Optional +from datetime import datetime, timezone +import sentry_sdk from azure.cognitiveservices.speech.audio import ( - PushAudioInputStream, AudioStreamFormat, AudioStreamWaveFormat, + PushAudioInputStream, ) +from loguru import logger from vocode import getenv - -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.transcriber.base_transcriber import ( - BaseThreadAsyncTranscriber, - Transcription, -) -from vocode.streaming.models.transcriber import AzureTranscriberConfig +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.transcriber import AzureTranscriberConfig, Transcription +from vocode.streaming.transcriber.base_transcriber import BaseThreadAsyncTranscriber +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span class AzureTranscriber(BaseThreadAsyncTranscriber[AzureTranscriberConfig]): def __init__( self, transcriber_config: AzureTranscriberConfig, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) - self.logger = logger format = None if self.transcriber_config.audio_encoding == AudioEncoding.LINEAR16: @@ -67,9 +63,7 @@ def __init__( ) ) - speech_params["auto_detect_source_language_config"] = ( - auto_detect_source_language_config - ) + speech_params["auto_detect_source_language_config"] = auto_detect_source_language_config else: speech_params["language"] = self.transcriber_config.language @@ -79,6 +73,12 @@ def __init__( self.is_ready = False def recognized_sentence_final(self, evt): + + sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=CustomSentrySpans.LATENCY_OF_CONVERSATION, + start_timestamp=datetime.now(tz=timezone.utc), + ) self.output_janus_queue.sync_q.put_nowait( Transcription(message=evt.result.text, confidence=1.0, is_final=True) ) @@ -92,21 +92,19 @@ def _run_loop(self): stream = self.generator() def stop_cb(evt): - self.logger.debug("CLOSING on {}".format(evt)) + logger.debug("CLOSING on {}".format(evt)) self.speech.stop_continuous_recognition() self._ended = True self.speech.recognizing.connect(lambda x: self.recognized_sentence_stream(x)) self.speech.recognized.connect(lambda x: self.recognized_sentence_final(x)) self.speech.session_started.connect( - lambda evt: self.logger.debug("SESSION STARTED: {}".format(evt)) + lambda evt: logger.debug("SESSION STARTED: {}".format(evt)) ) self.speech.session_stopped.connect( - lambda evt: self.logger.debug("SESSION STOPPED {}".format(evt)) - ) - self.speech.canceled.connect( - lambda evt: self.logger.debug("CANCELED {}".format(evt)) + lambda evt: logger.debug("SESSION STOPPED {}".format(evt)) ) + self.speech.canceled.connect(lambda evt: logger.debug("CANCELED {}".format(evt))) self.speech.session_stopped.connect(stop_cb) self.speech.canceled.connect(stop_cb) diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index 9142be75bf..4745b79a65 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -2,36 +2,27 @@ import asyncio import audioop -from opentelemetry import trace, metrics -from typing import Generic, TypeVar, Union -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.models.model import BaseModel +from abc import ABC, abstractmethod +from typing import Generic, Optional, TypeVar, Union -from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.transcriber import TranscriberConfig, Transcription +from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.worker import AsyncWorker, ThreadAsyncWorker - -tracer = trace.get_tracer(__name__) -meter = metrics.get_meter(__name__) - - -class Transcription(BaseModel): - message: str - confidence: float - is_final: bool - is_interrupt: bool = False - - def __str__(self): - return f"Transcription({self.message}, {self.confidence}, {self.is_final})" - - TranscriberConfigType = TypeVar("TranscriberConfigType", bound=TranscriberConfig) -class AbstractTranscriber(Generic[TranscriberConfigType]): +class AbstractTranscriber(Generic[TranscriberConfigType], ABC): def __init__(self, transcriber_config: TranscriberConfigType): self.transcriber_config = transcriber_config self.is_muted = False + self.speed_manager: Optional[SpeedManager] = None + self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() + self.output_queue: asyncio.Queue[Transcription] = asyncio.Queue() + + def attach_speed_manager(self, speed_manager: SpeedManager): + self.speed_manager = speed_manager def mute(self): self.is_muted = True @@ -52,19 +43,9 @@ def create_silent_chunk(self, chunk_size, sample_width=2): elif self.get_transcriber_config().audio_encoding == AudioEncoding.MULAW: return audioop.lin2ulaw(linear_audio, sample_width) - -class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker): - def __init__( - self, - transcriber_config: TranscriberConfigType, - ): - self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() - self.output_queue: asyncio.Queue[Transcription] = asyncio.Queue() - AsyncWorker.__init__(self, self.input_queue, self.output_queue) - AbstractTranscriber.__init__(self, transcriber_config) - + @abstractmethod async def _run_loop(self): - raise NotImplementedError + pass def send_audio(self, chunk): if not self.is_muted: @@ -72,31 +53,31 @@ def send_audio(self, chunk): else: self.consume_nonblocking(self.create_silent_chunk(len(chunk))) + @abstractmethod + def terminate(self): + pass + + +class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker): + def __init__(self, transcriber_config: TranscriberConfigType): + AbstractTranscriber.__init__(self, transcriber_config) + AsyncWorker.__init__(self, self.input_queue, self.output_queue) + + async def _run_loop(self): + raise NotImplementedError + def terminate(self): AsyncWorker.terminate(self) -class BaseThreadAsyncTranscriber( - AbstractTranscriber[TranscriberConfigType], ThreadAsyncWorker -): - def __init__( - self, - transcriber_config: TranscriberConfigType, - ): - self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() - self.output_queue: asyncio.Queue[Transcription] = asyncio.Queue() - ThreadAsyncWorker.__init__(self, self.input_queue, self.output_queue) +class BaseThreadAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], ThreadAsyncWorker): + def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) + ThreadAsyncWorker.__init__(self, self.input_queue, self.output_queue) def _run_loop(self): raise NotImplementedError - def send_audio(self, chunk): - if not self.is_muted: - self.consume_nonblocking(chunk) - else: - self.consume_nonblocking(self.create_silent_chunk(len(chunk))) - def terminate(self): ThreadAsyncWorker.terminate(self) diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index ce91ec2900..7af17237a9 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -1,108 +1,127 @@ import asyncio import json -import logging -from typing import Optional +from datetime import datetime, timezone +from typing import List, Optional, Tuple, Union +from urllib.parse import urlencode + +import sentry_sdk import websockets +from loguru import logger +from pydantic.v1 import BaseModel, Field from websockets.client import WebSocketClientProtocol -import audioop -from urllib.parse import urlencode -from vocode import getenv -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, - Transcription, - meter, -) +from vocode import getenv +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcriber import ( + DEEPGRAM_API_WS_URL, DeepgramTranscriberConfig, EndpointingConfig, - EndpointingType, PunctuationEndpointingConfig, TimeEndpointingConfig, + Transcription, ) -from vocode.streaming.models.audio_encoding import AudioEncoding - +from vocode.streaming.transcriber.base_transcriber import BaseAsyncTranscriber +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_configured, sentry_create_span PUNCTUATION_TERMINATORS = [".", "!", "?"] NUM_RESTARTS = 5 +NUM_AUDIO_CHANNELS = 1 -avg_latency_hist = meter.create_histogram( - name="transcriber.deepgram.avg_latency", - unit="seconds", -) -max_latency_hist = meter.create_histogram( - name="transcriber.deepgram.max_latency", - unit="seconds", -) -min_latency_hist = meter.create_histogram( - name="transcriber.deepgram.min_latency", - unit="seconds", -) -duration_hist = meter.create_histogram( - name="transcriber.deepgram.duration", - unit="seconds", -) +def now(): + return datetime.now(tz=timezone.utc) + + +class TimeSilentConfig(BaseModel): + time_cutoff_seconds: float = 1 + post_punctuation_time_seconds: float = 0.5 + + +class InternalPunctuationEndpointingConfig( # type: ignore + EndpointingConfig, type="internal_punctuation_based" +): + time_silent_config: TimeSilentConfig = Field(default_factory=TimeSilentConfig) + use_single_utterance_endpointing_for_first_utterance: bool = False + + +class DeepgramEndpointingConfig(EndpointingConfig, type="deepgram"): # type: ignore + vad_threshold_ms: int = 500 + utterance_cutoff_ms: int = 1000 + time_silent_config: Optional[TimeSilentConfig] = Field(default_factory=TimeSilentConfig) + use_single_utterance_endpointing_for_first_utterance: bool = False + + +class DeepgramUtteranceEnd(BaseModel): + pass + + def __str__(self): + return "DeepgramUtteranceEnd()" + + +class DeepgramTranscriptionResult(BaseModel): + class TranscriptionChoice(BaseModel): + transcript: str + confidence: float + words: List[dict] + + is_final: bool + speech_final: bool + top_choice: TranscriptionChoice + start: float + duration: float + + def __str__(self): + return f"DeepgramTranscriptionResult(transcript={self.top_choice.transcript}, is_final={self.is_final}, speech_final={self.speech_final})" class DeepgramTranscriber(BaseAsyncTranscriber[DeepgramTranscriberConfig]): def __init__( self, transcriber_config: DeepgramTranscriberConfig, - api_key: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) - self.api_key = api_key or getenv("DEEPGRAM_API_KEY") + self.api_key = self.transcriber_config.api_key or getenv("DEEPGRAM_API_KEY") if not self.api_key: - raise Exception( + raise ValueError( "Please set DEEPGRAM_API_KEY environment variable or pass it as a parameter" ) self._ended = False self.is_ready = False - self.logger = logger or logging.getLogger(__name__) self.audio_cursor = 0.0 + self.transcript_cursor = 0.0 - async def _run_loop(self): - restarts = 0 - while not self._ended and restarts < NUM_RESTARTS: - await self.process() - restarts += 1 - self.logger.debug( - "Deepgram connection died, restarting, num_restarts: %s", restarts - ) + self.ws_url = getattr(transcriber_config, "ws_url", DEEPGRAM_API_WS_URL) - def send_audio(self, chunk): - if ( - self.transcriber_config.downsampling - and self.transcriber_config.audio_encoding == AudioEncoding.LINEAR16 - ): - chunk, _ = audioop.ratecv( - chunk, - 2, - 1, - self.transcriber_config.sampling_rate - * self.transcriber_config.downsampling, - self.transcriber_config.sampling_rate, - None, - ) - super().send_audio(chunk) + self.min_latency = 0.0 + self.max_latency = 0.0 + self.avg_latency = 0.0 - def terminate(self): - terminate_msg = json.dumps({"type": "CloseStream"}) - self.input_queue.put_nowait(terminate_msg) - self._ended = True - super().terminate() + self.avg_latency_numer = 0.0 + self.avg_latency_denom = 0.0 + + self.start_ts: Optional[datetime] = None + self.connected_ts: Optional[datetime] = None + self.start_sending_ts: Optional[datetime] = None + self.start_receiving_ts: Optional[datetime] = None + + self.is_first_transcription = True + + def _get_speed_coefficient(self): + return self.speed_manager.get_speed_coefficient() if self.speed_manager else 1.0 def get_deepgram_url(self): if self.transcriber_config.audio_encoding == AudioEncoding.LINEAR16: encoding = "linear16" elif self.transcriber_config.audio_encoding == AudioEncoding.MULAW: encoding = "mulaw" + else: + raise Exception( + f"Audio encoding not supported {self.transcriber_config.audio_encoding}" + ) url_params = { "encoding": encoding, "sample_rate": self.transcriber_config.sampling_rate, - "channels": 1, + "channels": NUM_AUDIO_CHANNELS, "interim_results": "true", } extra_params = {} @@ -116,150 +135,517 @@ def get_deepgram_url(self): extra_params["version"] = self.transcriber_config.version if self.transcriber_config.keywords: extra_params["keywords"] = self.transcriber_config.keywords - if ( - self.transcriber_config.endpointing_config - and self.transcriber_config.endpointing_config.type - == EndpointingType.PUNCTUATION_BASED + if self.transcriber_config.endpointing_config and ( + isinstance( + self.transcriber_config.endpointing_config, + PunctuationEndpointingConfig, + ) + or isinstance( + self.transcriber_config.endpointing_config, + InternalPunctuationEndpointingConfig, + ) + or isinstance( + self.transcriber_config.endpointing_config, + DeepgramEndpointingConfig, + ) ): extra_params["punctuate"] = "true" + if isinstance( + self.transcriber_config.endpointing_config, + DeepgramEndpointingConfig, + ): + extra_params["endpointing"] = int( + self.transcriber_config.endpointing_config.vad_threshold_ms + * (1 / self._get_speed_coefficient()) + ) + extra_params["utterance_end_ms"] = max( + int( + self.transcriber_config.endpointing_config.utterance_cutoff_ms + * (1 / self._get_speed_coefficient()) + ), + 1000, + ) # Deepgram recommends using at least 1000ms since the tick period is ~1s url_params.update(extra_params) - return f"wss://api.deepgram.com/v1/listen?{urlencode(url_params)}" + return f"{self.ws_url}/v1/listen?{urlencode(url_params)}" + + async def _run_loop(self): + restarts = 0 + while not self._ended and restarts < NUM_RESTARTS: + await self.process() + restarts += 1 + logger.debug(f"Deepgram connection died, restarting, num_restarts: {restarts}") + + logger.error("Deepgram connection died, not restarting") + + def terminate(self): + self._track_latency_of_transcription_start() + # Put this in logs until we sentry metrics show up + # properly on dashboard + logger.info( + f"Transcription latency is {self.avg_latency:.4f}s", + extra={ + "avg_latency": self.avg_latency, + "min_latency": self.min_latency, + "max_latency": self.max_latency, + }, + ) + terminate_msg = json.dumps({"type": "CloseStream"}).encode("utf-8") + self.input_queue.put_nowait(terminate_msg) + self._ended = True + super().terminate() + + def get_input_sample_width(self): + encoding = self.transcriber_config.audio_encoding + if encoding == AudioEncoding.LINEAR16: + return 2 + elif encoding == AudioEncoding.MULAW: + return 1 + else: + raise Exception(f"Audio encoding not supported {encoding}") - def is_speech_final( - self, current_buffer: str, deepgram_response: dict, time_silent: float + def get_byte_rate(self): + sample_width = self.get_input_sample_width() + sample_rate = self.transcriber_config.sampling_rate + return sample_width * sample_rate * NUM_AUDIO_CHANNELS + + def is_endpoint( + self, + current_buffer: str, + deepgram_response: Union[DeepgramUtteranceEnd, DeepgramTranscriptionResult], + time_silent: float, ): - transcript = deepgram_response["channel"]["alternatives"][0]["transcript"] + is_endpoint, log_params = self._compute_is_endpoint_and_log_params( + current_buffer, deepgram_response, time_silent + ) + if is_endpoint: + logger.info("Endpoint detected", extra=log_params) + return is_endpoint - # if it is not time based, then return true if speech is final and there is a transcript - if not self.transcriber_config.endpointing_config: - return transcript and deepgram_response["speech_final"] - elif isinstance( - self.transcriber_config.endpointing_config, TimeEndpointingConfig + @staticmethod + def _satisfies_time_cutoff( + *, + seconds: float, + deepgram_response: Union[DeepgramUtteranceEnd, DeepgramTranscriptionResult], + current_buffer: str, + time_silent: float, + ): + return ( + isinstance(deepgram_response, DeepgramTranscriptionResult) + and not deepgram_response.top_choice.transcript + and len(current_buffer) > 0 + and (time_silent + deepgram_response.duration) > seconds + ) + + def _compute_is_endpoint_and_update_log_params_based_on_time_silent( + self, + current_buffer: str, + deepgram_response: DeepgramTranscriptionResult, + time_silent: float, + time_silent_config: TimeSilentConfig, + existing_log_params: dict, + ) -> bool: + if current_buffer.strip(): + if current_buffer.strip()[ + -1 + ] in PUNCTUATION_TERMINATORS and self._satisfies_time_cutoff( + seconds=time_silent_config.post_punctuation_time_seconds + * (1.0 / self._get_speed_coefficient()), + deepgram_response=deepgram_response, + current_buffer=current_buffer, + time_silent=time_silent, + ): + existing_log_params["source"] = "punctuation" + return True + elif self._satisfies_time_cutoff( + seconds=time_silent_config.time_cutoff_seconds + * (1.0 / self._get_speed_coefficient()), + deepgram_response=deepgram_response, + current_buffer=current_buffer, + time_silent=time_silent, + ): + existing_log_params["source"] = "time_cutoff" + return True + return False + + def _compute_is_endpoint_and_log_params( + self, + current_buffer: str, + deepgram_response: Union[DeepgramUtteranceEnd, DeepgramTranscriptionResult], + time_silent: float, + ) -> Tuple[bool, dict]: + endpointing_config = self.transcriber_config.endpointing_config + assert endpointing_config is not None + + log_params = {"endpointing_type": endpointing_config.type} + + if isinstance( + endpointing_config, + TimeEndpointingConfig, ): # if it is time based, then return true if there is no transcript # and there is some speech to send # and the time_silent is greater than the cutoff return ( - not transcript - and current_buffer - and (time_silent + deepgram_response["duration"]) - > self.transcriber_config.endpointing_config.time_cutoff_seconds + self._satisfies_time_cutoff( + seconds=endpointing_config.time_cutoff_seconds, + deepgram_response=deepgram_response, + current_buffer=current_buffer, + time_silent=time_silent, + ), + log_params, ) elif isinstance( - self.transcriber_config.endpointing_config, PunctuationEndpointingConfig + endpointing_config, + DeepgramEndpointingConfig, ): - return ( - transcript - and deepgram_response["speech_final"] - and transcript.strip()[-1] in PUNCTUATION_TERMINATORS - ) or ( - not transcript - and current_buffer - and (time_silent + deepgram_response["duration"]) - > self.transcriber_config.endpointing_config.time_cutoff_seconds - ) - raise Exception("Endpointing config not supported") + if ( + isinstance(deepgram_response, DeepgramTranscriptionResult) + and self.is_first_transcription + and endpointing_config.use_single_utterance_endpointing_for_first_utterance + ): + if ( + deepgram_response.top_choice.transcript + and deepgram_response.top_choice.transcript.strip()[-1] + in PUNCTUATION_TERMINATORS + ): + log_params["source"] = "is_final" + return True, log_params + if isinstance(deepgram_response, DeepgramUtteranceEnd): + log_params["source"] = "utterance_end" + return True, log_params + elif isinstance(deepgram_response, DeepgramTranscriptionResult): + if deepgram_response.top_choice.transcript and deepgram_response.speech_final: + log_params["source"] = "speech_final" + return True, log_params + elif ( + endpointing_config.time_silent_config is not None + and self._compute_is_endpoint_and_update_log_params_based_on_time_silent( + current_buffer, + deepgram_response, + time_silent, + endpointing_config.time_silent_config, + log_params, + ) + ): + return True, log_params + return False, log_params - def calculate_time_silent(self, data: dict): - end = data["start"] + data["duration"] - words = data["channel"]["alternatives"][0]["words"] + if isinstance(deepgram_response, DeepgramTranscriptionResult): + if isinstance( + endpointing_config, + PunctuationEndpointingConfig, + ): + if ( + deepgram_response.top_choice.transcript + and deepgram_response.speech_final + and deepgram_response.top_choice.transcript.strip()[-1] + in PUNCTUATION_TERMINATORS + ): + log_params["source"] = "punctuation" + return True, log_params + elif self._satisfies_time_cutoff( + seconds=endpointing_config.time_cutoff_seconds + * (1.0 / self._get_speed_coefficient()), + deepgram_response=deepgram_response, + current_buffer=current_buffer, + time_silent=time_silent, + ): + log_params["source"] = "time_cutoff" + return True, log_params + elif isinstance( + endpointing_config, + InternalPunctuationEndpointingConfig, + ): + if ( + self.is_first_transcription + and endpointing_config.use_single_utterance_endpointing_for_first_utterance + ): + if deepgram_response.top_choice.transcript and deepgram_response.speech_final: + log_params["source"] = "speech_final" + return True, log_params + if self._compute_is_endpoint_and_update_log_params_based_on_time_silent( + current_buffer, + deepgram_response, + time_silent, + endpointing_config.time_silent_config, + log_params, + ): + return True, log_params + return False, log_params + + def calculate_time_silent(self, deepgram_transcription_result: DeepgramTranscriptionResult): + end = deepgram_transcription_result.start + deepgram_transcription_result.duration + words = deepgram_transcription_result.top_choice.words if words: return end - words[-1]["end"] - return data["duration"] + return deepgram_transcription_result.duration + + def calculate_duration(self, words: List[dict]) -> float: + if len(words) == 0: + return 0.0 + return words[-1]["end"] - words[0]["start"] async def process(self): self.audio_cursor = 0.0 + self.start_ts = now() + extra_headers = {"Authorization": f"Token {self.api_key}"} + deepgram_url = self.get_deepgram_url() + logger.info(f"Connecting to Deepgram at {deepgram_url}") - async with websockets.connect( - self.get_deepgram_url(), extra_headers=extra_headers - ) as ws: - - async def sender(ws: WebSocketClientProtocol): # sends audio to websocket - while not self._ended: - try: - data = await asyncio.wait_for(self.input_queue.get(), 5) - except asyncio.exceptions.TimeoutError: - break - num_channels = 1 - sample_width = 2 - self.audio_cursor += len(data) / ( - self.transcriber_config.sampling_rate - * num_channels - * sample_width - ) - await ws.send(data) - self.logger.debug("Terminating Deepgram transcriber sender") - - async def receiver(ws: WebSocketClientProtocol): - buffer = "" - buffer_avg_confidence = 0 - num_buffer_utterances = 1 - time_silent = 0 - transcript_cursor = 0.0 - while not self._ended: - try: - msg = await ws.recv() - except Exception as e: - self.logger.debug(f"Got error {e} in Deepgram receiver") - break - data = json.loads(msg) - if ( - not "is_final" in data - ): # means we've finished receiving transcriptions - break - cur_max_latency = self.audio_cursor - transcript_cursor - transcript_cursor = data["start"] + data["duration"] - cur_min_latency = self.audio_cursor - transcript_cursor - - avg_latency_hist.record( - (cur_min_latency + cur_max_latency) / 2 * data["duration"] - ) - duration_hist.record(data["duration"]) + try: + async with websockets.connect(deepgram_url, extra_headers=extra_headers) as ws: + self.connected_ts = now() + + async def sender( + ws: WebSocketClientProtocol, + ): # sends audio to websocket + byte_rate = self.get_byte_rate() + + while not self._ended: + try: + data = await asyncio.wait_for(self.input_queue.get(), 5) + except asyncio.exceptions.TimeoutError: + break + + self.audio_cursor += len(data) / byte_rate + + if not self.start_sending_ts: + self.start_sending_ts = now() + + await ws.send(data) + + logger.debug("Terminating Deepgram transcriber sender") + + async def receiver(ws: WebSocketClientProtocol): + buffer = "" + buffer_avg_confidence = 0.0 + num_buffer_utterances = 1 + time_silent = 0.0 + words_buffer = [] + is_final_ts: Optional[datetime] = None - # Log max and min latencies - max_latency_hist.record(cur_max_latency) - min_latency_hist.record(max(cur_min_latency, 0)) + while not self._ended: + try: + msg = await ws.recv() + if not self.start_receiving_ts: + self.start_receiving_ts = now() + except Exception as e: + logger.debug(f"Got error {e} in Deepgram receiver") + break + data = json.loads(msg) - is_final = data["is_final"] - speech_final = self.is_speech_final(buffer, data, time_silent) - top_choice = data["channel"]["alternatives"][0] - confidence = top_choice["confidence"] + if "start" in data and "duration" in data: + self._track_transcription_latency( + start=data["start"], + duration=data["duration"], + ) + + deepgram_response: Union[DeepgramUtteranceEnd, DeepgramTranscriptionResult] - if top_choice["transcript"] and confidence > 0.0 and is_final: - buffer = f"{buffer} {top_choice['transcript']}" - if buffer_avg_confidence == 0: - buffer_avg_confidence = confidence + if data["type"] == "Results": + deepgram_response = DeepgramTranscriptionResult( + is_final=data["is_final"], + speech_final=data["speech_final"], + top_choice=data["channel"]["alternatives"][0], + duration=data["duration"], + start=data["start"], + ) + elif data["type"] == "UtteranceEnd": + deepgram_response = DeepgramUtteranceEnd() else: - buffer_avg_confidence = ( - buffer_avg_confidence - + confidence / (num_buffer_utterances) - ) * (num_buffer_utterances / (num_buffer_utterances + 1)) - num_buffer_utterances += 1 - - if speech_final: - self.output_queue.put_nowait( - Transcription( - message=buffer, - confidence=buffer_avg_confidence, - is_final=True, + logger.info(f"Ignoring deepgram response type: {data['type']}") + continue + + if ( + isinstance(deepgram_response, DeepgramTranscriptionResult) + and deepgram_response.top_choice.transcript + and deepgram_response.top_choice.confidence > 0.0 + and deepgram_response.is_final + ): + words = deepgram_response.top_choice.words + if words: + words_buffer.extend(words) + buffer = f"{buffer} {deepgram_response.top_choice.transcript}" + if buffer_avg_confidence == 0: + buffer_avg_confidence = deepgram_response.top_choice.confidence + else: + buffer_avg_confidence = ( + buffer_avg_confidence + + deepgram_response.top_choice.confidence + / (num_buffer_utterances) + ) * (num_buffer_utterances / (num_buffer_utterances + 1)) + num_buffer_utterances += 1 + + is_final_ts = now() + + if buffer and self.is_endpoint(buffer, deepgram_response, time_silent): + output_ts = now() + self._track_latency_of_conversation( + is_final_ts=is_final_ts, + output_ts=output_ts, ) - ) - buffer = "" - buffer_avg_confidence = 0 - num_buffer_utterances = 1 - time_silent = 0 - elif top_choice["transcript"] and confidence > 0.0: - self.output_queue.put_nowait( - Transcription( - message=buffer, - confidence=confidence, - is_final=False, + self.output_queue.put_nowait( + Transcription( + message=buffer, + confidence=buffer_avg_confidence, + is_final=True, + duration_seconds=self.calculate_duration(words_buffer), + ) ) - ) - time_silent = self.calculate_time_silent(data) - else: - time_silent += data["duration"] - self.logger.debug("Terminating Deepgram transcriber receiver") + buffer = "" + buffer_avg_confidence = 0.0 + num_buffer_utterances = 1 + time_silent = 0.0 + words_buffer = [] + is_final_ts = None + + if isinstance(deepgram_response, DeepgramTranscriptionResult): + if ( + isinstance(deepgram_response, DeepgramTranscriptionResult) + and deepgram_response.top_choice.transcript + and deepgram_response.top_choice.confidence > 0.0 + ): + if not deepgram_response.is_final: + interim_message = ( + f"{buffer} {deepgram_response.top_choice.transcript}" + ) + else: + interim_message = buffer + + self.output_queue.put_nowait( + Transcription( + message=interim_message, + confidence=deepgram_response.top_choice.confidence, + is_final=False, + ) + ) + time_silent = self.calculate_time_silent(deepgram_response) + else: + time_silent += deepgram_response.duration + + logger.debug("Terminating Deepgram transcriber receiver") + + await asyncio.gather(sender(ws), receiver(ws)) + + except asyncio.exceptions.TimeoutError: + raise + + @sentry_configured + def _track_latency_of_transcription_start( + self, + ): + with sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=CustomSentrySpans.LATENCY_OF_TRANSCRIPTION_START, + start_timestamp=self.start_ts, + ) as transcription_span: + + with sentry_create_span( + sentry_callable=transcription_span.start_child, + op=CustomSentrySpans.START_TO_CONNECTION, + start_timestamp=self.start_ts, + ) as span: + span.finish(end_timestamp=self.connected_ts) + + with sentry_create_span( + sentry_callable=transcription_span.start_child, + op=CustomSentrySpans.CONNECTED_TO_FIRST_SEND, + start_timestamp=self.connected_ts, + ) as span: + span.finish(end_timestamp=self.start_sending_ts) + + with sentry_create_span( + sentry_callable=transcription_span.start_child, + op=CustomSentrySpans.FIRST_SEND_TO_FIRST_RECEIVE, + start_timestamp=self.start_sending_ts, + ) as span: + span.finish(end_timestamp=self.start_receiving_ts) + transcription_span.finish(end_timestamp=self.start_receiving_ts) + + def _track_transcription_latency(self, start: float, duration: float): + cur_max_latency = self.audio_cursor - self.transcript_cursor + transcript_cursor = start + duration + cur_min_latency = self.audio_cursor - transcript_cursor + + self.max_latency = max(self.max_latency or 0, cur_max_latency) + self.min_latency = min(self.min_latency or 10**6, cur_min_latency) + + self.avg_latency_numer += (cur_min_latency + cur_max_latency) / 2 * duration + self.avg_latency_denom += duration + self.avg_latency = self.avg_latency_numer / (self.avg_latency_denom or 1) + + def _track_latency_of_conversation( + self, + *, + # is_final_spoken_ts: Optional[datetime], + is_final_ts: Optional[datetime], + output_ts: datetime, + ): + if not ( + output_ts + and is_final_ts + # and is_final_spoken_ts + ): + logger.info("Skipping latency measurement when not all timestamps are set") + return + + if not (output_ts > is_final_ts): # > is_final_spoken_ts + logger.error("Skipping latency measurement when timestamps are not in order") + return + logger.debug( + f"Endpoint detected, tracking endpointing_latency={output_ts - is_final_ts}", + ) + + # Ideally, we want to start a latency measurement for the entire conversation delay: + # from when the user stopped speaking, to the time we start sending audio back. + # Currently we don't have a way to find from Deepgram what the timetamp is + # corresponding to their 0.0 in the transcript_cursor and we have observed that + # the audio_cursor is always less than the transcript cursor, which seems to + # indicate there is something off in our math for the audio cursor. The audio cursor + # should represent the total number of seconds of audio that we have submitted to + # Deepgram and should roughly line up with the transcript cursor. + # + # Until we can find a reliable way to find is_final_spoken_ts, we are skipping on + # sending the transcription_latency span, instead focus on the endpointing_latency + # + # There was previous work done using the last word "end" cursor offset from Deepgram + # in [EPD-926]. However, for similar reasons the logic for adding that to the + # start_receiving_ts created on our end resulted in times for that audio that were + # later than "is_final" which does not make sense temporally. We believe that is due + # to not having an accurate timestamp corresponding to deepgram's 0.0 audio_cursor offset. + + # Span: latency_of_conversation + + # Once we have reliable way to find is_final_spoken_ts we would use that + # here instead, and uncomment the transcription_latency span + # start_timestamp=is_final_spoken_ts, + latency_of_conversation_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, + op=CustomSentrySpans.LATENCY_OF_CONVERSATION, + start_timestamp=is_final_ts, + ) + + # Span: latency_of_conversation.transcription_latency + # Transcription latency is the time between audio was sent to deepgram for the + # last word in the buffer when we set `is_final_ts` and then start + # running + # Time from `is_final_spoken_ts` to `is_final_ts` + # with sentry_create_span( + # sentry_callable=latency_of_conversation_span.start_child, + # op="transcription_latency", + # start_timestamp=is_final_spoken_ts, + # ) as span: + # span.finish(end_timestamp=is_final_ts) - await asyncio.gather(sender(ws), receiver(ws)) + # Span: latency_of_conversation.endpointing_latency + # Endpointing latency is the time from when we receive the last is_final + # message from Deepgram and when we send output to the next stage. + # Time from `is_final_ts` to `output_ts` + if latency_of_conversation_span: + with sentry_create_span( + sentry_callable=latency_of_conversation_span.start_child, + op=CustomSentrySpans.ENDPOINTING_LATENCY, + start_timestamp=is_final_ts, + ) as span: + span.finish(end_timestamp=output_ts) diff --git a/vocode/streaming/transcriber/factory.py b/vocode/streaming/transcriber/default_factory.py similarity index 63% rename from vocode/streaming/transcriber/factory.py rename to vocode/streaming/transcriber/default_factory.py index 5974b266c5..3a10443134 100644 --- a/vocode/streaming/transcriber/factory.py +++ b/vocode/streaming/transcriber/default_factory.py @@ -1,37 +1,37 @@ -import logging -from typing import Optional -import typing from vocode.streaming.models.transcriber import ( AssemblyAITranscriberConfig, AzureTranscriberConfig, DeepgramTranscriberConfig, + GladiaTranscriberConfig, GoogleTranscriberConfig, RevAITranscriberConfig, TranscriberConfig, - TranscriberType, ) +from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory from vocode.streaming.transcriber.assembly_ai_transcriber import AssemblyAITranscriber +from vocode.streaming.transcriber.azure_transcriber import AzureTranscriber from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber +from vocode.streaming.transcriber.gladia_transcriber import GladiaTranscriber from vocode.streaming.transcriber.google_transcriber import GoogleTranscriber from vocode.streaming.transcriber.rev_ai_transcriber import RevAITranscriber -from vocode.streaming.transcriber.azure_transcriber import AzureTranscriber -class TranscriberFactory: +class DefaultTranscriberFactory(AbstractTranscriberFactory): def create_transcriber( self, transcriber_config: TranscriberConfig, - logger: Optional[logging.Logger] = None, ): if isinstance(transcriber_config, DeepgramTranscriberConfig): - return DeepgramTranscriber(transcriber_config, logger=logger) + return DeepgramTranscriber(transcriber_config) elif isinstance(transcriber_config, GoogleTranscriberConfig): - return GoogleTranscriber(transcriber_config, logger=logger) + return GoogleTranscriber(transcriber_config) elif isinstance(transcriber_config, AssemblyAITranscriberConfig): - return AssemblyAITranscriber(transcriber_config, logger=logger) + return AssemblyAITranscriber(transcriber_config) elif isinstance(transcriber_config, RevAITranscriberConfig): - return RevAITranscriber(transcriber_config, logger=logger) + return RevAITranscriber(transcriber_config) elif isinstance(transcriber_config, AzureTranscriberConfig): - return AzureTranscriber(transcriber_config, logger=logger) + return AzureTranscriber(transcriber_config) + elif isinstance(transcriber_config, GladiaTranscriberConfig): + return GladiaTranscriber(transcriber_config) else: raise Exception("Invalid transcriber config") diff --git a/vocode/streaming/transcriber/gladia_transcriber.py b/vocode/streaming/transcriber/gladia_transcriber.py index 7c76007d07..54366035a1 100644 --- a/vocode/streaming/transcriber/gladia_transcriber.py +++ b/vocode/streaming/transcriber/gladia_transcriber.py @@ -1,22 +1,17 @@ import asyncio +import audioop import json -import base64 -import logging from typing import Optional -import websockets -import audioop + import numpy as np -from urllib.parse import urlencode -from vocode import getenv +import websockets +from loguru import logger -from vocode.streaming.models.transcriber import GladiaTranscriberConfig +from vocode import getenv +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.transcriber import GladiaTranscriberConfig, Transcription from vocode.streaming.models.websocket import AudioMessage -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, - Transcription, -) -from vocode.streaming.models.audio_encoding import AudioEncoding - +from vocode.streaming.transcriber.base_transcriber import BaseAsyncTranscriber GLADIA_URL = "wss://api.gladia.io/audio/text/audio-transcription" @@ -26,7 +21,6 @@ def __init__( self, transcriber_config: GladiaTranscriberConfig, api_key: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) self.api_key = api_key or getenv("GLADIA_API_KEY") @@ -35,7 +29,6 @@ def __init__( "Please set GLADIA_API_KEY environment variable or pass it as a parameter" ) self._ended = False - self.logger = logger or logging.getLogger(__name__) if self.transcriber_config.endpointing_config: raise Exception("Gladia endpointing config not supported yet") @@ -94,7 +87,7 @@ async def sender(ws): } ) ) - self.logger.debug("Terminating Gladia transcriber sender") + logger.debug("Terminating Gladia transcriber sender") async def receiver(ws): while not self._ended: @@ -104,7 +97,7 @@ async def receiver(ws): if "error" in data and data["error"]: raise Exception(data["error"]) except websockets.exceptions.ConnectionClosedError as e: - self.logger.debug(e) + logger.debug(e) break if data: diff --git a/vocode/streaming/transcriber/google_transcriber.py b/vocode/streaming/transcriber/google_transcriber.py index 7205f74a3d..5f3da9a68d 100644 --- a/vocode/streaming/transcriber/google_transcriber.py +++ b/vocode/streaming/transcriber/google_transcriber.py @@ -1,19 +1,8 @@ -import asyncio -import logging -import os -import time import queue -from typing import Optional -import threading -from vocode import getenv -from vocode.streaming.models.audio_encoding import AudioEncoding -from vocode.streaming.transcriber.base_transcriber import ( - BaseThreadAsyncTranscriber, - Transcription, -) -from vocode.streaming.models.transcriber import GoogleTranscriberConfig -from vocode.streaming.utils import create_loop_in_thread +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.models.transcriber import GoogleTranscriberConfig, Transcription +from vocode.streaming.transcriber.base_transcriber import BaseThreadAsyncTranscriber # TODO: make this nonblocking so it can run in the main thread, see speech.async_client.SpeechAsyncClient @@ -21,12 +10,11 @@ class GoogleTranscriber(BaseThreadAsyncTranscriber[GoogleTranscriberConfig]): def __init__( self, transcriber_config: GoogleTranscriberConfig, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) - from google.cloud import speech import google.auth + from google.cloud import speech google.auth.default() self.speech = speech @@ -64,12 +52,9 @@ def create_google_streaming_config(self): def _run_loop(self): stream = self.generator() requests = ( - self.speech.StreamingRecognizeRequest(audio_content=content) - for content in stream - ) - responses = self.client.streaming_recognize( - self.google_streaming_config, requests + self.speech.StreamingRecognizeRequest(audio_content=content) for content in stream ) + responses = self.client.streaming_recognize(self.google_streaming_config, requests) self.process_responses_loop(responses) def terminate(self): @@ -96,9 +81,7 @@ def _on_response(self, response): confidence = top_choice.confidence self.output_janus_queue.sync_q.put_nowait( - Transcription( - message=message, confidence=confidence, is_final=result.is_final - ) + Transcription(message=message, confidence=confidence, is_final=result.is_final) ) def generator(self): diff --git a/vocode/streaming/transcriber/rev_ai_transcriber.py b/vocode/streaming/transcriber/rev_ai_transcriber.py index 075ddf6334..8567686959 100644 --- a/vocode/streaming/transcriber/rev_ai_transcriber.py +++ b/vocode/streaming/transcriber/rev_ai_transcriber.py @@ -1,22 +1,19 @@ import asyncio import json -import logging +import time from typing import Optional + import websockets +from loguru import logger from websockets.client import WebSocketClientProtocol -from vocode import getenv -import time -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, - Transcription, -) +from vocode import getenv from vocode.streaming.models.transcriber import ( RevAITranscriberConfig, - EndpointingType, TimeEndpointingConfig, + Transcription, ) - +from vocode.streaming.transcriber.base_transcriber import BaseAsyncTranscriber NUM_RESTARTS = 5 @@ -30,7 +27,6 @@ def __init__( self, transcriber_config: RevAITranscriberConfig, api_key: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): super().__init__(transcriber_config) self.api_key = api_key or getenv("REV_AI_API_KEY") @@ -40,7 +36,6 @@ def __init__( ) self.closed = False self.is_ready = True - self.logger = logger or logging.getLogger(__name__) self.last_signal_seconds = 0 async def ready(self): @@ -53,7 +48,9 @@ def get_rev_ai_url(self): audio_format = "S16LE" channels = 1 - content_type = f"{codec};layout={layout};rate={rate};format={audio_format};channels={channels}" + content_type = ( + f"{codec};layout={layout};rate={rate};format={audio_format};channels={channels}" + ) url_params_dict = { "access_token": self.api_key, @@ -61,7 +58,7 @@ def get_rev_ai_url(self): } url_params_arr = [f"{key}={value}" for (key, value) in url_params_dict.items()] - url = f"wss://api.rev.ai/speechtotext/v1/stream?" + "&".join(url_params_arr) + url = "wss://api.rev.ai/speechtotext/v1/stream?" + "&".join(url_params_arr) return url async def _run_loop(self): @@ -69,9 +66,7 @@ async def _run_loop(self): while not self.closed and restarts < NUM_RESTARTS: await self.process() restarts += 1 - self.logger.debug( - "Rev AI connection died, restarting, num_restarts: %s", restarts - ) + logger.debug(f"Rev AI connection died, restarting, num_restarts: {restarts}") async def process(self): async with websockets.connect(self.get_rev_ai_url()) as ws: @@ -84,7 +79,7 @@ async def sender(ws: WebSocketClientProtocol): break await ws.send(data) await ws.close() - self.logger.debug("Terminating Rev.AI transcriber sender") + logger.debug("Terminating Rev.AI transcriber sender") async def receiver(ws: WebSocketClientProtocol): buffer = "" @@ -93,7 +88,7 @@ async def receiver(ws: WebSocketClientProtocol): try: msg = await ws.recv() except Exception as e: - self.logger.debug(f"Got error {e} in Rev.AI receiver") + logger.debug(f"Got error {e} in Rev.AI receiver") break data = json.loads(msg) @@ -124,9 +119,7 @@ async def receiver(ws: WebSocketClientProtocol): confidence = 1.0 if is_done: self.output_queue.put_nowait( - Transcription( - message=buffer, confidence=confidence, is_final=True - ) + Transcription(message=buffer, confidence=confidence, is_final=True) ) buffer = "" else: @@ -138,7 +131,7 @@ async def receiver(ws: WebSocketClientProtocol): ) ) - self.logger.debug("Terminating Rev.AI transcriber receiver") + logger.debug("Terminating Rev.AI transcriber receiver") await asyncio.gather(sender(ws), receiver(ws)) diff --git a/vocode/streaming/transcriber/whisper_cpp_transcriber.py b/vocode/streaming/transcriber/whisper_cpp_transcriber.py index 96a12ed47d..6f1967de56 100644 --- a/vocode/streaming/transcriber/whisper_cpp_transcriber.py +++ b/vocode/streaming/transcriber/whisper_cpp_transcriber.py @@ -1,19 +1,15 @@ -import asyncio -from concurrent.futures import ThreadPoolExecutor import ctypes import io import pathlib import wave -from pydub import AudioSegment +from concurrent.futures import ThreadPoolExecutor import numpy as np -from vocode.streaming.agent.utils import SENTENCE_ENDINGS -from vocode.streaming.models.transcriber import WhisperCPPTranscriberConfig -from vocode.streaming.transcriber.base_transcriber import ( - BaseAsyncTranscriber, - BaseThreadAsyncTranscriber, - Transcription, -) +from pydub import AudioSegment + +from vocode.streaming.constants import SENTENCE_ENDINGS +from vocode.streaming.models.transcriber import Transcription, WhisperCPPTranscriberConfig +from vocode.streaming.transcriber.base_transcriber import BaseThreadAsyncTranscriber from vocode.utils.whisper_cpp.helpers import transcribe from vocode.utils.whisper_cpp.whisper_params import WhisperFullParams @@ -72,18 +68,12 @@ def _run_loop(self): if audio_buffer.tell() >= self.buffer_size * 2: audio_buffer.seek(0) audio_segment = AudioSegment.from_wav(audio_buffer) - message, confidence = transcribe( - self.whisper, self.params, self.ctx, audio_segment - ) + message, confidence = transcribe(self.whisper, self.params, self.ctx, audio_segment) message_buffer += message - is_final = any( - message_buffer.endswith(ending) for ending in SENTENCE_ENDINGS - ) + is_final = any(message_buffer.endswith(ending) for ending in SENTENCE_ENDINGS) in_memory_wav, audio_buffer = self.create_new_buffer() self.output_queue.put_nowait( - Transcription( - message=message_buffer, confidence=confidence, is_final=is_final - ) + Transcription(message=message_buffer, confidence=confidence, is_final=is_final) ) if is_final: message_buffer = "" diff --git a/vocode/streaming/user_implemented_agent/base_agent.py b/vocode/streaming/user_implemented_agent/base_agent.py index 8009be2d85..166bf9d149 100644 --- a/vocode/streaming/user_implemented_agent/base_agent.py +++ b/vocode/streaming/user_implemented_agent/base_agent.py @@ -1,5 +1,5 @@ -from fastapi import FastAPI import uvicorn +from fastapi import FastAPI class BaseAgent: diff --git a/vocode/streaming/user_implemented_agent/restful_agent.py b/vocode/streaming/user_implemented_agent/restful_agent.py index 0d13fff3d8..e8c36f14ac 100644 --- a/vocode/streaming/user_implemented_agent/restful_agent.py +++ b/vocode/streaming/user_implemented_agent/restful_agent.py @@ -1,16 +1,10 @@ # type: ignore # to be deprecated -from .base_agent import BaseAgent -from ..models.agent import ( - RESTfulAgentInput, - RESTfulAgentOutput, - RESTfulAgentText, - RESTfulAgentEnd, -) -from pydantic.v1 import BaseModel from typing import Union -from fastapi import APIRouter + +from ..models.agent import RESTfulAgentEnd, RESTfulAgentInput, RESTfulAgentOutput, RESTfulAgentText +from .base_agent import BaseAgent class RESTfulAgent(BaseAgent): diff --git a/vocode/streaming/utils/__init__.py b/vocode/streaming/utils/__init__.py index 44ae3f1e57..6f2585e090 100644 --- a/vocode/streaming/utils/__init__.py +++ b/vocode/streaming/utils/__init__.py @@ -1,14 +1,17 @@ import asyncio import audioop +import random import secrets -from typing import Any import wave from string import ascii_letters, digits +from typing import Any, AsyncGenerator, AsyncIterator, Callable, List, Tuple, TypeVar -from ..models.audio_encoding import AudioEncoding +from vocode.streaming.models.audio import AudioEncoding custom_alphabet = ascii_letters + digits + ".-_" +ChoiceType = TypeVar("ChoiceType") + def create_loop_in_thread(loop: asyncio.AbstractEventLoop, long_running_task=None): asyncio.set_event_loop(loop) @@ -27,9 +30,7 @@ def convert_linear_audio( ): # downsample if input_sample_rate != output_sample_rate: - raw_wav, _ = audioop.ratecv( - raw_wav, 2, 1, input_sample_rate, output_sample_rate, None - ) + raw_wav, _ = audioop.ratecv(raw_wav, 2, 1, input_sample_rate, output_sample_rate, None) if output_encoding == AudioEncoding.LINEAR16: return raw_wav @@ -66,5 +67,71 @@ def create_conversation_id() -> str: return secrets.token_urlsafe(16) +def create_utterance_id() -> str: + return secrets.token_hex(16) + + def remove_non_letters_digits(text): return "".join(i for i in text if i in custom_alphabet) + + +def unrepeating_randomizer(l: List[ChoiceType]) -> Callable[[], ChoiceType]: + last_choice = None + + def next() -> ChoiceType: + nonlocal last_choice + choice = random.choice(l) + while choice == last_choice: + choice = random.choice(l) + last_choice = choice + return choice + + return next + + +AsyncIteratorGenericType = TypeVar("AsyncIteratorGenericType") + + +async def generate_with_is_last( + async_gen: AsyncGenerator[AsyncIteratorGenericType, None], +) -> AsyncGenerator[Tuple[AsyncIteratorGenericType, bool], None]: + async_iter = async_gen.__aiter__() + try: + next_item = await async_iter.__anext__() + except StopAsyncIteration: + assert False, "Cannot generate with is_last from an empty async generator" + while True: + try: + item = await async_iter.__anext__() + yield next_item, False + next_item = item + except StopAsyncIteration: + yield next_item, True + break + + +async def generate_from_async_iter_with_lookahead( + async_iter: AsyncIterator[AsyncIteratorGenericType], + lookahead: int, +) -> AsyncGenerator[List[AsyncIteratorGenericType], None]: + """Yield sliding window lists of length `lookahead + 1` from an async iterator. + + If the length of async iterator < lookahead + 1, then it should just yield the whole + async iterator as a list. + """ + assert lookahead > 0 + buffer = [] + + stream_length = 0 + while True: + try: + next_item = await async_iter.__anext__() + stream_length += 1 + buffer.append(next_item) + if len(buffer) == lookahead + 1: + yield buffer + buffer = buffer[1:] + except StopAsyncIteration: + if buffer and stream_length <= lookahead: + yield buffer + return diff --git a/vocode/streaming/utils/async_requester.py b/vocode/streaming/utils/async_requester.py new file mode 100644 index 0000000000..5b23875cca --- /dev/null +++ b/vocode/streaming/utils/async_requester.py @@ -0,0 +1,25 @@ +import aiohttp +import httpx + +from vocode.streaming.utils.singleton import Singleton + + +class AsyncRequestor(Singleton): + def __init__(self): + self.session = aiohttp.ClientSession() + self.async_client = httpx.AsyncClient() + + def get_session(self): + if self.session.closed: + self.session = aiohttp.ClientSession() + return self.session + + def get_client(self): + return self.async_client + + async def close_session(self): + if not self.session.closed: + await self.session.close() + + async def close_client(self): + await self.async_client.aclose() diff --git a/vocode/streaming/utils/conversation_logger_adapter.py b/vocode/streaming/utils/conversation_logger_adapter.py deleted file mode 100644 index 16c4cd1cf0..0000000000 --- a/vocode/streaming/utils/conversation_logger_adapter.py +++ /dev/null @@ -1,15 +0,0 @@ -# A logger adapter that adds a conversation_id to the log message. - -import logging - - -class ConversationLoggerAdapter(logging.LoggerAdapter): - def process(self, msg, kwargs): - return "[%s] %s" % (self.extra["conversation_id"], msg), kwargs - - -def wrap_logger(logger, conversation_id): - if isinstance(logger, ConversationLoggerAdapter): - return logger - else: - return ConversationLoggerAdapter(logger, {"conversation_id": conversation_id}) diff --git a/vocode/streaming/utils/create_task.py b/vocode/streaming/utils/create_task.py new file mode 100644 index 0000000000..9554734d05 --- /dev/null +++ b/vocode/streaming/utils/create_task.py @@ -0,0 +1,30 @@ +import asyncio +import functools + +from loguru import logger + +tasks_registry = [] + + +def log_if_exception(reraise_cancelled: bool, future: asyncio.Future) -> None: + try: + if exc := future.exception(): + logger.exception( + f"Vocode wrapped logger; exception raised by task {future}: {exc}", + exc_info=exc, + ) + except asyncio.CancelledError: + if reraise_cancelled: + raise + + +def asyncio_create_task_with_done_error_log( + *args, + reraise_cancelled: bool = False, + **kwargs, +) -> asyncio.Task: + task = asyncio.create_task(*args, **kwargs) + tasks_registry.append(task) + task.add_done_callback(functools.partial(log_if_exception, reraise_cancelled)) + task.add_done_callback(lambda t: tasks_registry.remove(t)) + return task diff --git a/vocode/streaming/utils/events_manager.py b/vocode/streaming/utils/events_manager.py index 818ab80acb..420760ac16 100644 --- a/vocode/streaming/utils/events_manager.py +++ b/vocode/streaming/utils/events_manager.py @@ -1,25 +1,21 @@ from __future__ import annotations -import asyncio - -from vocode.streaming.models.events import Event +import asyncio +from typing import List +from loguru import logger -async def flush_event(event): - if event: - del event +from vocode.streaming.models.events import Event, EventType class EventsManager: - def __init__(self, subscriptions=None): - if subscriptions is None: - subscriptions = [] + def __init__(self, subscriptions: List[EventType] = []): self.queue: asyncio.Queue[Event] = asyncio.Queue() self.subscriptions = set(subscriptions) self.active = False def publish_event(self, event: Event): - if event.type in self.subscriptions: + if event and event.type in self.subscriptions: self.queue.put_nowait(event) async def start(self): @@ -27,19 +23,27 @@ async def start(self): while self.active: try: event = await self.queue.get() - await self.handle_event(event) except asyncio.QueueEmpty: await asyncio.sleep(1) + except asyncio.CancelledError: + break + await self.handle_event(event) async def handle_event(self, event: Event): - pass # Default implementation, can be overridden + pass - async def flush(self, timeout=30): + async def flush(self): + self.active = False while True: try: - event = await asyncio.wait_for(self.queue.get(), timeout) - await flush_event(event) - except asyncio.TimeoutError: - break + event = self.queue.get_nowait() + await self.handle_event(event) except asyncio.QueueEmpty: break + except TypeError as e: + if "NoneType can't be used in 'await' expression" in str(e): + logger.error( + "Handle event was overridden with non-async function. Please override with async function." + ) + else: + raise e from e diff --git a/vocode/streaming/utils/goodbye_model.py b/vocode/streaming/utils/goodbye_model.py deleted file mode 100644 index c500158d68..0000000000 --- a/vocode/streaming/utils/goodbye_model.py +++ /dev/null @@ -1,93 +0,0 @@ -import os -import asyncio -from typing import Optional -import openai -import numpy as np -import requests - -from vocode import getenv - -SIMILARITY_THRESHOLD = 0.9 -EMBEDDING_SIZE = 1536 -GOODBYE_PHRASES = [ - "bye", - "goodbye", - "see you", - "see you later", - "talk to you later", - "talk to you soon", - "have a good day", - "have a good night", -] - - -class GoodbyeModel: - def __init__( - self, - embeddings_cache_path=os.path.join( - os.path.dirname(__file__), "goodbye_embeddings" - ), - openai_api_key: Optional[str] = None, - ): - openai.api_key = openai_api_key or getenv("OPENAI_API_KEY") - if not openai.api_key: - raise ValueError("OPENAI_API_KEY must be set in environment or passed in") - self.embeddings_cache_path = embeddings_cache_path - self.goodbye_embeddings: Optional[np.ndarray] = None - - async def initialize_embeddings(self): - self.goodbye_embeddings = await self.load_or_create_embeddings( - f"{self.embeddings_cache_path}/goodbye_embeddings.npy" - ) - - async def load_or_create_embeddings(self, path): - if os.path.exists(path): - return np.load(path) - else: - embeddings = await self.create_embeddings() - np.save(path, embeddings) - return embeddings - - async def create_embeddings(self): - print("Creating embeddings...") - size = EMBEDDING_SIZE - embeddings = np.empty((size, len(GOODBYE_PHRASES))) - for i, goodbye_phrase in enumerate(GOODBYE_PHRASES): - embeddings[:, i] = await self.create_embedding(goodbye_phrase) - return embeddings - - async def is_goodbye(self, text: str) -> bool: - assert self.goodbye_embeddings is not None, "Embeddings not initialized" - if "bye" in text.lower(): - return True - embedding = await self.create_embedding(text.strip().lower()) - similarity_results = embedding @ self.goodbye_embeddings - return np.max(similarity_results) > SIMILARITY_THRESHOLD - - async def create_embedding(self, text) -> np.ndarray: - params = { - "input": text, - } - - engine = getenv("AZURE_OPENAI_TEXT_EMBEDDING_ENGINE") - if engine: - params["engine"] = engine - else: - params["model"] = "text-embedding-ada-002" - - return np.array( - (await openai.Embedding.acreate(**params))["data"][0]["embedding"] - ) - - -if __name__ == "__main__": - from dotenv import load_dotenv - - load_dotenv() - - async def main(): - model = GoodbyeModel() - while True: - print(await model.is_goodbye(input("Text: "))) - - asyncio.run(main()) diff --git a/vocode/streaming/utils/mp3_helper.py b/vocode/streaming/utils/mp3_helper.py index b0a2af915d..2e3cbea4a8 100644 --- a/vocode/streaming/utils/mp3_helper.py +++ b/vocode/streaming/utils/mp3_helper.py @@ -1,5 +1,6 @@ import io import wave + import miniaudio diff --git a/vocode/streaming/utils/phone_numbers.py b/vocode/streaming/utils/phone_numbers.py new file mode 100644 index 0000000000..0a97432271 --- /dev/null +++ b/vocode/streaming/utils/phone_numbers.py @@ -0,0 +1,42 @@ +import phonenumbers +from phonenumbers import PhoneNumberFormat + +NUMBER_PARSE_ERROR = "Input number cannot be interpreted as a phone number. If passing an international number, please include the country code (e.g. +49 for German numbers)" + + +def parse_number_e164(phone_number: str) -> phonenumbers.PhoneNumber: + if not phone_number.startswith("+"): + phone_number = "+" + phone_number + return phonenumbers.parse(phone_number, None) + + +def parse_number_usa_fallback_to_e164(phone_number: str) -> phonenumbers.PhoneNumber: + try: + phone_number_obj = phonenumbers.parse(phone_number, "US") + valid = phonenumbers.is_valid_number(phone_number_obj) + return phone_number_obj if valid else parse_number_e164(phone_number) + except phonenumbers.phonenumberutil.NumberParseException: + return parse_number_e164(phone_number) + + +def parse_phone_number(phone_number: str) -> phonenumbers.PhoneNumber: + if phone_number.startswith("+"): + # If we have a plus we know its e164 + return parse_number_e164(phone_number) + else: + # If we don't have a plus, we try as USA with e164 fallback + return parse_number_usa_fallback_to_e164(phone_number) + + +def sanitize_phone_number(phone_number: str) -> str: + phone_number_obj: phonenumbers.PhoneNumber + + try: + phone_number_obj = parse_phone_number(phone_number) + except Exception: + raise ValueError(NUMBER_PARSE_ERROR) + + if not phonenumbers.is_valid_number(phone_number_obj): + raise ValueError(NUMBER_PARSE_ERROR) + + return phonenumbers.format_number(phone_number_obj, PhoneNumberFormat.E164).replace("+", "") diff --git a/vocode/streaming/utils/redis.py b/vocode/streaming/utils/redis.py new file mode 100644 index 0000000000..4d492c452a --- /dev/null +++ b/vocode/streaming/utils/redis.py @@ -0,0 +1,79 @@ +import os +from typing import Optional, TypeVar + +from loguru import logger +from redis.asyncio import Redis +from redis.backoff import ExponentialBackoff, NoBackoff +from redis.exceptions import ConnectionError, TimeoutError +from redis.retry import Retry + +from vocode.streaming.utils.singleton import Singleton + +WorkerInputType = TypeVar("WorkerInputType") +# Two separate factories for Redis clients so that the +# typing gets picked up properly + + +def initialize_redis(retries: int = 1): + backoff = ExponentialBackoff() if retries > 1 else NoBackoff() + retry = Retry(backoff, retries) + return Redis( # type: ignore + host=os.environ.get("REDISHOST", "localhost"), + port=int(os.environ.get("REDISPORT", 6379)), + username=os.environ.get("REDISUSER", None), + password=os.environ.get("REDISPASSWORD", None), + decode_responses=True, + retry=retry, + ssl=bool(os.environ.get("REDISSSL", False)), + ssl_cert_reqs="none", + retry_on_error=[ConnectionError, TimeoutError], + health_check_interval=30, + ) + + +def initialize_redis_bytes(): + return Redis( + host=os.environ.get("REDISHOST", "localhost"), + port=int(os.environ.get("REDISPORT", 6379)), + username=os.environ.get("REDISUSER", None), + password=os.environ.get("REDISPASSWORD", None), + db=0, + ssl=bool(os.environ.get("REDISSSL", False)), + ssl_cert_reqs="none", + ) + + +class RedisGenericMessageQueue(Singleton): + """Class representing a Redis Streams message queue.""" + + def __init__( + self, + prefix: Optional[str] = None, + suffix: Optional[str] = None, + ) -> None: + """ + Initialize a RedisGenericMessageQueue instance. + + This initializes a Redis client and sets the name of the stream. + """ + self.redis: Redis = initialize_redis() + queue_name_prefix = f"{prefix}_" if prefix else "" + queue_name_suffix = f"_{suffix}" if suffix else "" + self.queue_name = f"{queue_name_prefix}queue{queue_name_suffix}" + + async def publish(self, message: dict) -> None: + """ + Publishes a message to the Redis stream. + + Args: + message (dict): The message to be published. + + Returns: + None + """ + logger.info(f"[{self.queue_name}] Publishing message: {message}") + try: + await self.redis.xadd(self.queue_name, message) + except Exception as e: + logger.exception(f"[{self.queue_name}] Failed to publish message: {message}") + raise e diff --git a/vocode/streaming/utils/redis_conversation_message_queue.py b/vocode/streaming/utils/redis_conversation_message_queue.py new file mode 100644 index 0000000000..a4c6e00caa --- /dev/null +++ b/vocode/streaming/utils/redis_conversation_message_queue.py @@ -0,0 +1,35 @@ +from typing import AsyncGenerator + +from loguru import logger +from pydantic.v1 import BaseModel, parse_obj_as +from redis.asyncio import Redis + +from vocode.streaming.utils.redis import initialize_redis +from vocode.streaming.utils.singleton import Singleton + + +class RedisMessage(BaseModel): + type: str + + +class RedisConversationMessageQueue(Singleton): + def __init__(self): + self.redis: Redis = initialize_redis() + + async def publish(self, conversation_id: str, message: RedisMessage): + logger.info(f"Publishing message to {conversation_id}") + await self.redis.xadd(f"{conversation_id}:stream", message.dict()) # type: ignore + + async def wait_for_messages( + self, conversation_id: str, timeout_seconds: int = 20 + ) -> AsyncGenerator[RedisMessage, None]: + logger.info(f"Waiting for message from {conversation_id}") + streams = await self.redis.xread( + {f"{conversation_id}:stream": "$"}, block=timeout_seconds * 1000 + ) + for _, stream in streams: # stream_id, stream + for _, message in stream: # timestamp, message + yield parse_obj_as(RedisMessage, message) # type: ignore + + async def clear_stream(self, conversation_id: str): + await self.redis.delete(f"{conversation_id}:stream") diff --git a/vocode/streaming/utils/singleton.py b/vocode/streaming/utils/singleton.py new file mode 100644 index 0000000000..eefcd9c127 --- /dev/null +++ b/vocode/streaming/utils/singleton.py @@ -0,0 +1,14 @@ +from typing import Any, Dict + + +class SingletonMeta(type): + _instances: Dict[Any, Any] = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] + + +class Singleton(metaclass=SingletonMeta): + pass diff --git a/vocode/streaming/utils/speed_manager.py b/vocode/streaming/utils/speed_manager.py new file mode 100644 index 0000000000..421524f4d6 --- /dev/null +++ b/vocode/streaming/utils/speed_manager.py @@ -0,0 +1,44 @@ +from loguru import logger + +from vocode.streaming.models.transcriber import Transcription + +LEARNING_RATE = 0.1 +LENGTH_THRESHOLD = 5 +SMOOTHING_FACTOR = 3 +BASE_WPM = 150.0 + + +class SpeedManager: + """ + Uses the WPM of incoming transcriptions to update a speed coefficient to inform conversation orchestration. + + speed_coefficient is used in two places (currently): + - DeepgramTranscriber endpointing - when we receive fast utterances from the user, we decrease the endpointing threshold to match the speed of the user + - Interruption logic - if the user is speaking slowly, then when the agent is responding to an interrupt, we wait longer + + Initializes with a speed coefficient of 1.0, which corresponds to a WPM of 150.0 and uses a moving average to update the speed coefficient based on incoming transcriptions. + """ + + def __init__(self, speed_coefficient: float = 1.0): + self.wpm_0 = BASE_WPM * speed_coefficient + self.wpm = self.wpm_0 + self.speed_coefficient = speed_coefficient + + def update(self, transcription: Transcription): + transcription_wpm = transcription.wpm() + if transcription_wpm is not None: + length = len(transcription.message.strip().split()) + p_t = min( + 1, + LEARNING_RATE + * ((length + SMOOTHING_FACTOR) / (LENGTH_THRESHOLD + SMOOTHING_FACTOR)), + ) + self.wpm = self.wpm * (1 - p_t) + transcription_wpm * p_t + self.speed_coefficient = self.wpm / BASE_WPM + logger.info(f"Set speed coefficient to {self.speed_coefficient}") + + def get_speed_coefficient(self): + return self.speed_coefficient + + def get_wpm(self): + return self.wpm diff --git a/vocode/streaming/utils/state_manager.py b/vocode/streaming/utils/state_manager.py index b45f6704ee..b67eb1bd20 100644 --- a/vocode/streaming/utils/state_manager.py +++ b/vocode/streaming/utils/state_manager.py @@ -1,23 +1,85 @@ -import asyncio from typing import TYPE_CHECKING, Optional -from vocode.streaming.models.message import BaseMessage + from vocode.streaming.models.transcriber import EndpointingConfig -from vocode.streaming.agent.base_agent import AgentResponseMessage +from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer +from vocode.streaming.telephony.client.twilio_client import TwilioClient +from vocode.streaming.telephony.client.vonage_client import VonageClient +from vocode.streaming.utils.redis_conversation_message_queue import RedisConversationMessageQueue if TYPE_CHECKING: from vocode.streaming.streaming_conversation import StreamingConversation - from vocode.streaming.telephony.conversation.vonage_call import VonageCall - from vocode.streaming.telephony.conversation.twilio_call import TwilioCall + from vocode.streaming.telephony.conversation.abstract_phone_conversation import ( + AbstractPhoneConversation, + ) + from vocode.streaming.telephony.conversation.twilio_phone_conversation import ( + TwilioPhoneConversation, + ) + from vocode.streaming.telephony.conversation.vonage_phone_conversation import ( + VonagePhoneConversation, + ) + + +# TODO: make this a proper ABC +class AbstractConversationStateManager: + @property + def logger(self): + raise NotImplementedError + + @property + def transcript(self): + raise NotImplementedError + + def get_transcriber_endpointing_config(self) -> Optional[EndpointingConfig]: + raise NotImplementedError + + def set_transcriber_endpointing_config(self, endpointing_config: EndpointingConfig): + raise NotImplementedError + + def disable_synthesis(self): + raise NotImplementedError + + def enable_synthesis(self): + raise NotImplementedError + + def mute_agent(self): + raise NotImplementedError + + def unmute_agent(self): + raise NotImplementedError + + def using_input_streaming_synthesizer(self): + raise NotImplementedError + + async def terminate_conversation(self): + raise NotImplementedError + + def get_conversation_id(self): + raise NotImplementedError -class ConversationStateManager: +class AbstractPhoneConversationStateManager(AbstractConversationStateManager): + def get_config_manager(self): + raise NotImplementedError + + def get_to_phone(self): + raise NotImplementedError + + def get_from_phone(self): + raise NotImplementedError + + +class ConversationStateManager(AbstractConversationStateManager): def __init__(self, conversation: "StreamingConversation"): self._conversation = conversation + if not hasattr(self, "redis_message_queue"): + self.redis_message_queue = RedisConversationMessageQueue() + + @property + def transcript(self): + return self._conversation.transcript def get_transcriber_endpointing_config(self) -> Optional[EndpointingConfig]: - return ( - self._conversation.transcriber.get_transcriber_config().endpointing_config - ) + return self._conversation.transcriber.get_transcriber_config().endpointing_config def set_transcriber_endpointing_config(self, endpointing_config: EndpointingConfig): assert self.get_transcriber_endpointing_config() is not None @@ -37,30 +99,66 @@ def mute_agent(self): def unmute_agent(self): self._conversation.agent.is_muted = False + def using_input_streaming_synthesizer(self): + return isinstance( + self._conversation.synthesizer, + InputStreamingSynthesizer, + ) + async def terminate_conversation(self): - await self._conversation.terminate() - - def send_bot_message(self, message: BaseMessage) -> asyncio.Event: - # returns an asyncio.Event that will be set when the agent has finished uttering the message - agent_response_tracker = asyncio.Event() - self._conversation.agent.produce_interruptible_agent_response_event_nonblocking( - item=AgentResponseMessage( - message=message, - is_interruptible=False, - ), - is_interruptible=False, - agent_response_tracker=agent_response_tracker, + self._conversation.mark_terminated() + + def set_call_check_for_idle_paused(self, value: bool): + if not self._conversation: + return + self._conversation.set_check_for_idle_paused(value) + + def get_conversation_id(self): + return self._conversation.id + + +class PhoneConversationStateManager( + AbstractPhoneConversationStateManager, ConversationStateManager +): + def __init__(self, conversation: "AbstractPhoneConversation"): + ConversationStateManager.__init__(self, conversation) + self._phone_conversation = conversation + + def get_config_manager(self): + return self._phone_conversation.config_manager + + def get_to_phone(self): + return self._phone_conversation.to_phone + + def get_from_phone(self): + return self._phone_conversation.from_phone + + def get_direction(self): + return self._phone_conversation.direction + + +class VonagePhoneConversationStateManager(PhoneConversationStateManager): + def __init__(self, conversation: "VonagePhoneConversation"): + super().__init__(conversation=conversation) + self._vonage_phone_conversation = conversation + + def create_vonage_client(self): + return VonageClient( + base_url=self._vonage_phone_conversation.base_url, + maybe_vonage_config=self._vonage_phone_conversation.vonage_config, ) - return agent_response_tracker -class VonageCallStateManager(ConversationStateManager): - def __init__(self, call: "VonageCall"): - super().__init__(call) - self._call = call +class TwilioPhoneConversationStateManager(PhoneConversationStateManager): + def __init__(self, conversation: "TwilioPhoneConversation"): + super().__init__(conversation=conversation) + self._twilio_phone_conversation = conversation + def get_twilio_config(self): + return self._twilio_phone_conversation.twilio_config -class TwilioCallStateManager(ConversationStateManager): - def __init__(self, call: "TwilioCall"): - super().__init__(call) - self._call = call + def create_twilio_client(self): + return TwilioClient( + base_url=self._twilio_phone_conversation.base_url, + maybe_twilio_config=self.get_twilio_config(), + ) diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index d015994073..80021b580f 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -2,13 +2,12 @@ import asyncio import threading -import janus -from typing import Any, Optional -from typing import TypeVar, Generic -import logging +from typing import Any, Generic, Optional, TypeVar +import janus +from loguru import logger -logger = logging.getLogger(__name__) +from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log WorkerInputType = TypeVar("WorkerInputType") @@ -24,7 +23,11 @@ def __init__( self.output_queue = output_queue def start(self) -> asyncio.Task: - self.worker_task = asyncio.create_task(self._run_loop()) + self.worker_task = asyncio_create_task_with_done_error_log( + self._run_loop(), + ) + if not self.worker_task: + raise Exception("Worker task not created") return self.worker_task def consume_nonblocking(self, item: WorkerInputType): @@ -57,7 +60,11 @@ def __init__( def start(self) -> asyncio.Task: self.worker_thread = threading.Thread(target=self._run_loop) self.worker_thread.start() - self.worker_task = asyncio.create_task(self.run_thread_forwarding()) + self.worker_task = asyncio_create_task_with_done_error_log( + self.run_thread_forwarding(), + ) + if not self.worker_task: + raise Exception("Worker task not created") return self.worker_task async def run_thread_forwarding(self): @@ -94,7 +101,7 @@ async def _run_loop(self): await self.process(item) except asyncio.CancelledError: return - except Exception as e: + except Exception: logger.exception("AsyncQueueWorker", exc_info=True) async def process(self, item): @@ -143,6 +150,10 @@ def __init__( super().__init__(payload, is_interruptible, interruption_event) self.agent_response_tracker = agent_response_tracker + def interrupt(self) -> bool: + self.agent_response_tracker.set() + return super().interrupt() + class InterruptibleEventFactory: def create_interruptible_event( @@ -181,13 +192,9 @@ def __init__( self.current_task = None self.interruptible_event = None - def produce_interruptible_event_nonblocking( - self, item: Any, is_interruptible: bool = True - ): - interruptible_event = ( - self.interruptible_event_factory.create_interruptible_event( - item, is_interruptible=is_interruptible - ) + def produce_interruptible_event_nonblocking(self, item: Any, is_interruptible: bool = True): + interruptible_event = self.interruptible_event_factory.create_interruptible_event( + item, is_interruptible=is_interruptible ) return super().produce_nonblocking(interruptible_event) @@ -209,16 +216,24 @@ def produce_interruptible_agent_response_event_nonblocking( async def _run_loop(self): # TODO Implement concurrency with max_nb_of_thread while True: - item = await self.input_queue.get() + try: + item = await self.input_queue.get() + except asyncio.CancelledError: + return + if item.is_interrupted(): continue self.interruptible_event = item - self.current_task = asyncio.create_task(self.process(item)) + self.current_task = asyncio_create_task_with_done_error_log( + self.process(item), + reraise_cancelled=True, + ) + try: await self.current_task except asyncio.CancelledError: return - except Exception as e: + except Exception: logger.exception("InterruptibleWorker", exc_info=True) self.interruptible_event.is_interruptible = False self.current_task = None @@ -246,7 +261,5 @@ def cancel_current_task(self): return False -class InterruptibleAgentResponseWorker( - InterruptibleWorker[InterruptibleAgentResponseEvent] -): +class InterruptibleAgentResponseWorker(InterruptibleWorker[InterruptibleAgentResponseEvent]): pass diff --git a/vocode/streaming/vector_db/base_vector_db.py b/vocode/streaming/vector_db/base_vector_db.py index 7127a2b221..19a0aa3181 100644 --- a/vocode/streaming/vector_db/base_vector_db.py +++ b/vocode/streaming/vector_db/base_vector_db.py @@ -1,13 +1,20 @@ import os -from typing import Iterable, List, Optional, Tuple +from typing import TYPE_CHECKING, Iterable, List, Optional, Tuple, Union + import aiohttp -import openai -from langchain.docstore.document import Document +from openai import AsyncAzureOpenAI, AsyncOpenAI + +from vocode.streaming.models.agent import AZURE_OPENAI_DEFAULT_API_VERSION + +if TYPE_CHECKING: + from langchain.docstore.document import Document DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-ada-002" class VectorDB: + openai_client: Union[AsyncOpenAI, AsyncAzureOpenAI] + def __init__( self, aiohttp_session: Optional[aiohttp.ClientSession] = None, @@ -20,6 +27,20 @@ def __init__( self.aiohttp_session = aiohttp.ClientSession() self.should_close_session_on_tear_down = True + self.engine = os.getenv("AZURE_OPENAI_TEXT_EMBEDDING_ENGINE") + if self.engine: + azure_base = os.getenv("AZURE_OPENAI_API_BASE_EAST_US") + azure_base = azure_base if azure_base is not None else "" + self.openai_client = AsyncAzureOpenAI( + azure_endpoint=azure_base, + api_key=os.getenv("AZURE_OPENAI_API_KEY_EAST_US"), + api_version=AZURE_OPENAI_DEFAULT_API_VERSION, + ) + else: + self.openai_client = AsyncOpenAI( + api_key=os.getenv("OPENAI_API_KEY"), + ) + async def create_openai_embedding( self, text, model=DEFAULT_OPENAI_EMBEDDING_MODEL ) -> List[float]: @@ -27,13 +48,9 @@ async def create_openai_embedding( "input": text, } - engine = os.getenv("AZURE_OPENAI_TEXT_EMBEDDING_ENGINE") - if engine: - params["engine"] = engine - else: - params["model"] = model + params["model"] = self.engine if self.engine else model - return list((await openai.Embedding.acreate(**params))["data"][0]["embedding"]) + return (await self.openai_client.embeddings.create(**params)).data[0].embedding async def add_texts( self, @@ -49,7 +66,7 @@ async def similarity_search_with_score( query: str, filter: Optional[dict] = None, namespace: Optional[str] = None, - ) -> List[Tuple[Document, float]]: + ) -> List[Tuple["Document", float]]: raise NotImplementedError async def tear_down(self): diff --git a/vocode/streaming/vector_db/factory.py b/vocode/streaming/vector_db/factory.py index 1889081b71..9ce03bab73 100644 --- a/vocode/streaming/vector_db/factory.py +++ b/vocode/streaming/vector_db/factory.py @@ -1,9 +1,12 @@ -import logging -from typing import Optional +from typing import TYPE_CHECKING, Optional + import aiohttp + from vocode.streaming.models.vector_db import PineconeConfig, VectorDBConfig from vocode.streaming.vector_db.base_vector_db import VectorDB -from vocode.streaming.vector_db.pinecone import PineconeDB + +if TYPE_CHECKING: + from vocode.streaming.vector_db.pinecone import PineconeDB class VectorDBFactory: @@ -13,5 +16,17 @@ def create_vector_db( aiohttp_session: Optional[aiohttp.ClientSession] = None, ) -> VectorDB: if isinstance(vector_db_config, PineconeConfig): - return PineconeDB(vector_db_config, aiohttp_session=aiohttp_session) + return self._get_pinecone_db(vector_db_config, aiohttp_session) raise Exception("Invalid vector db config", vector_db_config.type) + + def _get_pinecone_db( + self, vector_db_config: PineconeConfig, aiohttp_session: Optional[aiohttp.ClientSession] + ) -> "PineconeDB": + try: + from vocode.streaming.vector_db.pinecone import PineconeDB + + return PineconeDB(vector_db_config, aiohttp_session=aiohttp_session) + except ImportError as e: + raise ImportError( + f"Missing required dependancies for VectorDB {vector_db_config.type}" + ) from e diff --git a/vocode/streaming/vector_db/pinecone.py b/vocode/streaming/vector_db/pinecone.py index 646590860d..26cd048f36 100644 --- a/vocode/streaming/vector_db/pinecone.py +++ b/vocode/streaming/vector_db/pinecone.py @@ -1,13 +1,13 @@ -import logging -from typing import Iterable, List, Optional, Tuple import uuid +from typing import Iterable, List, Optional, Tuple + from langchain.docstore.document import Document +from loguru import logger + from vocode import getenv from vocode.streaming.models.vector_db import PineconeConfig from vocode.streaming.vector_db.base_vector_db import VectorDB -logger = logging.getLogger(__name__) - class PineconeDB(VectorDB): def __init__(self, config: PineconeConfig, *args, **kwargs) -> None: @@ -16,12 +16,8 @@ def __init__(self, config: PineconeConfig, *args, **kwargs) -> None: self.index_name = self.config.index self.pinecone_api_key = getenv("PINECONE_API_KEY") or self.config.api_key - self.pinecone_environment = ( - getenv("PINECONE_ENVIRONMENT") or self.config.api_environment - ) - self.pinecone_url = ( - f"https://{self.index_name}.svc.{self.pinecone_environment}.pinecone.io" - ) + self.pinecone_environment = getenv("PINECONE_ENVIRONMENT") or self.config.api_environment + self.pinecone_url = f"https://{self.index_name}.svc.{self.pinecone_environment}.pinecone.io" self._text_key = "text" async def add_texts( @@ -109,7 +105,5 @@ async def similarity_search_with_score( score = res["score"] docs.append((Document(page_content=text, metadata=metadata), score)) else: - logger.warning( - f"Found document with no `{self._text_key}` key. Skipping." - ) + logger.warning(f"Found document with no `{self._text_key}` key. Skipping.") return docs diff --git a/vocode/turn_based/agent/__init__.py b/vocode/turn_based/agent/__init__.py deleted file mode 100644 index c0291ecb72..0000000000 --- a/vocode/turn_based/agent/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from vocode.turn_based.agent.base_agent import BaseAgent -from vocode.turn_based.agent.chat_gpt_agent import ChatGPTAgent -from vocode.turn_based.agent.echo_agent import EchoAgent -from vocode.turn_based.agent.gpt4all_agent import GPT4AllAgent diff --git a/vocode/turn_based/agent/chat_gpt_agent.py b/vocode/turn_based/agent/chat_gpt_agent.py index 37e6e5b0e7..a6d8ac41c9 100644 --- a/vocode/turn_based/agent/chat_gpt_agent.py +++ b/vocode/turn_based/agent/chat_gpt_agent.py @@ -1,16 +1,8 @@ -from typing import Optional +from typing import Any, List, Optional + import openai -from langchain.prompts import ( - ChatPromptTemplate, - MessagesPlaceholder, - SystemMessagePromptTemplate, - HumanMessagePromptTemplate, -) -from langchain.chains import ConversationChain -from langchain_community.chat_models import ChatOpenAI -from langchain.memory import ConversationBufferMemory -from vocode import getenv +from vocode import getenv from vocode.turn_based.agent.base_agent import BaseAgent @@ -23,32 +15,41 @@ def __init__( model_name: str = "gpt-3.5-turbo", temperature: float = 0.7, max_tokens: int = 100, - memory: Optional[ConversationBufferMemory] = None, ): super().__init__(initial_message=initial_message) openai.api_key = getenv("OPENAI_API_KEY", api_key) if not openai.api_key: raise ValueError("OpenAI API key not provided") - self.prompt = ChatPromptTemplate.from_messages( - [ - SystemMessagePromptTemplate.from_template(system_prompt), - MessagesPlaceholder(variable_name="history"), - HumanMessagePromptTemplate.from_template("{input}"), - ] - ) - self.memory = ( - memory if memory else ConversationBufferMemory(return_messages=True) + self.client = openai.OpenAI() + self.prompt = system_prompt + self.model_name = model_name + self.messages: List[Any] = [ + { + "role": "system", + "content": system_prompt, + }, + { + "role": "assistant", + "content": initial_message, + }, + ] + + def respond(self, human_input: str): + self.messages.append( + { + "role": "user", + "content": human_input, + } ) - if initial_message: - self.memory.chat_memory.add_ai_message(initial_message) - self.llm = ChatOpenAI( # type: ignore - model_name=model_name, - temperature=temperature, - max_tokens=max_tokens, + response = self.client.chat.completions.create( + model=self.model_name, + messages=self.messages, ) - self.conversation = ConversationChain( - memory=self.memory, prompt=self.prompt, llm=self.llm + content = response.choices[0].message.content + self.messages.append( + { + "role": "system", + "content": content, + } ) - - def respond(self, human_input: str): - return self.conversation.predict(input=human_input) + return content diff --git a/vocode/turn_based/agent/gpt4all_agent.py b/vocode/turn_based/agent/gpt4all_agent.py index 71495b1393..f5e5e3dd5f 100644 --- a/vocode/turn_based/agent/gpt4all_agent.py +++ b/vocode/turn_based/agent/gpt4all_agent.py @@ -1,10 +1,14 @@ import asyncio -from concurrent.futures import ThreadPoolExecutor, wait -import logging import sys +from concurrent.futures import ThreadPoolExecutor, wait from typing import Optional + +from loguru import logger + from vocode.turn_based.agent.base_agent import BaseAgent +raise DeprecationWarning("This Agent is deprecated and will be removed in the future.") + class StopThreadException(Exception): pass @@ -20,13 +24,11 @@ def __init__( model_path: str, system_prompt: str, initial_message: Optional[str] = None, - logger: Optional[logging.Logger] = None, ): from pygpt4all.models.gpt4all_j import GPT4All_J super().__init__(initial_message) self.prompt_template = f"{system_prompt}\n\n{self.DEFAULT_PROMPT_TEMPLATE}" - self.logger = logger or logging.getLogger(__name__) self.memory = [f"AI: {initial_message}"] if initial_message else [] self.llm = GPT4All_J(model_path) self.thread_pool_executor = ThreadPoolExecutor(max_workers=1) @@ -42,16 +44,14 @@ def respond( self, human_input, ) -> str: - self.logger.debug("LLM responding to human input") + logger.debug("LLM responding to human input") prompt = self.create_prompt(human_input) response_buffer = "" def new_text_callback(text): nonlocal response_buffer response_buffer += text - if len(response_buffer) > len(prompt) and response_buffer.endswith( - "Human:" - ): + if len(response_buffer) > len(prompt) and response_buffer.endswith("Human:"): response_buffer = response_buffer[: -len("Human:")] sys.exit() @@ -63,7 +63,7 @@ def new_text_callback(text): wait([future], timeout=10) response = response_buffer[(len(prompt) + 1) :] self.memory.append(self.get_memory_entry(human_input, response)) - self.logger.debug(f"LLM response: {response}") + logger.debug(f"LLM response: {response}") return response async def respond_async(self, human_input) -> str: @@ -73,9 +73,7 @@ async def respond_async(self, human_input) -> str: def new_text_callback(text): nonlocal response_buffer response_buffer += text - if len(response_buffer) > len(prompt) and response_buffer.endswith( - "Human:" - ): + if len(response_buffer) > len(prompt) and response_buffer.endswith("Human:"): response_buffer = response_buffer[: -len("Human:")] raise StopThreadException("Stopping the thread") diff --git a/vocode/turn_based/input_device/microphone_input.py b/vocode/turn_based/input_device/microphone_input.py index 4ee35b449c..9a032bfa0a 100644 --- a/vocode/turn_based/input_device/microphone_input.py +++ b/vocode/turn_based/input_device/microphone_input.py @@ -1,9 +1,10 @@ +import io +import wave from typing import Optional -import sounddevice as sd + import numpy as np +import sounddevice as sd from pydub import AudioSegment -import io -import wave from vocode.turn_based.input_device.base_input_device import BaseInputDevice diff --git a/vocode/turn_based/output_device/speaker_output.py b/vocode/turn_based/output_device/speaker_output.py index 24a475b989..a0b35dc4da 100644 --- a/vocode/turn_based/output_device/speaker_output.py +++ b/vocode/turn_based/output_device/speaker_output.py @@ -1,6 +1,7 @@ from typing import Optional -import sounddevice as sd + import numpy as np +import sounddevice as sd from pydub import AudioSegment from vocode.turn_based.output_device.base_output_device import BaseOutputDevice diff --git a/vocode/turn_based/synthesizer/__init__.py b/vocode/turn_based/synthesizer/__init__.py deleted file mode 100644 index 3353d6dd0f..0000000000 --- a/vocode/turn_based/synthesizer/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from vocode.turn_based.synthesizer.azure_synthesizer import AzureSynthesizer -from vocode.turn_based.synthesizer.bark_synthesizer import BarkSynthesizer -from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer -from vocode.turn_based.synthesizer.coqui_synthesizer import CoquiSynthesizer -from vocode.turn_based.synthesizer.coqui_tts_synthesizer import CoquiTTSSynthesizer -from vocode.turn_based.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer -from vocode.turn_based.synthesizer.google_synthesizer import GoogleSynthesizer -from vocode.turn_based.synthesizer.gtts_synthesizer import GTTSSynthesizer -from vocode.turn_based.synthesizer.play_ht_synthesizer import PlayHtSynthesizer -from vocode.turn_based.synthesizer.rime_synthesizer import RimeSynthesizer -from vocode.turn_based.synthesizer.polly_synthesizer import PollySynthesizer -from vocode.turn_based.synthesizer.stream_elements_synthesizer import ( - StreamElementsSynthesizer, -) diff --git a/vocode/turn_based/synthesizer/azure_synthesizer.py b/vocode/turn_based/synthesizer/azure_synthesizer.py index 19f3c59378..b5221edda2 100644 --- a/vocode/turn_based/synthesizer/azure_synthesizer.py +++ b/vocode/turn_based/synthesizer/azure_synthesizer.py @@ -1,9 +1,10 @@ from typing import Optional from xml.etree import ElementTree + from pydub import AudioSegment from regex import D -from vocode import getenv +from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer DEFAULT_SAMPLING_RATE = 22050 diff --git a/vocode/turn_based/synthesizer/bark_synthesizer.py b/vocode/turn_based/synthesizer/bark_synthesizer.py index ffedabf842..80f43f1e1d 100644 --- a/vocode/turn_based/synthesizer/bark_synthesizer.py +++ b/vocode/turn_based/synthesizer/bark_synthesizer.py @@ -1,27 +1,27 @@ import io -from typing import Optional -import numpy as np import logging + +import numpy as np +from loguru import logger from pydub import AudioSegment from scipy.io.wavfile import write as write_wav + from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer class BarkSynthesizer(BaseSynthesizer): - def __init__( - self, logger: Optional[logging.Logger] = None, silent: bool = False, **kwargs - ) -> None: + def __init__(self, silent: bool = False, **kwargs) -> None: from bark import SAMPLE_RATE, generate_audio, preload_models self.SAMPLE_RATE = SAMPLE_RATE self.generate_audio = generate_audio - self.logger = logger or logging.getLogger(__name__) - self.logger.info("Loading Bark models") + logger = logger or logging.getLogger(__name__) + logger.info("Loading Bark models") self.silent = silent preload_models(**kwargs) def synthesize(self, text: str, **kwargs) -> AudioSegment: - self.logger.debug("Bark synthesizing audio") + logger.debug("Bark synthesizing audio") audio_array = self.generate_audio(text, silent=self.silent, **kwargs) int_audio_arr = (audio_array * np.iinfo(np.int16).max).astype(np.int16) diff --git a/vocode/turn_based/synthesizer/coqui_synthesizer.py b/vocode/turn_based/synthesizer/coqui_synthesizer.py index bc53f8389b..d39570dcc0 100644 --- a/vocode/turn_based/synthesizer/coqui_synthesizer.py +++ b/vocode/turn_based/synthesizer/coqui_synthesizer.py @@ -1,13 +1,17 @@ +import asyncio import io import re import typing -from typing import Optional, List -from pydub import AudioSegment +from typing import List, Optional + +import aiohttp import requests +from pydub import AudioSegment + from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer -import aiohttp -import asyncio + +raise DeprecationWarning("This Synthesizer is deprecated and will be removed in the future.") COQUI_BASE_URL = "https://app.coqui.ai/api/v2/samples" DEFAULT_SPEAKER_ID = "d2bd7ccb-1b65-4005-9578-32c4e02d8ddf" @@ -98,10 +102,7 @@ async def async_synthesize(self, text: str) -> AudioSegment: text_chunks = self.split_text(text) # Create a list of tasks for each chunk using asyncio.create_task() - tasks = [ - asyncio.create_task(self.async_synthesize_chunk(chunk)) - for chunk in text_chunks - ] + tasks = [asyncio.create_task(self.async_synthesize_chunk(chunk)) for chunk in text_chunks] # Wait for all tasks to complete using asyncio.gather() audio_chunks = await asyncio.gather(*tasks) diff --git a/vocode/turn_based/synthesizer/coqui_tts_synthesizer.py b/vocode/turn_based/synthesizer/coqui_tts_synthesizer.py index c1f2ca6f92..579d8512c3 100644 --- a/vocode/turn_based/synthesizer/coqui_tts_synthesizer.py +++ b/vocode/turn_based/synthesizer/coqui_tts_synthesizer.py @@ -1,9 +1,10 @@ import io from typing import Optional -from pydub import AudioSegment -from vocode import getenv + import numpy +from pydub import AudioSegment +from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer diff --git a/vocode/turn_based/synthesizer/eleven_labs_synthesizer.py b/vocode/turn_based/synthesizer/eleven_labs_synthesizer.py index 9c5b2ffda0..68b77fb7fa 100644 --- a/vocode/turn_based/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/turn_based/synthesizer/eleven_labs_synthesizer.py @@ -1,6 +1,10 @@ import io from typing import Optional + +from elevenlabs import Voice, VoiceSettings +from elevenlabs.client import ElevenLabs from pydub import AudioSegment + from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer @@ -13,12 +17,13 @@ def __init__( similarity_boost: Optional[float] = None, api_key: Optional[str] = None, ): - import elevenlabs - - self.elevenlabs = elevenlabs self.voice_id = voice_id self.api_key = getenv("ELEVEN_LABS_API_KEY", api_key) + + self.elevenlabs_client = ElevenLabs( + api_key=self.api_key, + ) self.validate_stability_and_similarity_boost(stability, similarity_boost) self.stability = stability self.similarity_boost = similarity_boost @@ -27,18 +32,19 @@ def validate_stability_and_similarity_boost( self, stability: Optional[float], similarity_boost: Optional[float] ) -> None: if (stability is None) != (similarity_boost is None): - raise ValueError( - "Both stability and similarity_boost must be set or not set." - ) + raise ValueError("Both stability and similarity_boost must be set or not set.") def synthesize(self, text: str) -> AudioSegment: - self.elevenlabs.set_api_key(self.api_key) - voice = self.elevenlabs.Voice(voice_id=self.voice_id) if self.stability is not None and self.similarity_boost is not None: - voice.settings = self.elevenlabs.VoiceSettings( - stability=self.stability, similarity_boost=self.similarity_boost + voice = Voice( + voice_id=self.voice_id, + settings=VoiceSettings( + stability=self.stability, similarity_boost=self.similarity_boost + ), ) + else: + voice = Voice(voice_id=self.voice_id) - audio = self.elevenlabs.generate(text, voice=voice) + audio = self.elevenlabs_client.generate(text=text, voice=voice) return AudioSegment.from_mp3(io.BytesIO(audio)) # type: ignore diff --git a/vocode/turn_based/synthesizer/google_synthesizer.py b/vocode/turn_based/synthesizer/google_synthesizer.py index 6c55a64619..ace1fe9586 100644 --- a/vocode/turn_based/synthesizer/google_synthesizer.py +++ b/vocode/turn_based/synthesizer/google_synthesizer.py @@ -1,9 +1,11 @@ import io from typing import Optional + +from google.cloud import texttospeech_v1beta1 as tts # type: ignore from pydub import AudioSegment + from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer -from google.cloud import texttospeech_v1beta1 as tts DEFAULT_LANGUAGE_CODE = "en-US" DEFAULT_VOICE_NAME = "en-US-Neural2-I" @@ -11,9 +13,7 @@ DEFAULT_SPEAKING_RATE = 1.2 DEFAULT_SAMPLE_RATE = 24000 DEFAULT_AUDIO_ENCODING = tts.AudioEncoding.LINEAR16 -DEFAULT_TIME_POINTING = [ - tts.SynthesizeSpeechRequest.TimepointType.TIMEPOINT_TYPE_UNSPECIFIED -] +DEFAULT_TIME_POINTING = [tts.SynthesizeSpeechRequest.TimepointType.TIMEPOINT_TYPE_UNSPECIFIED] class GoogleSynthesizer(BaseSynthesizer): diff --git a/vocode/turn_based/synthesizer/gtts_synthesizer.py b/vocode/turn_based/synthesizer/gtts_synthesizer.py index 6502415116..12be8dde38 100644 --- a/vocode/turn_based/synthesizer/gtts_synthesizer.py +++ b/vocode/turn_based/synthesizer/gtts_synthesizer.py @@ -1,7 +1,9 @@ +from io import BytesIO from os import PathLike from typing import Any + from pydub import AudioSegment -from io import BytesIO + from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer diff --git a/vocode/turn_based/synthesizer/play_ht_synthesizer.py b/vocode/turn_based/synthesizer/play_ht_synthesizer.py index 2481c17eb1..00d5e84be2 100644 --- a/vocode/turn_based/synthesizer/play_ht_synthesizer.py +++ b/vocode/turn_based/synthesizer/play_ht_synthesizer.py @@ -1,13 +1,14 @@ import io from typing import Optional -from pydub import AudioSegment + import requests -from vocode import getenv -from vocode.streaming.telephony.constants import DEFAULT_SAMPLING_RATE +from pydub import AudioSegment +from vocode import getenv +from vocode.streaming.models.audio import SamplingRate from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer -DEFAULT_SAMPLING_RATE = 24000 +DEFAULT_SAMPLING_RATE = SamplingRate.RATE_24000 TTS_ENDPOINT = "https://play.ht/api/v2/tts/stream" @@ -50,8 +51,6 @@ def synthesize( response = requests.post(TTS_ENDPOINT, headers=headers, json=body, timeout=5) if not response.ok: - raise Exception( - f"Play.ht API error: {response.status_code}, {response.text}" - ) + raise Exception(f"Play.ht API error: {response.status_code}, {response.text}") return AudioSegment.from_mp3(io.BytesIO(response.content)) # type: ignore diff --git a/vocode/turn_based/synthesizer/polly_synthesizer.py b/vocode/turn_based/synthesizer/polly_synthesizer.py index e8ad71de5d..58fec724a8 100644 --- a/vocode/turn_based/synthesizer/polly_synthesizer.py +++ b/vocode/turn_based/synthesizer/polly_synthesizer.py @@ -1,8 +1,9 @@ import io -from pydub import AudioSegment -from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer import boto3 +from pydub import AudioSegment + +from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer DEFAULT_SAMPLING_RATE = 16000 DEFAULT_LANGUAGE_CODE = "en-US" diff --git a/vocode/turn_based/synthesizer/rime_synthesizer.py b/vocode/turn_based/synthesizer/rime_synthesizer.py index 5e1da52736..99fdc406d0 100644 --- a/vocode/turn_based/synthesizer/rime_synthesizer.py +++ b/vocode/turn_based/synthesizer/rime_synthesizer.py @@ -1,10 +1,11 @@ import base64 import io from typing import Optional -from pydub import AudioSegment + import requests -from vocode import getenv +from pydub import AudioSegment +from vocode import getenv from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer RIME_BASE_URL = "https://rjmopratfrdjgmfmaios.functions.supabase.co/rime-tts" diff --git a/vocode/turn_based/synthesizer/stream_elements_synthesizer.py b/vocode/turn_based/synthesizer/stream_elements_synthesizer.py index ff91c64894..1bb1ddc22b 100644 --- a/vocode/turn_based/synthesizer/stream_elements_synthesizer.py +++ b/vocode/turn_based/synthesizer/stream_elements_synthesizer.py @@ -1,10 +1,10 @@ import io -import requests -from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer - +import requests from pydub import AudioSegment +from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer + class StreamElementsSynthesizer(BaseSynthesizer): def __init__(self, voice: str = "Brian"): diff --git a/vocode/turn_based/transcriber/__init__.py b/vocode/turn_based/transcriber/__init__.py deleted file mode 100644 index 50631f547f..0000000000 --- a/vocode/turn_based/transcriber/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from vocode.turn_based.transcriber.base_transcriber import BaseTranscriber -from vocode.turn_based.transcriber.sr_transcriber import SpeechRecognitionTranscriber -from vocode.turn_based.transcriber.whisper_cpp_transcriber import WhisperCPPTranscriber -from vocode.turn_based.transcriber.whisper_transcriber import WhisperTranscriber diff --git a/vocode/turn_based/transcriber/sr_transcriber.py b/vocode/turn_based/transcriber/sr_transcriber.py index 16e33e0580..dc20a4ab2c 100644 --- a/vocode/turn_based/transcriber/sr_transcriber.py +++ b/vocode/turn_based/transcriber/sr_transcriber.py @@ -1,8 +1,10 @@ -from pydub import AudioSegment +from enum import Enum + import speech_recognition as sr +from pydub import AudioSegment + from vocode import getenv from vocode.turn_based.transcriber.base_transcriber import BaseTranscriber -from enum import Enum class SpeechRecognitionAPI(Enum): @@ -46,9 +48,7 @@ def transcribe(self, audio_segment: AudioSegment) -> str: credentials_json = getenv("GOOGLE_CLOUD_SPEECH_CREDENTIALS") if not credentials_json: raise ValueError("Google Cloud Speech credentials not provided") - text = r.recognize_google_cloud( - audio, credentials_json=credentials_json - ) + text = r.recognize_google_cloud(audio, credentials_json=credentials_json) elif self.api == SpeechRecognitionAPI.WIT: api_key = getenv("WIT_AI_API_KEY") @@ -76,17 +76,13 @@ def transcribe(self, audio_segment: AudioSegment) -> str: client_key = getenv("HOUNDIFY_CLIENT_KEY") if not client_id or not client_key: raise ValueError("Houndify client ID or key not provided") - text = r.recognize_houndify( - audio, client_id=client_id, client_key=client_key - ) + text = r.recognize_houndify(audio, client_id=client_id, client_key=client_key) elif self.api == SpeechRecognitionAPI.IBM: username = getenv("IBM_USERNAME") password = getenv("IBM_PASSWORD") if not username or not password: - raise ValueError( - "IBM Speech to Text username or password not provided" - ) + raise ValueError("IBM Speech to Text username or password not provided") text = r.recognize_ibm(audio, username=username, password=password) else: @@ -94,8 +90,6 @@ def transcribe(self, audio_segment: AudioSegment) -> str: except sr.UnknownValueError: raise sr.UnknownValueError("Speech Recognition could not understand audio") except sr.RequestError as e: - raise sr.RequestError( - f"Could not request results from Speech Recognition service." - ) + raise sr.RequestError(f"Could not request results from Speech Recognition service.") return text diff --git a/vocode/turn_based/transcriber/whisper_cpp_transcriber.py b/vocode/turn_based/transcriber/whisper_cpp_transcriber.py index ca9d2337b2..57c0f79144 100644 --- a/vocode/turn_based/transcriber/whisper_cpp_transcriber.py +++ b/vocode/turn_based/transcriber/whisper_cpp_transcriber.py @@ -1,5 +1,6 @@ import ctypes import pathlib + import numpy as np from pydub import AudioSegment diff --git a/vocode/turn_based/transcriber/whisper_transcriber.py b/vocode/turn_based/transcriber/whisper_transcriber.py index 95e0d97362..1b6c582b1a 100644 --- a/vocode/turn_based/transcriber/whisper_transcriber.py +++ b/vocode/turn_based/transcriber/whisper_transcriber.py @@ -1,9 +1,10 @@ -from typing import Optional -from pydub import AudioSegment import io +from typing import Optional + import openai -from vocode import getenv +from pydub import AudioSegment +from vocode import getenv from vocode.turn_based.transcriber.base_transcriber import BaseTranscriber @@ -12,11 +13,12 @@ def __init__(self, api_key: Optional[str] = None): openai.api_key = getenv("OPENAI_API_KEY", api_key) if not openai.api_key: raise ValueError("OpenAI API key not provided") + self.client = openai.OpenAI() def transcribe(self, audio_segment: AudioSegment) -> str: in_memory_wav = io.BytesIO() audio_segment.export(in_memory_wav, format="wav") # type: ignore in_memory_wav.seek(0) in_memory_wav.name = "whisper.wav" - transcript = openai.Audio.transcribe("whisper-1", in_memory_wav) + transcript = self.client.audio.transcriptions.create(model="whisper-1", file=in_memory_wav) return transcript.text diff --git a/vocode/turn_based/turn_based_conversation.py b/vocode/turn_based/turn_based_conversation.py index 3b30f94171..faddb613b0 100644 --- a/vocode/turn_based/turn_based_conversation.py +++ b/vocode/turn_based/turn_based_conversation.py @@ -1,9 +1,7 @@ -import logging -from typing import Optional +from loguru import logger + from vocode.turn_based.agent.base_agent import BaseAgent -from vocode.turn_based.input_device.base_input_device import ( - BaseInputDevice, -) +from vocode.turn_based.input_device.base_input_device import BaseInputDevice from vocode.turn_based.output_device.base_output_device import BaseOutputDevice from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer from vocode.turn_based.transcriber.base_transcriber import BaseTranscriber @@ -17,7 +15,6 @@ def __init__( agent: BaseAgent, synthesizer: BaseSynthesizer, output_device: BaseOutputDevice, - logger: Optional[logging.Logger] = None, ): self.input_device = input_device self.transcriber = transcriber @@ -25,20 +22,17 @@ def __init__( self.synthesizer = synthesizer self.output_device = output_device self.maybe_play_initial_message() - self.logger = logger or logging.getLogger(__name__) def maybe_play_initial_message(self): if self.agent.initial_message: - self.output_device.send_audio( - self.synthesizer.synthesize(self.agent.initial_message) - ) + self.output_device.send_audio(self.synthesizer.synthesize(self.agent.initial_message)) def start_speech(self): self.input_device.start_listening() def end_speech_and_respond(self): human_input = self.transcriber.transcribe(self.input_device.end_listening()) - self.logger.info(f"Transcription: {human_input}") + logger.info(f"Transcription: {human_input}") agent_response = self.agent.respond(human_input) - self.logger.info(f"Agent response: {agent_response}") + logger.info(f"Agent response: {agent_response}") self.output_device.send_audio(self.synthesizer.synthesize(agent_response)) diff --git a/vocode/utils/sentry_utils.py b/vocode/utils/sentry_utils.py new file mode 100644 index 0000000000..74da6a1f5a --- /dev/null +++ b/vocode/utils/sentry_utils.py @@ -0,0 +1,233 @@ +import functools +from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Tuple + +import sentry_sdk +from loguru import logger +from sentry_sdk.tracing import Span, Transaction, _SpanRecorder + +from vocode import get_serialized_ctx_wrappers + +if TYPE_CHECKING: + from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer + +_SYNTHESIZER_NAMES = { + "AzureSynthesizer": "azure", + "ElevenLabsSynthesizer": "eleven_labs", + "ElevenLabsWSSynthesizer": "eleven_labs_ws", + "PlayHtSynthesizer": "play_ht", + "PlayHtSynthesizerV2": "play_ht_v2", + "RimeSynthesizer": "rime", +} + +_FILTERED_SPANS = {"middleware.starlette.receive", "middleware.starlette.send", "Queue.get"} + + +class CustomSentrySpans: + CONNECTED_TO_FIRST_SEND = "connected_to_first_send" + ENDPOINTING_LATENCY = "endpointing_latency" + FIRST_SEND_TO_FIRST_RECEIVE = "first_send_to_first_receive" + LANGUAGE_MODEL_TIME_TO_FIRST_TOKEN = "language_model_time_to_first_token" + LATENCY_OF_CONVERSATION = "latency_of_conversation" + LATENCY_OF_TRANSCRIPTION_START = "latency_of_transcription_start" + LLM_FIRST_SENTENCE_TOTAL = "llm_first_sentence_total" + START_TO_CONNECTION = "start_to_connection" + SYNTHESIS_GENERATE_FIRST_CHUNK = "synthesis_generate_first_chunk" + SYNTHESIS_TIME_TO_FIRST_TOKEN = "synthesis_time_to_first_token" + TIME_TO_FIRST_TOKEN = "time_to_first_token" + + SYNTHESIZER_SYNTHESIS_TOTAL = ".synthesis_total" + SYNTHESIZER_TIME_TO_FIRST_TOKEN = ".time_to_first_token" + SYNTHESIZER_CREATE_SPEECH = ".create_speech" + + @classmethod + def is_present(cls, value): + for attr in dir(cls): + if not attr.startswith("__"): + attr_value = getattr(cls, attr) + if isinstance(attr_value, str) and ( + attr_value == value or value.endswith(attr_value) + ): + return True + return False + + +class SentryConfiguredContextManager: + """ + A context manager that only executes a function if Sentry is configured. + + Attributes: + func (Callable): The function to be executed. + args (Tuple): The positional arguments to pass to the function. + kwargs (Dict): The keyword arguments to pass to the function. + result (Any): The result of the function execution. + """ + + def __init__(self, func: Callable, *args: Tuple, **kwargs: Dict) -> None: + """ + Constructs all the necessary attributes for the SentryConfiguredContextManager object. + + Args: + func (Callable): The function to be executed. + *args (Tuple): The positional arguments to pass to the function. + **kwargs (Dict): The keyword arguments to pass to the function. + """ + self.func = func + self.args = args + self.kwargs = kwargs + self.result: Optional[Any] = None + + @property + def is_configured(self) -> bool: + """ + Checks if Sentry is configured. + + Returns: + bool: True if Sentry is configured, False otherwise. + """ + client = sentry_sdk.Hub.current.client + if client is not None and client.options is not None and "dsn" in client.options: + return True + return False + + def __enter__(self) -> Optional[Any]: + """ + Executes the function if Sentry is configured. + + Returns: + Any: The result of the function execution, or None if Sentry is not configured. + """ + if self.is_configured: + self.result = self.func(*self.args, **self.kwargs) + return self.result + else: + return None + + def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None: + """ + Defines the behavior when exiting the context. + + Args: + exc_type (Any): The type of the exception. + exc_val (Any): The value of the exception. + exc_tb (Any): The traceback of the exception. + """ + pass + + def __call__(self) -> Optional[Any]: + """ + Executes the function if Sentry is configured, and prints a message if it's not. + + Returns: + Any: The result of the function execution, or None if Sentry is not configured. + """ + if self.is_configured: + return self.func(*self.args, **self.kwargs) + else: + logger.debug("Sentry is not configured, skipping function execution.") + return None + + def execute(self) -> Optional[Any]: + """Executes the wrapped function immediately and returns its result.""" + return self() + + +def sentry_configured(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + context_manager = SentryConfiguredContextManager(func, *args, **kwargs) + if "with" not in func.__code__.co_names: + return context_manager.execute() + return context_manager + + return wrapper + + +def synthesizer_base_name_if_should_report_to_sentry( + synthesizer: "BaseSynthesizer", +) -> Optional[str]: + """Returns a synthesizer name if we should report metrics to Sentry for this + kind of synthesizer; else returns None. + """ + return f"synthesizer.{_SYNTHESIZER_NAMES.get(synthesizer.__class__.__qualname__)}" + + +@sentry_configured +def set_tags(span: Span) -> Span: + serialized_ctx_wrappers = get_serialized_ctx_wrappers() + for name, value in serialized_ctx_wrappers.items(): + span.set_tag(name, value) + if not span.description: + span.description = serialized_ctx_wrappers.get("conversation_id") or span.op + return span + + +@sentry_configured +def get_span_by_op(op_value): + transaction: Transaction = sentry_sdk.Hub.current.scope.transaction + if transaction is not None: + # Probably not great accessing an internal variable but transaction spans aren't + # exposed publicly so it is what it is. + span_matches = [ + span + for span in transaction._span_recorder.spans + if span.op == op_value and span.timestamp is None + ] + if span_matches: + most_recent_span = max( + span_matches, key=lambda span: span.start_timestamp, default=None + ) + if most_recent_span is not None: + return set_tags(most_recent_span) + else: + # If no span with the matching op was found + logger.error(f"No span found with op '{op_value}'.") + return None + else: + logger.debug("No active transaction found.") + return None + + +@sentry_configured +def complete_span_by_op(op_value): + span = get_span_by_op(op_value) + if span is None: + logger.error(f"No span found with op '{op_value}'.") + return None + span.finish() + + +@sentry_configured +def sentry_create_span(*args, sentry_callable: Callable, **kwargs) -> Span: + span = sentry_callable(*args, **kwargs) + + return set_tags(span) + + +class SpanRecorder(_SpanRecorder): + + def __init__(self, maxlen): + self.maxlen = 900 + self._auto_spans = [] + self._custom_spans = [] + self._low_prio_spans = [] + + def add(self, span: Span): + if span.op in _FILTERED_SPANS and span.description in _FILTERED_SPANS: + self._low_prio_spans.append(span) + else: + if CustomSentrySpans.is_present(span.op): + self._custom_spans.append(span) + else: + self._auto_spans.append(span) + + @property + def spans(self): + return (self._custom_spans + self._auto_spans + self._low_prio_spans)[: self.maxlen] + + +def init_span_recorder(self, maxlen: int): + if self._span_recorder is None: + self._span_recorder = SpanRecorder(maxlen) + + +Span.init_span_recorder = init_span_recorder # type: ignore diff --git a/vocode/utils/whisper_cpp/helpers.py b/vocode/utils/whisper_cpp/helpers.py index e99004448d..d3076f8112 100644 --- a/vocode/utils/whisper_cpp/helpers.py +++ b/vocode/utils/whisper_cpp/helpers.py @@ -1,6 +1,7 @@ import ctypes import re from typing import Tuple + import numpy as np from pydub import AudioSegment @@ -9,9 +10,9 @@ def transcribe(whisper, params, ctx, audio_segment: AudioSegment) -> Tuple[str, if len(audio_segment) <= 100: return "", 0.0 normalized = ( - np.frombuffer( - audio_segment.set_frame_rate(16000).raw_data, dtype=np.int16 - ).astype("float32") + np.frombuffer(audio_segment.set_frame_rate(16000).raw_data, dtype=np.int16).astype( + "float32" + ) / 32768.0 ) @@ -24,9 +25,7 @@ def transcribe(whisper, params, ctx, audio_segment: AudioSegment) -> Tuple[str, if result != 0: print("Error: {}".format(result)) exit(1) - text: str = whisper.whisper_full_get_segment_text(ctypes.c_void_p(ctx), 0).decode( - "utf-8" - ) + text: str = whisper.whisper_full_get_segment_text(ctypes.c_void_p(ctx), 0).decode("utf-8") # heuristic to filter out non-speech if not re.search(r"^\w.*", text.strip()): return "", 0.0 diff --git a/vocode/utils/whisper_cpp/whisper_params.py b/vocode/utils/whisper_cpp/whisper_params.py index 0777dbb58b..1b5e7e76c7 100644 --- a/vocode/utils/whisper_cpp/whisper_params.py +++ b/vocode/utils/whisper_cpp/whisper_params.py @@ -5,14 +5,13 @@ class WhisperFullParams(ctypes.Structure): _fields_ = [ ("strategy", ctypes.c_int), # - ("n_threads", ctypes.c_int), ("n_max_text_ctx", ctypes.c_int), + ("n_threads", ctypes.c_int), ("offset_ms", ctypes.c_int), ("duration_ms", ctypes.c_int), # ("translate", ctypes.c_bool), ("no_context", ctypes.c_bool), - ("no_timestamps", ctypes.c_bool), ("single_segment", ctypes.c_bool), ("print_special", ctypes.c_bool), ("print_progress", ctypes.c_bool), @@ -27,17 +26,13 @@ class WhisperFullParams(ctypes.Structure): ("max_tokens", ctypes.c_int), # ("speed_up", ctypes.c_bool), - ("debug_mode", ctypes.c_bool), ("audio_ctx", ctypes.c_int), # - ("tdrz_enable", ctypes.c_bool), - # ("initial_prompt", ctypes.c_char_p), ("prompt_tokens", ctypes.c_void_p), ("prompt_n_tokens", ctypes.c_int), # ("language", ctypes.c_char_p), - ("detect_language", ctypes.c_bool), # ("suppress_blank", ctypes.c_bool), ("suppress_non_speech_tokens", ctypes.c_bool), @@ -52,7 +47,7 @@ class WhisperFullParams(ctypes.Structure): ("no_speech_thold", ctypes.c_float), # ("greedy", ctypes.c_int * 1), - ("beam_search", ctypes.c_int * 2), + ("beam_search", ctypes.c_int * 3), # ("new_segment_callback", ctypes.c_void_p), ("new_segment_callback_user_data", ctypes.c_void_p), @@ -65,9 +60,4 @@ class WhisperFullParams(ctypes.Structure): # ("logits_filter_callback", ctypes.c_void_p), ("logits_filter_callback_user_data", ctypes.c_void_p), - # - ("grammar_rules", ctypes.POINTER(ctypes.c_void_p)), - ("n_grammar_rules", ctypes.c_size_t), - ("i_start_rule", ctypes.c_size_t), - ("grammar_penalty", ctypes.c_float), ] From 78f7b8f9271a96c98a951a494ab36660faa8e474 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 14 Jun 2024 16:17:34 -0700 Subject: [PATCH 075/148] [WIP] 0.1.112 docs (#556) * [docs sprint] Updates docs for using transcribers (#9) * [docs sprint] phrase trigger documentation (#16) * [docs sprint] update open source quickstarts (#15) * [docs sprint] Add Documentation on Using Vocode's Loguru Implementation (#19) * [docs sprint] Add Documentation on Using Vocode's Loguru Implementation * Remove Tracing --------- Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> * [docs sprint] Updates docs for using synthesizers (#8) * [docs sprint] using synthesizers docs update * update docs for elevenlabs ws * Apply suggestions from code review Co-authored-by: Adnaan Sachidanandan --------- Co-authored-by: Adnaan Sachidanandan * [docs sprint] Updates docs for react quickstart (#10) * [docs sprint] Updates docs for react quickstart * PR feedback * [docs sprint] Adds docs for conversation mechanics and moves endpointing docs from transcribers (#11) * [docs sprint] Updates docs for using transcribers * Adds docs for conversation mechanics and moves endpointing docs from transcribers * Update docs/open-source/conversation-mechanics.md Co-authored-by: Adnaan Sachidanandan * use mdx * PR feedback --------- Co-authored-by: Adnaan Sachidanandan * updates docs for events manager (#7) * [docs sprint] python quickstart + working with phone calls (#27) * deprecate SpeakerOutput * remove play.ht default voice id * rename open source quickstarts page * remove building block reference * update python quickstart * extra steps to deprecate speakeroutput * finish telephony docs * fix some references + language in how-to-use-it * fix test * [docs sprint] Add Sentry Docs to OS (#20) * Add Sentry Docs to OS * Remove Tracing * update docs and fix integration * remove free --------- Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> Co-authored-by: Ajay Raj * update README * make mark terminated sync instead of async (#28) * [docs sprint] Add Docs on Creating and Using External Actions (#18) Also updated example for action agents * rename sentry + move around docs order * update README paths to docs * more updates to README * [docs sprint] update agent and action docs and move legacy docs (#29) --------- Co-authored-by: Adnaan Sachidanandan Co-authored-by: Mac Wilkinson Co-authored-by: srhinos <6531393+srhinos@users.noreply.github.com> --- README.md | 97 ++++--- apps/telephony_app/speller_agent.py | 15 +- docs/images/sentry.png | Bin 0 -> 426450 bytes docs/mint.json | 33 ++- ...kstart.mdx => open-source-quickstarts.mdx} | 8 +- docs/open-source/action-agents.mdx | 96 ------- docs/open-source/action-phrase-triggers.mdx | 86 ++++++ docs/open-source/agent-factory.mdx | 25 +- docs/open-source/agents-with-actions.mdx | 209 ++++++++++++++ docs/open-source/conversation-mechanics.mdx | 53 ++++ docs/open-source/create-your-own-agent.mdx | 29 +- docs/open-source/events-manager.mdx | 103 +++---- docs/open-source/external-action.mdx | 263 ++++++++++++++++++ docs/open-source/how-to-use-it.mdx | 3 +- docs/open-source/language-support.mdx | 7 +- docs/open-source/logging-with-loguru.mdx | 73 +++++ docs/open-source/playground.mdx | 11 +- docs/open-source/python-quickstart.mdx | 91 +++--- docs/open-source/react-quickstart.mdx | 40 +-- docs/open-source/sentry.mdx | 135 +++++++++ docs/open-source/telephony.mdx | 33 ++- docs/open-source/tracing.mdx | 95 ------- docs/open-source/turn-based-conversation.mdx | 73 +++-- docs/open-source/using-synthesizers.mdx | 64 +++-- docs/open-source/using-transcribers.mdx | 13 +- docs/welcome.mdx | 6 +- .../streaming/synthesizer/synthesize.py | 5 +- quickstarts/streaming_conversation.py | 1 - tests/fakedata/conversation.py | 1 + vocode/__init__.py | 1 + vocode/helpers.py | 11 +- vocode/streaming/models/synthesizer.py | 7 +- .../output_device/blocking_speaker_output.py | 7 + .../streaming/output_device/speaker_output.py | 2 + .../output_device/vonage_output_device.py | 4 +- vocode/streaming/streaming_conversation.py | 8 +- .../telephony/server/router/calls.py | 38 +-- vocode/utils/sentry_utils.py | 21 +- 38 files changed, 1228 insertions(+), 539 deletions(-) create mode 100644 docs/images/sentry.png rename docs/{open-source-quickstart.mdx => open-source-quickstarts.mdx} (90%) delete mode 100644 docs/open-source/action-agents.mdx create mode 100644 docs/open-source/action-phrase-triggers.mdx create mode 100644 docs/open-source/agents-with-actions.mdx create mode 100644 docs/open-source/conversation-mechanics.mdx create mode 100644 docs/open-source/external-action.mdx create mode 100644 docs/open-source/logging-with-loguru.mdx create mode 100644 docs/open-source/sentry.mdx delete mode 100644 docs/open-source/tracing.mdx diff --git a/README.md b/README.md index a01434cdf4..c0faea62ae 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/vocodehq.svg?style=social&label=Follow%20%40vocodehq)](https://twitter.com/vocodehq) [![GitHub Repo stars](https://img.shields.io/github/stars/vocodedev/vocode-python?style=social)](https://github.com/vocodedev/vocode-python) [![Downloads](https://static.pepy.tech/badge/vocode/month)](https://pepy.tech/project/vocode) -[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev) | [Dashboard](https://app.vocode.dev) +[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) @@ -19,11 +19,11 @@ We're actively looking for community maintainers, so please reach out if interes # ⭐️ Features -- 🗣 [Spin up a conversation with your system audio](https://docs.vocode.dev/python-quickstart) -- ➡️ 📞 [Set up a phone number that responds with a LLM-based agent](https://docs.vocode.dev/telephony#inbound-calls) -- 📞 ➡️ [Send out phone calls from your phone number managed by an LLM-based agent](https://docs.vocode.dev/telephony#outbound-calls) -- 🧑‍💻 [Dial into a Zoom call](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/telephony/hosted/zoom_dial_in.py) -- 🤖 [Use an outbound call to a real phone number in a Langchain agent](https://docs.vocode.dev/langchain-agent) +- 🗣 [Spin up a conversation with your system audio](https://docs.vocode.dev/open-source/python-quickstart) +- ➡️ 📞 [Set up a phone number that responds with a LLM-based agent](https://docs.vocode.dev/open-source/telephony#inbound-calls) +- 📞 ➡️ [Send out phone calls from your phone number managed by an LLM-based agent](https://docs.vocode.dev/telephony/open-source/#outbound-calls) +- 🧑‍💻 [Dial into a Zoom call](https://github.com/vocodedev/vocode-core/blob/53b01dab0b59f71961ee83dbcaf3653a6935c2e3/vocode/streaming/telephony/conversation/zoom_dial_in.py) +- 🤖 [Use an outbound call to a real phone number in a Langchain agent](https://docs.vocode.dev/open-source/langchain-agent) - Out of the box integrations with: - Transcription services, including: - [AssemblyAI](https://www.assemblyai.com/) @@ -34,19 +34,16 @@ We're actively looking for community maintainers, so please reach out if interes - [RevAI](https://www.rev.ai/) - [Whisper](https://openai.com/blog/introducing-chatgpt-and-whisper-apis) - [Whisper.cpp](https://github.com/ggerganov/whisper.cpp) - - LLMs, including: - - [ChatGPT](https://openai.com/blog/chatgpt) - - [GPT-4](https://platform.openai.com/docs/models/gpt-4) + - [OpenAI](https://platform.openai.com/docs/models) - [Anthropic](https://www.anthropic.com/) - - [GPT4All](https://github.com/nomic-ai/gpt4all) - Synthesis services, including: - [Rime.ai](https://rime.ai) - [Microsoft Azure](https://azure.microsoft.com/en-us/products/cognitive-services/text-to-speech/) - [Google Cloud](https://cloud.google.com/text-to-speech) - [Play.ht](https://play.ht) - [Eleven Labs](https://elevenlabs.io/) - - [Coqui](https://coqui.ai/) + - [Cartesia](https://cartesia.ai/) - [Coqui (OSS)](https://github.com/coqui-ai/TTS) - [gTTS](https://gtts.readthedocs.io/) - [StreamElements](https://streamelements.com/) @@ -59,9 +56,9 @@ Check out our React SDK [here](https://github.com/vocodedev/vocode-react-sdk)! We're an open source project and are extremely open to contributors adding new features, integrations, and documentation! Please don't hesitate to reach out and get started building with us. -For more information on contributing, see our [Contribution Guide](https://github.com/vocodedev/vocode-python/blob/main/contributing.md). +For more information on contributing, see our [Contribution Guide](https://github.com/vocodedev/vocode-core/blob/main/contributing.md). -And check out our [Roadmap](https://github.com/vocodedev/vocode-python/blob/main/roadmap.md). +And check out our [Roadmap](https://github.com/vocodedev/vocode-core/blob/main/roadmap.md). We'd love to talk to you on [Discord](https://discord.gg/NaU4mMgcnC) about new ideas and contributing! @@ -73,31 +70,48 @@ pip install 'vocode' ```python import asyncio -import logging import signal -from vocode.streaming.streaming_conversation import StreamingConversation + +from pydantic_settings import BaseSettings, SettingsConfigDict + from vocode.helpers import create_streaming_microphone_input_and_speaker_output -from vocode.streaming.transcriber import * -from vocode.streaming.agent import * -from vocode.streaming.synthesizer import * -from vocode.streaming.models.transcriber import * -from vocode.streaming.models.agent import * -from vocode.streaming.models.synthesizer import * +from vocode.logging import configure_pretty_logging +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.message import BaseMessage -import vocode - -# these can also be set as environment variables -vocode.setenv( - OPENAI_API_KEY="", - DEEPGRAM_API_KEY="", - AZURE_SPEECH_KEY="", - AZURE_SPEECH_REGION="", +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import ( + DeepgramTranscriberConfig, + PunctuationEndpointingConfig, ) +from vocode.streaming.streaming_conversation import StreamingConversation +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber +configure_pretty_logging() -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) + +class Settings(BaseSettings): + """ + Settings for the streaming conversation quickstart. + These parameters can be configured with environment variables. + """ + + openai_api_key: str = "ENTER_YOUR_OPENAI_API_KEY_HERE" + azure_speech_key: str = "ENTER_YOUR_AZURE_KEY_HERE" + deepgram_api_key: str = "ENTER_YOUR_DEEPGRAM_API_KEY_HERE" + + azure_speech_region: str = "eastus" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) + + +settings = Settings() async def main(): @@ -106,8 +120,6 @@ async def main(): speaker_output, ) = create_streaming_microphone_input_and_speaker_output( use_default_devices=False, - logger=logger, - use_blocking_speaker_output=True ) conversation = StreamingConversation( @@ -116,24 +128,25 @@ async def main(): DeepgramTranscriberConfig.from_input_device( microphone_input, endpointing_config=PunctuationEndpointingConfig(), - ) + api_key=settings.deepgram_api_key, + ), ), agent=ChatGPTAgent( ChatGPTAgentConfig( + openai_api_key=settings.openai_api_key, initial_message=BaseMessage(text="What up"), prompt_preamble="""The AI is having a pleasant conversation about life""", ) ), synthesizer=AzureSynthesizer( - AzureSynthesizerConfig.from_output_device(speaker_output) + AzureSynthesizerConfig.from_output_device(speaker_output), + azure_speech_key=settings.azure_speech_key, + azure_speech_region=settings.azure_speech_region, ), - logger=logger, ) await conversation.start() print("Conversation started, press Ctrl+C to end") - signal.signal( - signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate()) - ) + signal.signal(signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate())) while conversation.is_active(): chunk = await microphone_input.get_audio() conversation.receive_audio(chunk) @@ -145,8 +158,8 @@ if __name__ == "__main__": # 📞 Phone call quickstarts -- [Telephony Server - Self-hosted](https://docs.vocode.dev/telephony) +- [Telephony Server - Self-hosted](https://docs.vocode.dev/open-source/telephony) # 🌱 Documentation -[docs.vocode.dev](https://docs.vocode.dev/) +[docs.vocode.dev](https://docs.vocode.dev/open-source) diff --git a/apps/telephony_app/speller_agent.py b/apps/telephony_app/speller_agent.py index 43ed0ce732..fc4f441aa2 100644 --- a/apps/telephony_app/speller_agent.py +++ b/apps/telephony_app/speller_agent.py @@ -1,4 +1,3 @@ -import typing from typing import Optional, Tuple from vocode.streaming.agent.abstract_factory import AbstractAgentFactory @@ -65,16 +64,10 @@ def create_agent(self, agent_config: AgentConfig) -> BaseAgent: Exception: If the agent configuration type is not recognized. """ # If the agent configuration type is CHAT_GPT, create a ChatGPTAgent. - if agent_config.type == AgentType.CHAT_GPT: - return ChatGPTAgent( - # Cast the agent configuration to ChatGPTAgentConfig as we are sure about the type here. - agent_config=typing.cast(ChatGPTAgentConfig, agent_config) - ) + if isinstance(agent_config, ChatGPTAgentConfig): + return ChatGPTAgent(agent_config=agent_config) # If the agent configuration type is agent_speller, create a SpellerAgent. - elif agent_config.type == "agent_speller": - return SpellerAgent( - # Cast the agent configuration to SpellerAgentConfig as we are sure about the type here. - agent_config=typing.cast(SpellerAgentConfig, agent_config) - ) + elif isinstance(agent_config, SpellerAgentConfig): + return SpellerAgent(agent_config=agent_config) # If the agent configuration type is not recognized, raise an exception. raise Exception("Invalid agent config") diff --git a/docs/images/sentry.png b/docs/images/sentry.png new file mode 100644 index 0000000000000000000000000000000000000000..7414cd35011379f28c0631fafc34331d6cb35cb8 GIT binary patch literal 426450 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

FCHi#YO|Y34+`3b0#_`_DL7nT97m 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 z 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 <+3tu|OY- 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 ^77 zRwz#J3pIvkOunDNJ1u9b#W1h@J-7+;ufap?*njI*0(|)U}fMvz_vu@DMOS9MOu@p?bTuC|yfQA24Fj*@aacEMW!0=_H9%VmCn!&?tb zY@~Q{f)MK2Qme8%XoB&5Y!*JBVKXQ^j{ZAAsv>s6-*v z?6`|wWzh68pezTrYdma$*9KtJ#ys3n(NOzdik*B^XHjv5j@*QCz zNbX*3;hB}D*mHDt#TQF^@%awyqAQkwb(G|xr%pX8gUa8G4>N^*A9_lbINqLHp$(IJ zSRGYUO&1sHK`XsJJ~~6>R}$3^h@rU7d3199{pXJ_VZr+xaLjYsO~)SUAvY|OF&i~S68NhE}l`R*fag6?R~a^p1>gY?8F1f-?{k5`aCyAoEl!ZUY|Ts$jBUfso4ZuU?#@^ zSFi+f(IB?y(AN3gqMr1RAcE z`Xj2XGqm7{E&R2_E<~y=&&@TB3QWouL)Eh-&jF=pUya-S;*6JQ#)_q1T#N>r`I-w5 zpvXMm{}%V}x*oHKuy(u-G`b>qFEvYBd4FooT7WntUO`oOy3K;@Ul5AxJ5`~lVV#$0 zo`ATTV6@;<7h+PZ7b?``a6t*=QvrMRk74@20Bfpj3e(=OL$rZJ=ao|zW;e^G&-QCU z2b~Iq82!0dz;D=q*Zgn#yuUF71jPSaU>6(AJTz75e;dZc#vr)dIvtN5cB?g>Q`9Ln z92OSM&CL|2ER%b?E45~TA?$P4)3@2`aC_s;8Xr`$L&BHjl_3QGx)roD8M<K43WzB{Xi#X?gKJ614z*FCYofW&;+S zx`NQ66}y5%K|7b^XCIKX+~Je|)A!xGMj-iUm>koZgMfrq?&{R^V~d>X(!$GUnk|{!4j_ngVzyHelO&c%BHfG zw!He)?s-eb#WRL7$`o5QJ}mO@&G!GJ9%8~%U2on0 z%1Ocm*J(10ge%YGJ0yiK9y8y)t#kQc(p;XfUHRh8OHc|lJVnsyYu9^4zTbWHCLxVx zP`neizrbJ&z)i2~=T;gaXd^IM=%A>^Ou@bCsOe!1NV25DU!Oz(_;>~e@5Al7?x!FE zYB2_7cJ2vtnedv`E{iDhD8m4ZE-so96jflw5y`Y|M=83-Q({d%HX(A1j&mFg)*P-= zI=xzt+?_N!#>Uwj7E<94$oHP8QafY0wI=J75?38O-}DWDg*Fhui{?~4eK(nfz)jKf zcr+Q}9Zz6G|POb8HwE6}d;mTX%;?iga!Z6!UFm?GDrA zg|dqz-^atJoK~6`u0$VrdrR1V-AKkc?RMb-SYD|mJ8l@cxzasVKtMo6^O)9gFw8M9 zUQkQ(sBG_#jKgG;qTEMe>s4GpgpklGwp^ScZzRakhnkjz@o5mr)FOlf%zkZ_)ASEX zg83Z-s0o-nacuMIBMU9RRYP;zZbsAIzdw=M|B_4A0bLVx+*9m^mq4vf-?=3RXrZV&umaeI*N z+84dwsGP5;!3k`H+=jXlVoV&CvBXIBqikvFUtx00Oi@IKO1trE0GD4PiiFJ8lZ!KCYdGE&jsZcmD_X*&s=hbV zHXdTbZaE-;C4i=0qJdgELC4{l4mf1%7xlN0OiCClE(X^9D_Tgr^=pxexgSO)Ak0;@ z;2uZ6&HV;okY@mcMBWCGJ>MCot~<+z@gFlHJ?VGAUR{MU77|ZsvUq_9wzozMo}!{6 z!K;eK#;TXPPmSJ(AZ{ms-Y!pM^${F(O8LLQ6sLP!ykDh49qVjoey$`6eM;N3FT(%b z{_~xoBP2FCaB2lTP313}E{l3@o3XQ(W)?@VF+DtMF|X6~S$(|q^WELGT7+HzyfZuY z5B+v`jqJ!9y*3YqJgG>NUtBG2zXMOrS@J+?(9X}%uO-e86}{T+?#cSry3QT6*tSzu zQ<$K7;gNVEWnX*Q?!6G&(>+yG2i@$u*^4#;4x0enHaA}P;Ayt_ie^X|W zuRy!O?A*2-HZbr5vG2|L=QR+8k%>^LGSdGfi4scX<5?>^PD}H%g-)ej>o;rBu2_H< zTC-s4S~rGmfX6!D=i{j9YXzjWu!3;Af``2r0qL``6oe!M`$e~4{G;Hn8B z-`rW^;Q6|Zn@ z4jj_78*PK{1c*{5AHc#GtJQELTdwx(jc0d7me1f9 z)$-mAz|-b&D|Jz#z{g95V5*kBMf2dX`7N?Bl4XE5cz{7MQlV4o?{I!aFDXt<#;yQV zY1_bQaTdw#W9m1R!*0#|F&-?KLDEE+(Oli+);POoBs?8WD5AIgp= zOO&-1d5gb$D8?*LstTOPW2EZ!2CVx@a*mce^7B@tt3)0erdR1Kq8&JaI(t;-*1VdkWtyt{-`QkF_)g%#1dpaEpKF#Xy(o?fuXgT%X|NcJoB~UY*{AiZHp3E`q*v zMFg&ZToNuL7!ivkx0{cDY`~o!iZEpOwa#mu^!-{!#HWbL323hH_Bo6N(b65_BFL%| zW7P0kdPD+$+@wl`hoxsR*g34GN^ZpBo!5GhzFhl^)`7{7{kr;J2-}^4C~~uH)Pbpg5Fbf$i-J*2rw(?CE)oB9P-|OiIAcsv_@35({GPN8-73JsBW$O zY*3AErcb_#%IZP4NZ1Yahd2umw$LZrqW{A&m_fg&$Y3{>r#+~C;d3mvP!+n;4+PHTf> zN~uUu00>jehz^IX|W1I!)J)&8@}#b}(C}ML!6QSjs1rWWg7%8zDO7wkRM8P(gFs9HJ?(B$n=)3lk&l zVbNUw05YuXDjX7|Y_^J-fNSRAg5pH!sOqU`7m5=PMKMnIRFwz*LeqO3U^n?RTmwQP z7T)t52z9zb&k@gRmb%)>0+DQ}%@Suz>U*@nj;Q zRwwu%B|sVxnHBqtE5l~BrW}`uUPu?4V*${&tCUpM(|uytl{;Lx_2!PdzsW0mg6O)hbYCFAUMx-EUY~Y zlj1A$Qk@-BQB)4aY)X(cgDQ>IsQd8W*xZ`bZ+1E0A0KS3dntyi4BI}?G>V=>2S^p( zy*w7adru2P%>PRR)&Dwl!3??X?oqxQ^HiS~hWGi&U$YLUNOFcOgig$Y3almJW|iz5 zZZ}w9Yr4apELVR{ji{F+SCI04QvxU@pj9^RT~Kg8zl;9O?=%$__M8eCFdh72j||=! zwlFiOXohK^!c)#*7Tn>k!8@^1#6P3KwhwwP#yYE%(>p((HTE^~Twg8bH*a*ln22cC zIIz5tt(82+RCH(3R~e`c!bTE@kmn`j@&s)uen)l0?&&eta$9Zs^Ia~8af#EY@g2=v zj+L|?_OnX;8p10y4JefP_h+RIs0;wAr)OHn^`)kRR)>lkr#uRebEys4DR z4cS)aA6@|QDsYRpDPSTbfkFL-+))Hzc*pvPl1uF#bQ$<8hL~*#E*yJhQo$eAI35h2 z9jg)Ns9p+X75eqmDFW;0X03gfRC7KOJZISPBBV6r;4mu(O`5^A|xETIM^(}VwEw+ z-X8ltAzG;4JFzoX8NF(GvU)Flwm0ztnCvAkr;B5~yCv?X<)y#aUivgT3_L6 zis5qXPA7F=Ojb3BmTEDY9YqN1IqBgs{9Ptp6`s)WBSRZ5=#P_J^i z3CT3q;-eQi79#JYL@XiRDBtYN5ZaIHSvZD%7SqeE?q397=fnTv0NtIw_625m=Q3&7 z6ejKxSb0V2gb5VhGwNM!6?$NOZC7@eWez}S=>!A z;|~eoeh>&p4Dga(z?)Hs93^8Cl?9~d-nJ`Z&6j#8+>Jjzvmn7Ts{h<|VkREJ_(7vG%CCDNFtV72iN`GD@xg$D6(lUZM=(9P~*( zIAI`;f%N8*BoDZc?F$irgfsSozTa%TZE@?7mMvZgei?3J%Ti z^Vt)X1EY=)f$+{LE8mvHb@_FNH^knK7rcA=b~IZ@gX`DfuXcRX5QVrZ`i&SdF`^FY zn;2{5{ExW1aU94$rvw(oV6e7V3F%Q&O1uuyoTvie!cb}$(QFo`@N18 z5L|e6DNUd4V-kS+~7e5eeBfiDe(kQNrR#X(0Ib%XoKS|P4d9D$z% zLxU`*u(&y;+z)Yd;+$Z2S};?G+3Qa@#m)iN;$gRzxF;RU5|mTINRozaUeVQJJ>uw` z4I5U2UKKj2B=5nCqu{4nbnQ|{^cr;dUK$$ipJ4YS=ix^3*VMr9E&+m}x>vtsVi!G1 zhO_J6M#9Gk;0Bi#YWCmaiPF9y2IZs{P3tfjiH8V!75o)(><&VKpjW~7HqGX=D-cj- z@{G_t5h8b_-)82UpfX3ltjQqnb-(g@O9#6J$MBvAIR~l_`{xO@KRJ|&x`jXeKRMO_ zMbI?n@fQ|~>O(!=_VvH=DE&L+pzp|I{(qA00_yk3i4nhv=uk()nt;(iKOq>}V>hUD zPQdFmjwo0Z52>1^Onwk4^D$F@S9oiJSu)9dA@~>`48&!|8Gm| zX!ZOHk9Oy>3BWYOZhimG3+x*lEQDOU<_!pSXp(HZy0q7eR9p)ksy1v(sLzv%wraQt z$Dte9y5*YuYiF#@CL?d0Pa()EbpMw?nlQldsPH9)zIXX%Y1)-A@W9r>%DYTWU>m>_ z{bzcjkL15R#+B_@qpS1%R7dlFE6kK9_k+vK%)}H3O8lp{4MNGE7Wk<b4wRz9F$&%NqZtgtdyIH%AyLMExBN=VxcQ z7d;(VAo+@i_g-b!`|;r^7*a|A!)Z(b_hXUp&8v8|CXf5)Ab}l2ON%?7mj~WithK5# zj@bh{-%F1S4!)>iCBI4(py$t-ByHKUzb( z{D$|5e58lRd91gYg|nO}Zs@gi_5R@Q9(I%&x7Iqqjv{U#ElS?qy3dR#e^9O1nL=Va z?e?ZU^=`U%Gm*_-1WF_Hx2S!n&HW6PCCc{z+&h{n@OkmLy;8ux5M`sN5Y?U=UT{NBte#Z?YpCNk>Fss*T8wCKZGm8o5Zby zLQtjdEyas{?egP$e%2x|5EKDooSF}(*w(J3CAYjF9Q4NZvgMgv%F7VLr!CL+u6epv zh^MW>Z{1!%M28Z%oUyolNXpTz6RvD3jp}7C=A1?FlNj|DtnRr>7m?k9{i1ptol_Ja z%LCXt6ax;U!ML=y&I2dz;!!LbTsU%pudf680hkcX!ZTvMSUl3>-VNGTGD?#i^L)dd zM6Whw^O1`K(0>A81VbqeLO2sDxo**;ytyjoU@;B_djQcKOhsnC@xX@?e0ji$`O!39QkD6_ZXXzA`= z=bDW!=32y^r%LpCt?r3qyeCH329me}r*9fGrD;&qduCaU*v$UC+8D@Ec<%`YLY&ph znukZc4U*g0CY8?fc{%Zc{l>r-Gz^P_&uY3H4D2~5nw;pdE(hJk#?H7&xY<^MMNbx>N&ywR5zbMj<~(Act&on<*Xe-bn(9BJ{Qu0^7_0d-}PVCFW{Vli8J#O}iiQJ>J$-fN_ z!-0w5Eqcrf@U-RTk<;k5AOI{V^-7pN;bt%sJ#b)#QpPu`?E zD`OW#z2GGT;`&56ohEIVGqNdC3h|Jd{Ryyz1$?@#?MXzL61wKt*_n-;Y~i#o*`Ietl##WM*@=k3>+FZEF#;%b++bwYexQ?3iK1HXod8j zbHg*R=Ct(|{wJdNA)&o+HX`8h zzV;h3V243~7WVtRJ0|e^2yf`W=^WC&EmM5@N9iW6Zp>${i!QdjJj65S!u0g5nc{gU ztVDiN#EU>9DjWIizyVzPo0INC&LqYYf`7MHK=oK~A+zLwHqG&wQwv^3jUR|tWq(}W zh$_UXGTZaIfA~Pe+kU0kdBZi;2HuyU&GdE}JOfPYjLqQqb8nES^k#pw66gq^B{IJX zHFn<~Nfn^GVeo2N>#f@u>J93X-)kP&y7*L1=qr2$G{Gn|KRWo>;SN;b!}d==~80My@!= z0mCZY3qn>=l8tLt{I#Cw$}&qmycGpPKp7D&svxXmm!7MYh!Yd515;TF+Z#?u4nyTz z$Adp;Ubh!$yBtNycP2eiEX5Zm-E^6Pu4MS%4a5K%9mlIDwSnsejsw&4(#e}Ffe*45 z{PtTWcQ@xKAbJVc8hiLkzssZsq;&sru0;Nx(;Nmkr=LXPA2)~qOB=%_$JzOwxg95B z*t4+A^JL+j$|ddLLQ7=L+7}X5QGE}4uCEQiU)~?#lFaHdU_ga3SGQ8u&>-wIl~Iob zO#RDPDjU2X4+A&6Py1}YdY+;?_S7rwCuw>4#@7RZMNauJe%0DUFwf0ceV&(J$)*L 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

3c89_IVRmB?HKD{Fwe3nvhomdlNjIwM}J-( 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 - + Quickly get up and running with Vocode by following our Python quick start guide. diff --git a/docs/open-source/action-agents.mdx b/docs/open-source/action-agents.mdx deleted file mode 100644 index 389174d10c..0000000000 --- a/docs/open-source/action-agents.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: 'Action Agents' -description: 'Empowering agents to take actions during conversations.' ---- - -## Note: Support for actions is currently limited to `ChatGPTAgent`. - -## What are actions? - -Actions refer to specific tools an agent can execute during the conversation. These actions can encompass various activities like writing an email, -scheduling an appointment, and so forth. They are implemented as classes derived from the `BaseAction` class. - -The `BaseAction` class is defined as follows: - -```python -class BaseAction(Generic[ActionOutputType]): - def run(self, params: str) -> ActionOutputType: - raise NotImplementedError -``` - -Every action class derived from BaseAction must implement the run method, which is called to execute the action. -Importantly, each action class should include a docstring for this method that explains the expected parameters. -This docstring is critical as it provides the information that the AI will consume in its prompt when instructing the execution of the action. - -## Agent Actions - -The agent is responsible for managing and executing actions within a conversation. The agent consumes a configuration object at instantiation, -which specifies the actions that the agent can perform. - -The agent configuration lists the actions available to the agent: - -```python -class AgentConfig(AgentConfig, type=AgentType.Base.value): - actions: List[ActionType] - # ... -``` - -## `ActionsWorker`: how actions are executed and consumed - -The `ActionsWorker` class plays a crucial role in the async processing of actions within the system. It's a specialized form of the `InterruptibleWorker` class, -designed to handle the execution of actions and passing results back to the agent. - -The `ActionsWorker` is initialized with an input queue and an output queue. It uses an `ActionFactory` instance to create and execute actions based on the inputs it receives. - -The flow of actions is as follows: - -1. Agent sends action requests to the `ActionsWorker` through the worker's input queue. -2. `ActionsWorker` reads the action request from the input queue. It then creates an instance of the appropriate action using the `ActionFactory`, and executes it using the provided parameters. -3. The executed action returns an `ActionOutput` object which encapsulates the result of the action. -4. `ActionsWorker` creates an `ActionResultAgentInput` from the `ActionOutput`, and puts it in its output queue. -5. The agent then consumes the `ActionResultAgentInput` from the queue in its process method. This - result is added to the transcript of the conversation, and can influence the behavior of the agent in subsequent interactions. - -### Implementing your own action: Nylas email example - -In this section, we provide an example of an action, `NylasSendEmail`, which extends the `BaseAction` class. It implements the run method to send an email using the Nylas API. - -```python -class NylasSendEmail(BaseAction[NylasSendEmailActionOutput]): - def run(self, params: str) -> NylasSendEmailActionOutput: - """Sends an email using Nylas API. - The input to this action is a pipe separated list of the recipient email, email body, optional subject. But always include - the pipe character even if the subject or message IDs are not included and just leave it blank. - The subject should only be included if it is a new email thread. - If there is no message id, the email will be sent as a new email. Otherwise, it will be sent as a reply to the given message. Make sure to include the previous message_id - if you are replying to an email. - - For example, `recipient@example.com|Hello, this is the email body.|this is the subject` would send an email to recipient@example.com with the provided body and subject. - """ - recipient_email, email_body, email_subject = params.split("|") - - from nylas import APIClient - - # Initialize the Nylas client - nylas = APIClient( - client_id=os.getenv("NYLAS_CLIENT_ID"), - client_secret=os.getenv("NYLAS_CLIENT_SECRET"), - access_token=os.getenv("NYLAS_ACCESS_TOKEN"), - ) - - # Create the email draft - draft = nylas.drafts.create() - draft.body = email_body - - draft.subject = ( - email_subject.strip() if email_subject.strip() else "Email from Vocode" - ) - draft.to = [{"email": recipient_email.strip()}] - - # Send the email - draft.send() - - return NylasSendEmailActionOutput(response=json.dumps({"success": True})) -``` - -See [Agent Factory](/open-source/agent-factory) for more information on how to register your action with the agent factory. diff --git a/docs/open-source/action-phrase-triggers.mdx b/docs/open-source/action-phrase-triggers.mdx new file mode 100644 index 0000000000..e7a8dc2c51 --- /dev/null +++ b/docs/open-source/action-phrase-triggers.mdx @@ -0,0 +1,86 @@ +--- +title: 'Action Triggers' +description: 'Activate actions with function calls or specific phrases' +--- +## What are function calls? +[Function calls](https://platform.openai.com/docs/guides/function-calling) allow modern Large Language Models (LLMs) like ChatGPT to perform tasks outside of text generation. +For example, if I create a math assistant with ChatGPT, I might make a "multiply" function that ChatGPT can call to multiply two numbers together. + +If you add an action to a vocode agent, its corresponding function calling schema is added to each ChatGPT query. If the function call is outputted by ChatGPT, the corresponding action is triggered automatically. + +***Note:*** *In vocode agents, ChatGPT can return a text response alongside a function call. In this scenario, the text is synthesized and played first, then the action is run.* + +## What are phrase triggers? + +Phrase triggers are text phrases that activate an action when produced by an agent. Phrase triggers are useful in production use-cases where consistency and reliability are important, since text outputs are easier to control in comparison to function calls. + +## Configuring action triggers +Each vocode action config contains an `action_trigger` field to specify how the action is triggered. The default trigger is function calling. The examples below demonstrate how to set action triggers for an `EndConversation` action config: + +**Function calls:** +```python +from vocode.streaming.action.end_conversation import EndConversationVocodeActionConfig +from vocode.streaming.models.actions import FunctionCallActionTrigger + +EndConversationVocodeActionConfig( + type="action_end_conversation", + action_trigger=FunctionCallActionTrigger( + type="action_trigger_function_call" + ) +) +``` +***Note:*** *You can also leave `action_trigger` field empty and vocode will default to function calls.* + +**Phrase triggers:** + +```python +from vocode.streaming.action.end_conversation import EndConversationVocodeActionConfig +from vocode.streaming.models.actions import PhraseBasedActionTrigger, PhraseBasedActionTriggerConfig, PhraseTrigger + +EndConversationVocodeActionConfig( + type="action_end_conversation", + action_trigger=PhraseBasedActionTrigger( + type = "action_trigger_phrase_based", + config: PhraseBasedActionTriggerConfig( + phrase_triggers = [ + PhraseTrigger( + phrase="Ending conversation now", + condition="phrase_condition_type_contains" + ), + # Additional phrase triggers can be listed here + ] + ) + ) +) +``` +For the code above, if the agent says 'Ending conversation now', the end conversation action will automatically be taken. +You can add multiple phrase triggers for an action by passing a list of `PhraseTrigger` instances. + +The `phrase_condition_type_contains` condition configures the agent to run the action if its output *contains* the phrase. So, the action will also be run if the agent +says 'I am ending conversation now'. + +## Example Scenario + +Let's assume we have an action called `TurnOnLight` that turns on your bedroom light when activated. Take the following conversation: +```plaintext +Human: Hello +AI: How can I assist you today? +Human: Please turn on the lights. +``` + +If the action is triggered via a function call, the bot may respond with: +```plaintext +AI: Sure! +BOT_ACTION_START: Running `action_turn_on_light` +``` +or it may run the action without saying anything. + +If we use a phrase trigger instead, we may do the following: +1. In our prompt, write "If the human asks to turn on the lights, say 'I will turn on the lights now' verbatim" +2. Configure `TurnOnLight` with "I will turn on the lights now" as its phrase trigger + +Then, the bot will respond with: +``` +AI: I will turn on the lights now. +BOT_ACTION_START: Running `action_turn_on_light` +``` \ No newline at end of file diff --git a/docs/open-source/agent-factory.mdx b/docs/open-source/agent-factory.mdx index 7b0c25d7c5..58b17af184 100644 --- a/docs/open-source/agent-factory.mdx +++ b/docs/open-source/agent-factory.mdx @@ -5,18 +5,18 @@ description: 'How to link a custom agent to your app' # Agent Factories -Agent factories specify which agents are available to your app. In order to connect an agent to your app, you must first define an agent factory. To do so, subclass the [`AgentFactory`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/agent/factory.py) class to specify how agents are created. Here you can import and use your own custom agents. +Agent factories specify which agents are available to your app. In order to connect an agent to your app, you must first define an agent factory. To do so, subclass the [`AbstractAgentFactory`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/agent/abstract_factory.py) class to specify how agents are created. Here you can import and use your own custom agents. ## Example -First define your `AgentFactory`: +First define your `AgentFactory`. In this example, we are creating a factory for a new type of agent called MyActionAgent: ```python -from vocode.streaming.agent.factory import AgentFactory +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.action.my_action_factory import MyActionFactory -class MyAgentFactory(AgentFactory): - def __init__(self, agent_config: AgentConfig, action_factory: MyActionFactory): - self.agent_config = agent_config +class MyAgentFactory(AbstractAgentFactory): + def __init__(self, action_factory: MyActionFactory): self.action_factory = action_factory def create_agent( @@ -24,19 +24,24 @@ class MyAgentFactory(AgentFactory): ) -> BaseAgent: if agent_config.type == "MY_ACTION": return MyActionAgent( - agent_config=typing.cast(ActionAgentConfig, self.agent_config), + agent_config=agent_config, action_factory=self.action_factory ) - raise Exception("Invalid agent config") + elif agent_config.type == "other_agent_type": + ... + else: + raise Exception("Invalid agent config") ``` Then, in your app, you can connect the agent to the app: ```python +from vocode.streaming.telephony.server.base import TelephonyServer +from vocode.streaming.agent.my_agent_factory import MyAgentFactory +from vocode.streaming.action.my_action_factory import MyActionFactory telephony_server = TelephonyServer( - agent_factory=MyAgentFactory( - agent_config=agent_config, action_factory=action_factory), + agent_factory=MyAgentFactory(action_factory=MyActionFactory()) ... ) ``` diff --git a/docs/open-source/agents-with-actions.mdx b/docs/open-source/agents-with-actions.mdx new file mode 100644 index 0000000000..9bd04bbdef --- /dev/null +++ b/docs/open-source/agents-with-actions.mdx @@ -0,0 +1,209 @@ +--- +title: 'Agents with Actions' +description: 'Empower agents to take actions during conversations.' +--- + +## Note: Support for actions is currently limited to `ChatGPTAgent`. + +## What are actions? + +Actions refer to specific tools an agent can execute during the conversation. These actions can encompass various activities like writing an email, +scheduling an appointment, and so forth. They are implemented as classes derived from the `BaseAction` class. + +The `BaseAction` class has the following key structure: + +```python +class BaseAction(Generic[ActionConfigType, ParametersType, ResponseType]): + def __init__( + self, + action_config: ActionConfigType, + should_respond: Literal["always", "sometimes", "never"] = "never", + quiet: bool = False, + is_interruptible: bool = True, + **kwargs, + ): + self.action_config = action_config + self.should_respond = should_respond + self.quiet = quiet + self.is_interruptible = is_interruptible + + async def run(self, action_input: ActionInput[ParametersType]) -> ActionOutput[ResponseType]: + raise NotImplementedError +``` + +Every action class derived from BaseAction must implement the run method, which is called to execute the action. +Importantly, each action class should include a docstring for this method that explains the expected parameters, a config that can be used to create the action, and a response class. +- This docstring is critical as it provides the information that the AI will consume in its prompt when instructing the execution of the action. +- The config contains all the parameters needed to customize your action. +- The response object is returned to the agent upon action completion and encodes its output, as well as if it was a success or failure. + +## How Agents use Actions + +The agent is responsible for managing and executing actions within a conversation. The agent consumes a configuration object at instantiation, +which specifies the actions that the agent can perform. + +The agent configuration lists the actions available to the agent: + +```python +class AgentConfig(AgentConfig, type=AgentType.Base.value): + actions: Optional[List[ActionConfig]] + # ... +``` + +### `ActionsWorker`: how actions are executed and consumed + +The `ActionsWorker` class plays a crucial role in the async processing of actions within the system. It's a specialized form of the `InterruptibleWorker` class, +designed to handle the execution of actions and passing results back to the agent. + +The `ActionsWorker` is initialized with an input queue and an output queue. It uses an `ActionFactory` instance to create and execute actions based on the inputs it receives. + +The flow of actions is as follows: + +1. Agent sends action requests to the `ActionsWorker` through the worker's input queue. +2. `ActionsWorker` reads the action request from the input queue. It then creates an instance of the appropriate action using the `ActionFactory`, and executes it using the provided parameters. +3. The executed action returns an `ActionOutput` object which encapsulates the result of the action. +4. `ActionsWorker` creates an `ActionResultAgentInput` from the `ActionOutput`, and puts it in its output queue. +5. The agent then consumes the `ActionResultAgentInput` from the queue in its process method. This + result is added to the transcript of the conversation, and can influence the behavior of the agent in subsequent interactions. + +## Implementing your own action: Nylas email example + +In this section, we provide an example of an action, `NylasSendEmail`, which extends the `BaseAction` class. It implements the run method to send an email using the Nylas API. +We will also show how to add this action to an agent and use it in a conversation. + +### Creating the Action +```python +import os +from typing import Optional, Type + +from pydantic import Field +from pydantic.v1 import BaseModel + +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig +from vocode.streaming.models.actions import ActionInput, ActionOutput + + +_NYLAS_ACTION_DESCRIPTION = """Sends an email using Nylas API. +The input to this action is the recipient emails, email body, optional subject. +The subject should only be included if it is a new email thread. +If there is no message id, the email will be sent as a new email. Otherwise, it will be sent as a reply to the given message. Make sure to include the previous message_id +if you are replying to an email. +""" + + +class NylasSendEmailParameters(BaseModel): + email: str = Field(..., description="The email address to send the email to.") + subject: Optional[str] = Field(None, description="The subject of the email.") + body: str = Field(..., description="The body of the email.") + + +class NylasSendEmailResponse(BaseModel): + success: bool + + +class NylasSendEmailVocodeActionConfig( + VocodeActionConfig, type="action_nylas_send_email" # type: ignore +): + pass + +class NylasSendEmail( + BaseAction[ + NylasSendEmailVocodeActionConfig, + NylasSendEmailParameters, + NylasSendEmailResponse, + ] + ): + description: str = _NYLAS_ACTION_DESCRIPTION + parameters_type: Type[NylasSendEmailParameters] = NylasSendEmailParameters + response_type: Type[NylasSendEmailResponse] = NylasSendEmailResponse + + def __init__( + self, + action_config: NylasSendEmailVocodeActionConfig, + ): + super().__init__( + action_config, + quiet=True, + is_interruptible=True, + ) + + async def _end_of_run_hook(self) -> None: + """This method is called at the end of the run method. It is optional but intended to be + overridden if needed.""" + print("Successfully sent email!") + + async def run( + self, action_input: ActionInput[NylasSendEmailParameters] + ) -> ActionOutput[NylasSendEmailResponse]: + from nylas import APIClient + + # Initialize the Nylas client + nylas = APIClient( + client_id=os.getenv("NYLAS_CLIENT_ID"), + client_secret=os.getenv("NYLAS_CLIENT_SECRET"), + access_token=os.getenv("NYLAS_ACCESS_TOKEN"), + ) + + # Create the email draft + draft = nylas.drafts.create() + draft.body = action_input.params.body + + draft.subject = ( + action_input.params.subject.strip() if action_input.params.subject else "Email from Vocode" + ) + draft.to = [{"email": action_input.params.email.strip()}] + + # Send the email + draft.send() + + await self._end_of_run_hook() + return ActionOutput( + action_type=action_input.action_config.type, + response=NylasSendEmailResponse(success=True), + ) + +``` +We define a structured set of parameters that the LLM will fill, a response structure that the agent can ingest and use as context for the rest of the conversation, and an action +config that crucially contains the `action_type` (but doesn't have any other specific parameters). We also add an `_end_of_run_hook()`, which we customized to log that the action successfully completed. + + +### Making a custom `ActionFactory` +To use our new action with an agent in a conversation, we will need to create an `ActionFactory` that can produce instances of the action. + + +We will store the code above in `nylas_send_email.py` and make a factory that can create this action for an agent: + +```python +from typing import Dict, Sequence, Type + +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.base_action import BaseAction +from vocode.streaming.action.nylas_send_email import NylasSendEmail +from vocode.streaming.models.actions import ActionConfig + +class MyCustomActionFactory(AbstractActionFactory): + def create_action(self, action_config: ActionConfig): + if action_config.type == "action_nylas_send_email": + return NylasSendEmail(action_config) + else: + raise Exception("Action type not supported by Agent config.") +``` + +### Using your action and action factory in an agent + +Now you can use your action in any conversation by adding the action config to an agent config. For example in a ChatGPTAgentConfig, + +```python +action_config = ChatGPTAgentConfig( + ... + actions = [ + NylasSendEmailVocodeActionConfig( + type = "action_nylas_send_email" + ) + ] +) +``` + +When you pass in your new action factory [created above](#making-a-custom-actionfactory), any agent factory can use this config to generate an agent for conversations. +See [Agent Factory](/open-source/agent-factory) for more information on how to use your action factory in an agent factory, as well as how to plug it into a telephony server. diff --git a/docs/open-source/conversation-mechanics.mdx b/docs/open-source/conversation-mechanics.mdx new file mode 100644 index 0000000000..513eef5039 --- /dev/null +++ b/docs/open-source/conversation-mechanics.mdx @@ -0,0 +1,53 @@ +--- +title: "Conversation Mechanics" +description: "How to tune the responsiveness in Vocode conversations" +--- + +Building two-way conversations with an AI is a highly use-case specific task - how realistic the conversation is depends greatly on the nature of the conversation itself. In this guide, we'll cover some of the dials you can turn to configure the mechanics of a conversation in Vocode. + +# Endpointing + +Endpointing is the process of understanding when someone has finished speaking. The `EndpointingConfig` controls how this is done. There are a couple of different ways to configure endpointing: + +We provide `DeepgramEndpointingConfig()` which has some reasonable defaults and knobs to suit most use-cases (but only works with the Deepgram transcriber). + +``` +class DeepgramEndpointingConfig(EndpointingConfig, type="deepgram"): # type: ignore + vad_threshold_ms: int = 500 + utterance_cutoff_ms: int = 1000 + time_silent_config: Optional[TimeSilentConfig] = Field(default_factory=TimeSilentConfig) + use_single_utterance_endpointing_for_first_utterance: bool = False +``` + +- `vad_threshold_ms`: translates to [Deepgram's `endpointing` feature](https://developers.deepgram.com/docs/endpointing#enable-feature) +- `utterance_cutoff_ms`: uses [Deepgram's Utterance End features](https://developers.deepgram.com/docs/utterance-end) +- `time_silent_config`: is a Vocode specific parameter that marks an utterance final if we haven't seen any new words in X seconds +- `use_single_utterance_endpointing_for_first_utterance`: Uses `is_final` instead of `speech_final` for endpointing for the first utterance (works really well for outbound conversations, where the user's first utterance is something like "Hello?") - see [this doc on Deepgram](https://developers.deepgram.com/docs/understand-endpointing-interim-results) for more info. + +Endpointing is highly use-case specific - building a realistic experience for this greatly depends on the person speaking to the AI. Here are few paradigms that we've used to help you along the way: + +- Time-based endpointing: This method considers the speaker to be finished when there is a certain duration of silence. +- Punctuation-based endpointing: This method considers the speaker to be finished when there is a certain duration of silence after a punctuation mark. + +# Interruptions + +When the AI speaks in a `StreamingConversation`, it can be interrupted by the user. `AgentConfig` itself provides a parameter called `interrupt_sensitivity` that can be used to control how sensitive the AI is to interruptions. Interrupt sensitivity has two options: low (default) and high. Low sensitivity makes the bot ignore backchannels (e.g. “sure”, “uh-huh”) while the bot is speaking. High sensitivity makes the agent treat any word from the human as an interruption. + +The implementation of this configuration is in `StreamingConversation.TranscriptionsWorker` - in order to make this work well, you may need to fork Vocode and override this behavior, but it provides a good starting place for most use-cases. + +Stay tuned, more dials to come here soon! + +# Conversation Speed + +`StreamingConversation` also exposes a parameter called `conversation_speed`, which controls the length of endpointing pauses, i.e. how long the bot will wait before responding to the human. This includes normal utterances from the human as well as interruptions. + +The amount of time the bot waits inversely scales with the `conversation_speed` value. So a bot with `conversation_speed` of 2 responds in half the time compared to a `conversation_speed` of 1. Likewise a `conversation_speed` of 0.5 means the bot takes twice as long to respond. + +```python +conversation = StreamingConversation( + speed_coefficient=2 + ... +) +``` + +Based on the speed of the user's speech (we calculate the WPM from each final utterance that goes through the pipeline), the `speed_coefficient` updates throughout the course of the conversation - see `vocode.streaming.utils.speed_manager` to see this implementation! diff --git a/docs/open-source/create-your-own-agent.mdx b/docs/open-source/create-your-own-agent.mdx index e9d583ee01..f4df445f6a 100644 --- a/docs/open-source/create-your-own-agent.mdx +++ b/docs/open-source/create-your-own-agent.mdx @@ -3,15 +3,36 @@ title: "Create your own AI Agent" description: "How to create a custom Agent for your use case." --- -You can subclass a [`RespondAgent`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/agent/base_agent.py#L140) to create a simple agent that can be passed into [`StreamingConversation`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/streaming_conversation.py) has the following interface: +You can subclass a [`RespondAgent`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/agent/base_agent.py#L140) to create a simple agent that can be passed into [`StreamingConversation`](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/streaming_conversation.py). +To do so, you must create an agent type, create an agent config, and then create your agent subclass. In the examples below, we will create an agent that responds with the same message no matter what is said to it, called `BrokenRecordAgent`. -Here's one that responds with the same message no matter what is said to it: +### Agent type +Each agent has a unique agent type string that is checked in various parts of Vocode, most notably in the factories that create agents. So, you must create a new type for your custom agent. See the `AgentType` enum in `vocode/streaming/models/agent.py` for examples. +For our `BrokenRecordAgent`, we will use "agent_broken_record" as our type. +### Agent config +Your agent must have a corresponding agent config that is a subclass of `AgentConfig` and is ([JSON-serializable](https://docs.pydantic.dev/latest/concepts/serialization/#modelmodel_dump_json)). Serialization is automatically handled by [Pydantic](https://docs.pydantic.dev/latest/). + +The agent config should only contain the information you need to deterministically create the same agent each time. This means with the same parameters in your config, the corresponding agent should have the same behavior each time you create it. + +For our `BrokenRecordAgent`, we create a config like: ```python +from vocode.streaming.models.agent import AgentConfig + class BrokenRecordAgentConfig(AgentConfig, type="agent_broken_record"): - message: str + message: str # The message we will always return +``` +### Custom Agent +Now, you can create your custom agent subclass of `RespondAgent`. In your class header, pass in `RespondAgent` with a your agent type as a type hint. This should look like `RespondAgent[Your_Agent_Type]`. +Each agent should override the `generate_response()` async method to support streaming and `respond()` method to support turn-based conversations. +> If you want to only support turn-based conversations, you do not have to overwrite `generate_response()` but you MUST set `generate_response=False` in your agent config (see `ChatVertexAIAgentConfig` in `vocode/streaming/models/agent.py` for an example). Otherwise, you must ALWAYS implement the `generate_response()` async method. + +The `generate_response()` method returns an `AsyncGenerator` of tuples containing each message/sentence and a boolean for whether that message can be interrupted by the human speaking. You can automatically create this generator by yielding instead of returning (see example below). + +We will now define our `BrokenRecordAgent`. Since we simply return the same message each time, we can return and yield that message in `respond()` and `generate_response()`, respectively: +```python class BrokenRecordAgent(RespondAgent[BrokenRecordAgentConfig]): # is_interrupt is True when the human has just interrupted the bot's last response @@ -27,4 +48,4 @@ class BrokenRecordAgent(RespondAgent[BrokenRecordAgentConfig]): yield self.agent_config.message, False ``` -See [our other agent implementations](https://github.com/vocodedev/vocode-python/tree/main/vocode/streaming/agent) for more guidance! +See [our other agent implementations](https://github.com/vocodedev/vocode-python/tree/main/vocode/streaming/agent) for more examples! diff --git a/docs/open-source/events-manager.mdx b/docs/open-source/events-manager.mdx index d947e9848c..b7558cb0ba 100644 --- a/docs/open-source/events-manager.mdx +++ b/docs/open-source/events-manager.mdx @@ -5,87 +5,60 @@ description: "How events are emitted and consumed." ## What is the Events Manager -The Events Manager is a class designed to facilitate asynchronous handling of events in the application. It allows for non-blocking actions on events, such as processing transcripts, managing phone calls, and other tasks. The main components of the Events Manager are the `EventsManager` class and several `Event` subclasses representing various event types. +The Events Manager consumes realtime events during conversations - it provides a framework to consume and take action on these events asychronously. -## EventsManager Class - -The `EventsManager` class is responsible for managing the event queue and handling events asynchronously. The class provides methods for publishing events, starting the event loop, handling events, and ending the event loop. - -### Initialization +## Current Event Types -```python -def __init__(self, subscriptions: List[EventType] = []): - self.queue = asyncio.Queue() - self.subscriptions = set(subscriptions) - self.active = False -``` +The current event types include: -The `EventsManager` constructor accepts an optional list of `EventType` subscriptions. By default, it initializes an empty set of subscriptions, an asynchronous queue, and sets the `active` attribute to `False`. +1. `TRANSCRIPT`: Indicates a partial transcript for the conversation has been received. +2. `TRANSCRIPT_COMPLETE`: Indicates the transcript is complete (ie conversation has ended). +3. `ACTION`: Indicates that a Vocode action has begun or completed. +4. `PHONE_CALL_CONNECTED`: Indicates a phone call has been connected (only gets sent during `PhoneConversation`s) +5. `PHONE_CALL_ENDED`: Indicates a phone call has ended. -### Publishing Events +## Usage -```python -def publish_event(self, event: Event): - if event.type in self.subscriptions: - self.queue.put_nowait(event) -``` +Using the events manager to take particular action when events fire requires that you subclass `vocode.streaming.utils.EventsManager` and override the `handle_event` method. -The `publish_event` method takes an `Event` object as input and adds it to the queue if its type is in the set of subscribed event types. +You can also configure which events your `EventsManager` is subscribed to by using the `subscriptions` property (see example). -### Starting the Event Loop +### Example ```python -async def start(self): - self.active = True - while self.active: - try: - event: Event = await self.queue.get() - except asyncio.QueueEmpty: - await asyncio.sleep(1) - self.handle_event(event) -``` +from vocode.streaming.models.events import Event, EventType -## Current Event Types +from vocode.streaming.models.events import Event, EventType +from vocode.streaming.models.transcript import TranscriptCompleteEvent +from vocode.streaming.utils.events_manager import EventsManager -The current event types include: -1. `TRANSCRIPT`: Indicates a partial transcript for the conversation has been received. -2. `TRANSCRIPT_COMPLETE`: Indicates the transcript is complete (ie conversation has ended). -3. `PHONE_CALL_CONNECTED`: Indicates a phone call has been connected. -4. `PHONE_CALL_ENDED`: Indicates a phone call has ended. -5. `RECORDING`: (Vonage Only) Indicates a secure URL containing a recording of the call is available. Requires `recording=true` in `VonageConfig`. +class CustomEventsManager(EventsManager): + def __init__(self): + super().__init__([EventType.TRANSCRIPT_COMPLETE]) -## Example Usage + async def handle_event(self, event: Event): + if isinstance(event, TranscriptCompleteEvent): + print("The call has finished, the transcript was", event.transcript.to_string()) +``` -The following example demonstrates how the `EventsManager` class can be used to consume the `TRANSCRIPT_COMPLETE` event and save the transcript to a file using the `add_transcript` method: +In this example, we create a custom `EventsManager` subclass is created with a subscription to the `TRANSCRIPT_COMPLETE` event and then print the transcript when we receive the event. -```python -import logging -from fastapi import FastAPI -from vocode.streaming.models.events import Event, EventType, TranscriptCompleteEvent -from vocode.streaming.utils import events_manager -from call_transcript_utils import add_transcript +To use `CustomEventsManager`, you can pass it into any Conversation, e.g. -app = FastAPI(docs_url=None) +``` +... +conversation = StreamingConversation( + ..., + events_manager=CustomEventsManager() +) +``` -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) +You can also pass it into a `TelephonyServer`, like: -class CustomEventsManager(events_manager.EventsManager): - def __init__(self): - super().__init__(subscriptions=[EventType.TRANSCRIPT_COMPLETE]) - - def handle_event(self, event: Event): - if event.type == EventType.TRANSCRIPT_COMPLETE: - transcript_complete_event = typing.cast(TranscriptCompleteEvent, event) - add_transcript( - transcript_complete_event.conversation_id, - transcript_complete_event.transcript, - ) - -events_manager_instance = CustomEventsManager() -await events_manager_instance.start() ``` - -In this example, a custom `EventsManager` subclass is created with a subscription to the `TRANSCRIPT_COMPLETE` event. The `handle_event` method is overridden to save the transcript to a file using the `add_transcript` method when the `TRANSCRIPT_COMPLETE` event is received. +server = TelephonyServer( + ..., + events_manager=CustomEventsManager() +) +``` diff --git a/docs/open-source/external-action.mdx b/docs/open-source/external-action.mdx new file mode 100644 index 0000000000..44c5de06a3 --- /dev/null +++ b/docs/open-source/external-action.mdx @@ -0,0 +1,263 @@ +--- +title: "External Actions" +description: "Have your agent communicate with an External API" +--- + +External Actions allow Vocode agents to take actions outside the realm of a phone call. In particular, Vocode agents can decide to _push_ information to external systems via an API request, and _pull_ information from the API response in order to: + +1. give the agent context to inform the rest of the phone call +2. change the agent’s behavior based on the pulled information +3. run functions/tasks outside the call + +## How it Works + +### Configuring an External Action with `ExecuteExternalActionVocodeActionConfig` + +The Vocode Agent will determine after each turn of conversation if its the ideal time to interact with the External API based primarily on the configured External Action's `description` and `input_schema`! + +#### Overview + +- `processing_mode`: We currently only support `muted`, which makes the agent silent while processing the request. + +- `name`: the name of the external action -- this has no impact on the functionality of action itself. + +- `description`: Used by the Function Calling API to determine when to make the External Action call itself. See the [`description` field section below](/open-source/external-action#description-field) for more info! + +- `url`: The API request is sent to this URL in the format + defined below in [Responding to External Action API Requests](/open-source/external-action#input-schema-field) + +- `input_schema`: A [JSON Schema](https://json-schema.org/) for the payload to send to the External API. See the [`input_schema` field section below](/open-source/external-action#responding-to-external-action-api-requests) for more info! + +- `speak_on_send`: if `True`, then the underlying LLM will generate a message to be spoken as the + API request is being sent. + +- `speak_on_receive`: if `True`, then the agent will speak once it receives a result from the API Response. If the response does not contain an `agent_message` (see [Response Formatting](#response-formatting)), the agent will query the LLM for the message to speak. + +- `signature_secret`: a base64 encoded string to enable request validation, see the [Signature Validation section](/open-source/external-action#signature-validation) below for more info + +#### `input_schema` Field + +The `input_schema` field is a [JSON Schema](https://json-schema.org/) form the payload to send to the External API. + +For example, in the [Meeting Assistant Example](/open-source/external-action#meeting-assistant-example) below we formed the following JSON schema: + +```json +{ + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"] + }, + "time": { + "type": "string", + "pattern": "^d{2}:d0[ap]m$" + } + } +} +``` + +This is stating the External API is expecting: + +- Two fields + - `length` (string): either "30m" or "1hr" + - `time` (string): a regex pattern defining a time ending in a zero with `am`/`pm` on the end ie: `10:30am` + + + If you’re noticing that this looks very familiar to OpenAI function calling, it is! Vocode treats OpenAI Function Calling as a first-class standard when the agent uses an OpenAI LLM. + + The lone difference is that the top level `input_schema` JSON schema must be an `object` - this is so we can use JSON to send over parameters to the user’s API. + + + +#### `description` Field + +The `description` is best used to descibe your External Action's purpose. As its passed through directly to the LLM, its the best way to convey instructions to the underlying Vocode Agent. + +For example, in the [Meeting Assistant Example](/open-source/external-action#meeting-assistant-example) below we want to book a meeting for 30 minutes to an hour so we set the description as `Book a meeting for a 30 minute or 1 hour call.` + + + The `description` field is passed through and heavily affects how functions are triggered and queried, + so we recommend treating it similar to prompting for an LLM! + + +### Responding to External Action API Requests + +Once an External Action has been created, the Vocode Agent will issue API requests to the defined `url` during the course of a phone call based on the [configuration noted above](/open-source/external-action#configuring-an-external-action-with-executeexternalactionvocodeactionconfig) +The Vocode API will wait a maximum of _10 seconds_ before timing out the request. + +In particular, Vocode will issue a POST request to `url` with a JSON payload that specifically matches `input_schema`. Using the [Meeting Assistant Example](/open-source/external-action#meeting-assistant-example) below, the request will contain: + +```bash +POST url HTTP/1.1 +Accept: application/json +Content-Type: application/json +x-vocode-signature: + +{ + "payload": { + "length": "30m", + "time": "10:30am" + } +} +``` + +#### Signature Validation + +A cryptographically signed signature of the request body and a randomly generated byte hash is included as a header (under `x-vocode-signature`) in the outbound request, so the receiving API can validate the identity of the incoming request. The signature secret is used to sign the request and ensure the validity of the `x-vocode-signature` field, and therefore *must be securely managed*. + +This should be set as a base64-encoded string and we recommend a longer length as well, using the following snippet as an example: + +```python +import os +import base64 + +signature_secret = base64.b64encode(os.urandom(32)).decode() +``` + +Use the following code snippet to check the signature in an inbound request: + +```python +import base64 +import hashlib +import hmac + +async def test_requester_encodes_signature( + request_signature_value: str, signature_secret: str, payload: dict +): + """ + Asynchronous function to check if the request signature is encoded correctly. + + Args: + request_signature_value (str): The request signature to be decoded. + signature_secret (str): The secret for the action (make sure this is stored securely). + payload (dict): The payload to be used for digest calculation. + + Returns: + None + """ + signature_secret_as_bytes = base64.b64decode(signature_secret) + decoded_digest = base64.b64decode(request_signature_value) + calculated_digest = hmac.new(signature_secret_as_bytes, json.dumps(payload).encode(), hashlib.sha256).digest() + assert hmac.compare_digest(decoded_digest, calculated_digest) is True + +``` + +#### Response Formatting + +Vocode expects responses from the user’s API in JSON in the following format: + +```python +Response { + result: Any + agent_message: Optional[str] = None +} +``` + +- `result` is a payload containing the result of the action on the user’s side, and can be in any format +- `agent_message` optionally contains a message that will be synthesized into audio and sent back to the phone call. Note this means the LLM will not be queried to send a message (see [Configuring the External Action](/open-source/external-action#configuring-an-external-action-with-executeexternalactionvocodeactionconfig) above for more info) + +In the [Meeting Assistant Example](/open-source/external-action#meeting-assistant-example) below, the user’s API could return back a JSON response that looks like: + +```json +{ + "result": { + "success": true + }, + "agent_message": "I've set up a calendar appointment at 10:30am tomorrow for 30 minutes" +} +``` + +## EA Local Response Server Example: + +The following is an example of a quick start to enable testing external actions locally. + +Running `fastapi dev app.py` will run the server @ `http://127.0.0.1:8000` and can be used for external actions locally! + + +```python app.py +import asyncio +import base64 +import hashlib +import hmac +import json +import time + +from fastapi import FastAPI, HTTPException, Request, status +from pydantic import BaseModel + +app = FastAPI() + +action_secret = "" + + +def is_signature_valid(request: Request, json_payload: dict): + signature_secret_as_bytes = base64.b64decode(action_secret) + decoded_digest = base64.b64decode(request.headers.get("x-vocode-signature")) + calculated_digest = hmac.new( + signature_secret_as_bytes, json.dumps(json_payload).encode(), hashlib.sha256 + ).digest() + return hmac.compare_digest(decoded_digest, calculated_digest) + + +@app.post("/external_action") +def update_item(request: Request): + json_payload = asyncio.run(request.json()) + print(json_payload) + if not is_signature_valid(request, json_payload): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Signature verification failed for payload", + ) + time.sleep(3) + return { + "result": {"success": True}, + } +```` +```txt requirements.txt +pydantic==2.* +fastapi==0.111.* +```` + + + +## Meeting Assistant Example + +This is an example of how to create an action config which will attempt to book a meeting for 30 minutes or an hour at any time ending in a zero (ie 10:30am is okay but 10:35am is not) + +```python Python +import json +import base64 +import os + +from vocode.streaming.action.execute_external_action import ( + ExecuteExternalAction, + ExecuteExternalActionVocodeActionConfig, +) + +ACTION_INPUT_SCHEMA = { + "type": "object", + "properties": { + "length": { + "type": "string", + "enum": ["30m", "1hr"], + }, + "time": { + "type": "string", + "pattern": "^\d{2}:\d0[ap]m$", + }, + }, +} + +action_config = ExecuteExternalActionVocodeActionConfig( + name = "Meeting_Booking_Assistant", + description = "Book a meeting for a 30 minute or 1 hour call.", + url = "http://example.com/booking", + speak_on_send = True, + speak_on_receive = True, + input_schema = json.dumps(ACTION_INPUT_SCHEMA), + signature_secret = base64.b64encode(os.urandom(32)).decode(), +) +``` +See [Action Agents](/open-source/action-agents#using-your-action-and-action-factory-in-an-agent) for an example of how to use this action config with an agent in a conversation. +Note that you do not need to create a custom action factory, since `DefaultActionFactory` already supports external actions. \ No newline at end of file diff --git a/docs/open-source/how-to-use-it.mdx b/docs/open-source/how-to-use-it.mdx index c0daf89543..bbf38d941e 100644 --- a/docs/open-source/how-to-use-it.mdx +++ b/docs/open-source/how-to-use-it.mdx @@ -5,8 +5,7 @@ description: "Various ways to utilize Vocode." ## Understanding Our Open Source Libraries -Vocode's Open Source supports both Python and React, with plans for future support for -additional languages. +Vocode's Open Source supports Python, and a client library in React. ### Getting Started with the Open Source Python Library diff --git a/docs/open-source/language-support.mdx b/docs/open-source/language-support.mdx index 694887fb62..004c5f089f 100644 --- a/docs/open-source/language-support.mdx +++ b/docs/open-source/language-support.mdx @@ -22,11 +22,9 @@ synthesizer_config = AzureSynthesizerConfig( ) ``` -See the [full list of supported voices](https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support?tabs=tts). - ## Transcription -The transcriber used in vocode is also configurable. By default, `DeepgramTranscriber` is used which supports [over 25 languages](https://developers.deepgram.com/docs/languages-overview). +The transcriber used in vocode is also configurable. By default, `DeepgramTranscriber` is used which supports [over 35 languages](https://developers.deepgram.com/docs/languages-overview). To configure a different language model, modify the language code passed to `TranscriberConfig` when initializing the config object (`en-US` is the default): @@ -35,10 +33,11 @@ from vocode.streaming.models.transcriber import DeepgramTranscriberConfig transcriber_config = DeepgramTranscriberConfig( language="es" # Spanish + model="nova-2" # Most languages are supported on the Nova 2 model ) ``` -See the [Deepgram docs](https://developers.deepgram.com/docs/languages-overview) for the list of supported lamguages. +***Note: the default model for Deepgram is Nova, so you must pass `model="nova-2"` to use that model.*** Other transcription services like Google Cloud Speech or Assembly AI could also be used by configuring the appropriate `TranscriberConfig`. diff --git a/docs/open-source/logging-with-loguru.mdx b/docs/open-source/logging-with-loguru.mdx new file mode 100644 index 0000000000..4205468e1f --- /dev/null +++ b/docs/open-source/logging-with-loguru.mdx @@ -0,0 +1,73 @@ +--- +title: "Logging with Loguru" +description: "Make logging set up less painful for local and production usage!" +--- + +Loguru is a powerful and flexible logging library for Python that simplifies logging setup and usage. It provides a more intuitive and feature-rich alternative to Python's built-in logging module. + +## Why Use Loguru? + +Loguru offers several advantages over the standard logging module: + +- **Ease of Use**: Loguru simplifies the process of setting up and using loggers. +- **Rich Features**: It provides advanced features like automatic exception catching, structured logging, and more. +- **Flexibility**: Loguru allows for easy configuration of different logging formats and destinations. + +## Using the Vocode Implementation + +The Vocode implementation of Loguru provides a seamless way to integrate logging into your application. It includes custom handlers and configuration functions to streamline the setup process. When utilizing the JSON logging configuration, it'll also pull relevant environment variables such as `conversation_id` and include them in the JSON output for better production debugging! + +### Setting Up Logging + +To set up logging in your application, you can use the provided configuration functions. Here's how to configure pretty printing for local development and JSON logging for production: + +#### Pretty Printing Locally + +To enable pretty printing locally, use the `configure_pretty_logging` function. This will set up Loguru to output logs with colored formatting, making them easier to read during development. + +```python +from vocode.logging import configure_pretty_logging + +configure_pretty_logging() +``` + +#### JSON Logging in Production + +For production environments, you may want to log in JSON format for better integration with logging systems and easier parsing. Use the `configure_json_logging` function to set this up. + +```python +from vocode.logging import configure_json_logging + +configure_json_logging() +``` + +### Why Use Different Setups? + +Using different logging setups for local and production environments can be beneficial for several reasons: + +- **Readability**: Pretty printing makes logs easier to read during development, helping you quickly identify issues. +- **Structured Logging**: JSON logging provides structured logs that are easier to parse and analyze in production, especially when using log aggregation and monitoring tools. + +## Example Snippet + +Here's an example of how you can set up logging in your application: + +```python +import os +from vocode.logging import configure_pretty_logging, configure_json_logging + +DEPLOYED_ENVIRONMENTS = ["production", "staging"] +ENVIRONMENT = os.environ.get("ENVIRONMENT", "development") + +def configure_logging() -> None: # pragma: no cover + """Configures logging.""" + if ENVIRONMENT in DEPLOYED_ENVIRONMENTS: + configure_json_logging() + else: + configure_pretty_logging() + +# Configure logging based on the environment +configure_logging() + +# Your application code here +``` diff --git a/docs/open-source/playground.mdx b/docs/open-source/playground.mdx index 662e8f97e1..f6acb2da9f 100644 --- a/docs/open-source/playground.mdx +++ b/docs/open-source/playground.mdx @@ -8,6 +8,11 @@ test transcribers, agents, and synthesizers. To begin, clone the [repo](https://github.com/vocodedev/vocode-python). +Install the core packages by running the following: +``` +poetry install +``` + # Streaming ## Transcriber @@ -32,9 +37,11 @@ make chat ## Synthesizer -1. Update your synthesizer configuration in `playground/streaming/synthesizer/synthesize.py` +1. Install the synthesizer packages by running `poetry install --extras=synthesizers` + +2. Update your synthesizer configuration in `playground/streaming/synthesizer/synthesize.py` -2. Run the following script to synthesize text to speech and play it to your speaker: +3. Run the following script to synthesize text to speech and play it to your speaker: ``` make synthesize diff --git a/docs/open-source/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx index 10cfffb5a7..7c22707f35 100644 --- a/docs/open-source/python-quickstart.mdx +++ b/docs/open-source/python-quickstart.mdx @@ -8,14 +8,11 @@ description: "Get up and running using Python" Install the [vocode package](https://pypi.org/project/vocode/): ```bash -pip install 'vocode[io]' +pip install vocode ``` # Getting started -The `io` extra installs the packages necessary to run our voice conversations locally, but is not needed for other surfaces, e.g. [phone calls](/open-source/telephony). -You may need to install [portaudio](https://formulae.brew.sh/formula/portaudio) and [ffmpeg](https://formulae.brew.sh/formula/ffmpeg) on your system. - ## Working with system audio We provide helper methods to hook into your system audio. @@ -33,74 +30,94 @@ If the default I/O devices are not being set properly, set `use_default_devices` Vocode provides a unified interface across various speech transcription, speech synthesis, and AI/NLU providers. To use these providers with Vocode, you'll need to grab credentials from these providers and set them in the Vocode environment. -```python -# these can also be set as environment variables -vocode.setenv( - OPENAI_API_KEY="", - DEEPGRAM_API_KEY="", - AZURE_SPEECH_KEY="", - AZURE_SPEECH_REGION="", -) -``` +You can either set the following parameters as environment variables (e.g. by specifying them in a `.env` file and using a package like `python-dotenv` to load), or set them manually in the pydantic settings (see below). For AZURE_SPEECH_REGION you should use the URL format. For example, if you're using the "East US" region, the value should be "eastus". See [Azure Region list](https://learn.microsoft.com/en-us/azure/cognitive-services/speech-service/rest-text-to-speech?tabs=streaming#prebuilt-neural-voices). ## `StreamingConversation` example +This can also be found in the [`quickstarts` directory](https://github.com/vocodedev/vocode-core/blob/main/quickstarts/streaming_conversation.py) of the repo. + ```python import asyncio import signal -import vocode -from vocode.streaming.streaming_conversation import StreamingConversation +from pydantic_settings import BaseSettings, SettingsConfigDict + from vocode.helpers import create_streaming_microphone_input_and_speaker_output -from vocode.streaming.models.transcriber import ( - DeepgramTranscriberConfig, - PunctuationEndpointingConfig, -) +from vocode.logging import configure_pretty_logging from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import ( + DeepgramTranscriberConfig, + PunctuationEndpointingConfig, +) +from vocode.streaming.streaming_conversation import StreamingConversation from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber -# these can also be set as environment variables -vocode.setenv( - OPENAI_API_KEY="", - DEEPGRAM_API_KEY="", - AZURE_SPEECH_KEY="", - AZURE_SPEECH_REGION="", -) +configure_pretty_logging() + + +class Settings(BaseSettings): + """ + Settings for the streaming conversation quickstart. + These parameters can be configured with environment variables. + """ + + openai_api_key: str = "ENTER_YOUR_OPENAI_API_KEY_HERE" + azure_speech_key: str = "ENTER_YOUR_AZURE_KEY_HERE" + deepgram_api_key: str = "ENTER_YOUR_DEEPGRAM_API_KEY_HERE" + + azure_speech_region: str = "eastus" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) + + +settings = Settings() async def main(): - microphone_input, speaker_output = create_streaming_microphone_input_and_speaker_output( - use_default_devices=True, + ( + microphone_input, + speaker_output, + ) = create_streaming_microphone_input_and_speaker_output( + use_default_devices=False, + use_blocking_speaker_output=True, # this moves the playback to a separate thread, set to False to use the main thread ) conversation = StreamingConversation( output_device=speaker_output, transcriber=DeepgramTranscriber( DeepgramTranscriberConfig.from_input_device( - microphone_input, endpointing_config=PunctuationEndpointingConfig() - ) + microphone_input, + endpointing_config=PunctuationEndpointingConfig(), + api_key=settings.deepgram_api_key, + ), ), agent=ChatGPTAgent( ChatGPTAgentConfig( - initial_message=BaseMessage(text="Hello!"), - prompt_preamble="Have a pleasant conversation about life", - ), + openai_api_key=settings.openai_api_key, + initial_message=BaseMessage(text="What up"), + prompt_preamble="""The AI is having a pleasant conversation about life""", + ) ), synthesizer=AzureSynthesizer( - AzureSynthesizerConfig.from_output_device(speaker_output) + AzureSynthesizerConfig.from_output_device(speaker_output), + azure_speech_key=settings.azure_speech_key, + azure_speech_region=settings.azure_speech_region, ), ) await conversation.start() print("Conversation started, press Ctrl+C to end") - signal.signal( - signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate()) - ) + signal.signal(signal.SIGINT, lambda _0, _1: asyncio.create_task(conversation.terminate())) while conversation.is_active(): chunk = await microphone_input.get_audio() conversation.receive_audio(chunk) diff --git a/docs/open-source/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx index 1b3a7372d6..08f89cf6ee 100644 --- a/docs/open-source/react-quickstart.mdx +++ b/docs/open-source/react-quickstart.mdx @@ -13,7 +13,7 @@ Or, start from our [Replit template](https://replit.com/@vocode/Simple-Conversat ## Setting up the conversation -Our self-hosted backend allows you to expose a websocket route in the same format that our hosted backend does. This allows you to deploy any agent you'd like into the conversation. +Our self-hosted backend allows you to expose a websocket route that operates like `StreamingConversation`. To get started, clone the Vocode repo or copy the [client backend app](https://github.com/vocodedev/vocode-python/tree/main/apps/client_backend) directory. @@ -56,35 +56,25 @@ uvicorn main:app --port 3000 You now have a server with a Vocode websocket route at localhost:3000! You can now use the `useConversation` hook with your self-hosted backend as follows: -```javascript -const { status, start, stop, analyserNode } = useConversation({ +```typescript +import { useConversation } from "vocode"; + +const { status, start, stop, error, analyserNode } = useConversation({ backendUrl: "", // looks like ws://localhost:3000/conversation or wss://asdf1234.ngrok.app/conversation if using ngrok audioDeviceConfig: {}, }); ``` -# Demo installation and setup - -Clone the `vocode-react-demo` [repository](https://github.com/vocodedev/vocode-react-demo). - -``` -$ git clone https://github.com/vocodedev/vocode-react-demo.git -``` - -Run npm install inside the directory to download all of the dependencies. - -``` -$ npm install -``` - -Set your Client SDK key inside of your `.env` +Use the `status`, `start`, and `stop` objects within your React components to control conversations with your self-hosted backend, e.g. -``` -REACT_APP_VOCODE_API_KEY=YOUR KEY HERE -``` - -Start the application +```jsx +<> + {status === "idle" &&

Press me to talk!

} + {status == "error" && error &&

{error.message}

} -``` -$ npm start + + ``` diff --git a/docs/open-source/sentry.mdx b/docs/open-source/sentry.mdx new file mode 100644 index 0000000000..605a66b5d7 --- /dev/null +++ b/docs/open-source/sentry.mdx @@ -0,0 +1,135 @@ +--- +title: "[Beta] Sentry Integration" +description: "Integrate Sentry for error tracking and performance monitoring" +--- + +## What is Sentry? + +[Sentry](https://sentry.io/) is an open-source error tracking tool that helps developers monitor and fix crashes in real-time. It provides insights into the health of your applications by capturing and reporting errors, exceptions, and performance issues. + +## Why integrate Sentry? + +Integrating Sentry into your application allows you to: + +- Automatically capture and report errors and exceptions. +- Monitor the performance of your application. +- Gain insights into the user experience and identify bottlenecks. +- Improve the overall reliability and stability of your application. + +## Configuring Sentry + +To integrate Sentry into your application, you need to initialize the Sentry SDK at the earliest instantiation point in your code. This ensures that Sentry starts capturing errors and performance data as soon as possible. + +Here's how you can configure the Sentry SDK: + +```python +import os +import sentry_sdk +from sentry_sdk.integrations.asyncio import AsyncioIntegration +from sentry_sdk.integrations.logging import LoguruIntegration + +sentry_sdk.init( + dsn=os.getenv("SENTRY_DSN"), + environment=os.getenv("ENVIRONMENT"), + # Sample rate for transactions (performance). + traces_sample_rate=1.0, + # Sample rate for exceptions / crashes. + sample_rate=1.0, + max_request_body_size="always", + integrations=[ + AsyncioIntegration(), + LoguruIntegration(), + ], +) +``` + +Head to [sentry.io](sentry.io) to get your DSN! See https://docs.sentry.io/platforms/python/configuration/options/ for more info about the above options. + +## Instrumenting your application + +Vocode exposes a set of custom spans that get automatically sent to Sentry during Vocode conversations. To use these spans, you'll need to manually attach a transaction to the current scope. + +### Example 1: Streaming Conversation + +Update `quickstarts/streaming_conversation.py`, replace the `main` function with the following code: + +```python +import sentry_sdk +from sentry_sdk.integrations.asyncio import AsyncioIntegration +from sentry_sdk.integrations.loguru import LoguruIntegration +from vocode import sentry_transaction + +sentry_sdk.init( + ..., + integrations=[ + AsyncioIntegration(), + LoguruIntegration(), + ], +) + +async def main(): + ... + await conversation.start() + ... + + +if __name__ == "__main__": + with sentry_sdk.start_transaction( + op="streaming_conversation", description="streaming_conversation" + ) as sentry_txn: + sentry_transaction.set(sentry_txn) + asyncio.run(main()) +``` + +Head to the Performance pane in Sentry and click into the trace, you should see something that looks like this: + +![Sentry Transaction](/images/sentry.png) + +### Example 2: Telephony Server + +Simply instantiate the Sentry SDK at the top of the file, e.g. in `app/telephony_app/main.py` + +```python +sentry_sdk.init( + ... +) + +app = FastAPI(docs_url=None) +``` + +## Custom Spans Overview + +### Latency of Conversation + +**Latency of Conversation** _(`LATENCY_OF_CONVERSATION`)_ measures the overall latency of a conversation, from when the user finishes their utterance to when the agent begins its response. It is broken up into the following sub-spans: + +- **[Deepgram Only] Endpointing Latency** _(`ENDPOINTING_LATENCY`)_: Captures the extra latency involved from retrieving finalized transcripts from Deepgram before deciding to invoke the agent. +- **Language model Time to First Token** _(`LANGUAGE_MODEL_TIME_TO_FIRST_TOKEN`)_: Tracks the time taken by the language model to generate the first token (word or character) in its response. +- **Synthesis Time to First Token** _(`SYNTHESIS_TIME_TO_FIRST_TOKEN`)_: Measures the time taken by the synthesizer to generate the first token in the synthesized speech. This is useful for evaluating the initial response time of the synthesizer. + +### Deepgram + +We capture the following spans in our Deepgram integration: + +- **Connected to First Send** _(`CONNECTED_TO_FIRST_SEND`)_: Measures the time from when the Deepgram websocket connection is established to when the first data is sent +- **[Deepgram Only] First Send to First Receive** _(`FIRST_SEND_TO_FIRST_RECEIVE`)_: Measures the time from when the first data is sent to Deepgram to when the first response is received +- **[Deepgram Only] Start to Connection** _(`START_TO_CONNECTION`)_: Tracks the time it takes to establish the websocket connection with Deepgram + +### LLM + +For our OpenAI and Anthropic integrations, we capture: + +- **Time to First Token** _(`TIME_TO_FIRST_TOKEN`)_: Measures the time taken by the language model to generate the first token (word or character) in its response. +- **LLM First Sentence Total** _(`LLM_FIRST_SENTENCE_TOTAL`)_: Measures the total time taken by the language model to generate the first complete sentence. + +### Synthesizer + +For most of our synthesizer integrations, we capture: + +- **Synthesis Generate First Chunk** _(`SYNTHESIS_GENERATE_FIRST_CHUNK`)_: Measures the time taken to generate the first chunk of synthesized speech. +- **Synthesizer Synthesis Total** _(`SYNTHESIZER_SYNTHESIS_TOTAL`)_: Tracks the total time taken for the entire speech synthesis process. This span helps in understanding the overall performance of the synthesizer. + +These spans will have the actual synthesizer's name prepended to them. For example, if the synthesizer is `ElevenLabsSynthesizer`, the span `SYNTHESIZER_SYNTHESIS_TOTAL` will be recorded as `ElevenLabsSynthesizer.synthesis_total`: + +- **Synthesis Total** _(`SYNTHESIZER_SYNTHESIS_TOTAL`)_ +- **Time to First Token** _(`SYNTHESIZER_TIME_TO_FIRST_TOKEN`)_ diff --git a/docs/open-source/telephony.mdx b/docs/open-source/telephony.mdx index d608f0e07f..6537e1e3b5 100644 --- a/docs/open-source/telephony.mdx +++ b/docs/open-source/telephony.mdx @@ -117,8 +117,6 @@ Make sure the server we just set up is already running. Then, in `outbound_call. Replace the `to_phone` with the number you want to call and the `from_phone` with the number you want to call from. In order to make a call from the `from_phone`, you must have access to it via Twilio (either a number purchased via Twilio or verify the caller ID). -> Note: To ensure legal compliance with robocall regulations in California, the following code snippet from the [Vocode library](https://github.com/vocodedev/vocode-python/blob/main/vocode/streaming/telephony/conversation/outbound_call.py#L83-L96) utilizes Twilio Line Intelligence to check if calls are made to mobile phones: For Canadian phone numbers, the Twilio Lookup API may not return carrier data due to the Canadian Local Number Portability Consortium (CLNPC) requirements. More information on this issue can be found in the [Twilio Support Article](https://support.twilio.com/hc/en-us/articles/360004563433-Twilio-Lookup-API-is-Not-Returning-Carrier-Data-for-Canadian-Phone-Numbers). - Run the script with `poetry run python outbound_call.py`. ## Configuration @@ -129,26 +127,39 @@ or `SynthesizerConfig` - the default transcriber is Deepgram and the default syn This example sets up an agent that spells every word that is sent to it - any text-in, text-out function can be turned into a voice conversation by subclassing `BaseAgent` and creating an `AgentFactory`. ``` +import typing +from typing import Optional, Tuple + +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.agent.base_agent import BaseAgent, RespondAgent +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.models.agent import AgentConfig, AgentType, ChatGPTAgentConfig + + class SpellerAgentConfig(AgentConfig, type="agent_speller"): pass -class SpellerAgent(BaseAgent): - def __init__(self, agent_config: SpellerAgentConfig): - super().__init__(agent_config=agent_config) - +class SpellerAgent(RespondAgent[SpellerAgentConfig]): async def respond( self, - human_input, + human_input: str, conversation_id: str, is_interrupt: bool = False, ) -> Tuple[Optional[str], bool]: return "".join(c + " " for c in human_input), False -class SpellerAgentFactory(AgentFactory): +class SpellerAgentFactory(AbstractAgentFactory): def create_agent(self, agent_config: AgentConfig) -> BaseAgent: - return SpellerAgent(agent_config=agent_config) + # If the agent configuration type is CHAT_GPT, create a ChatGPTAgent. + if isinstance(agent_config, ChatGPTAgentConfig): + return ChatGPTAgent(agent_config=agent_config) + # If the agent configuration type is agent_speller, create a SpellerAgent. + elif isinstance(agent_config, SpellerAgentConfig): + return SpellerAgent(agent_config=agent_config) + # If the agent configuration type is not recognized, raise an exception. + raise Exception("Invalid agent config") ``` An `AgentFactory` instance is passed into the `TelephonyServer` in `telephony_app.py`. @@ -157,7 +168,7 @@ We provide a small set of agents with already created `AgentConfig`s, including, ### Accessing call information in your agent -We store the `to` and `from` numbers in the [`ConfigManager`](https://github.com/vocodedev/vocode-python-sdk/blob/b37bf7a1172a917b641d0e70ba14756415e09b0b/apps/telephony_app/main.py#L20) - so +We store the `to` and `from` numbers in the [`ConfigManager`](https://github.com/vocodedev/vocode-core/blob/53b01dab0b59f71961ee83dbcaf3653a6935c2e3/apps/telephony_app/main.py#L30) - so if you'd like to access them in your agent, you can instantiate the manager to hook into the same Redis instance: ``` @@ -168,7 +179,7 @@ class SpellerAgent(BaseAgent): async def respond( self, - human_input, + human_input: str, conversation_id: str, is_interrupt: bool = False, ) -> Tuple[Optional[str], bool]: diff --git a/docs/open-source/tracing.mdx b/docs/open-source/tracing.mdx deleted file mode 100644 index 537e328857..0000000000 --- a/docs/open-source/tracing.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: "Tracing" -description: "Time components of your Vocode conversations" ---- - -# [Beta] Benchmarking script - -The benchmarking script is located at `playground/streaming/benchmark.py`. You can execute the benchmarking script using the CLI which will enable you to evaluate and compare -transcribers, agents, and synthesizers. You can use it primarily to benchmark latency – but it can also be used to compare the quality of the different providers as well. The -feature is in Beta and will continue to be improved upon – feel free to open an issue with any ideas. - -### Using the CLI - -To access the options of the benchmarking script, run - -```bash -python playground/streaming/benchmark.py --help -``` - -This will display all available options. - -To conduct multiple trials and get averaged results, you can control `num_cycles` - -```bash ---{transcriber,agent,synthesizer}_num_cycles 3 # component specific ---all_num_cycles 3 # all components -``` - -To perform a comprehensive test across all supported transcribers, agents, and synthesizers, use the `--all` command. - -With the CLI, you can get the raw output, write them to a file, and create graphs. -To access your results and visualize them, they will be stored in the `benchmark_results` directory by default. You can also change this location using the `--results_dir` and `--results_file` options. If you want to create visual graphs, add the `--create_graphs` option when running your test. - -#### Example: comparing synthesizers - -To compare different synthesizers, use the `--synthesizers` flag followed by the names of the synthesizers you wish to compare. For instance, - -```bash -python playground/streaming/benchmark.py --synthesizers Google Azure --synthesizer_text "Your text here" -``` - -#### Example: comparing transcribers - -To compare different transcribers, you can use the `--transcribers` flag followed by the names of the transcribers you wish to compare. For example, - -```bash -python playground/streaming/benchmark.py --transcribers deepgram assemblyai --transcriber_audio sample.wav -``` - -You can specify `transcriber_use_mic` instead of `--transcriber_audio` to use your microphone as the audio source. - -#### Example: comparing agents - -To compare different agents, use the `--agents` flag followed by the names of the agents you want to compare. For example, - -```bash -python playground/streaming/benchmark.py --agents openai anthropic -``` - -You can set the prompt preamble with the `--agent_prompt_preamble` argument and the first input with the `--agent_first_input` option. - -# Tracing your application - -At the top of `quickstarts/streaming_conversation.py`, include the following code: - -```python -from opentelemetry import trace -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter -from opentelemetry.sdk.resources import Resource - - -class PrintDurationSpanExporter(SpanExporter): - def __init__(self): - super().__init__() - self.spans = defaultdict(list) - - def export(self, spans): - for span in spans: - duration_ns = span.end_time - span.start_time - duration_s = duration_ns / 1e9 - self.spans[span.name].append(duration_s) - - def shutdown(self): - for name, durations in self.spans.items(): - print(f"{name}: {sum(durations) / len(durations)}") - - -trace.set_tracer_provider(TracerProvider(resource=Resource.create({}))) -trace.get_tracer_provider().add_span_processor( - SimpleSpanProcessor(PrintDurationSpanExporter()) -) -``` - -This will print out stats about the conversation after it ends. diff --git a/docs/open-source/turn-based-conversation.mdx b/docs/open-source/turn-based-conversation.mdx index 18177ba936..d2e6a03e3d 100644 --- a/docs/open-source/turn-based-conversation.mdx +++ b/docs/open-source/turn-based-conversation.mdx @@ -9,55 +9,64 @@ A turn-based conversation is a communication system designed for applications wh This model differs from streaming conversations that try to mimic natural human discourse. Instead, it fits applications triggered by some kind of user input. For example, consider a voice memo application where the user records a message, and the agent generates a complete response. -A turn-based conversation system is perfect for applications that don't require real-time responses or constant back-and-forths. -This design reduces complexity and allows for a more controlled conversation flow. Each user input is treated as a discrete event, +A turn-based conversation system is perfect for applications that don't require interruptions and have a controlled conversation flow. Each user input is treated as a discrete event, giving the system time to generate and deliver a full and meaningful response. ## Turn-based quickstart -The code can be found [here](https://github.com/vocodedev/vocode-python/blob/main/quickstarts/turn_based_conversation.py) +The example below demonstrates a turn-based conversation, using a ChatGPT agent for text generation, WhisperTranscriber for speech-to-text, +and AzureSynthesizer for text-to-speech. User interactions trigger the beginning and end of the recording, signaling the system when to listen and when to respond. You can run it with +``` +make turn_based_conversation +``` -```python -import logging -from dotenv import load_dotenv -from vocode import getenv -from vocode.helpers import create_turn_based_microphone_input_and_speaker_output -from vocode.turn_based.agent.chat_gpt_agent import ChatGPTAgent -from vocode.turn_based.synthesizer.azure_synthesizer import AzureSynthesizer -from vocode.turn_based.synthesizer.eleven_labs_synthesizer import ElevenLabsSynthesizer -from vocode.turn_based.transcriber.whisper_transcriber import WhisperTranscriber -from vocode.turn_based.turn_based_conversation import TurnBasedConversation +*Remember to replace OPENAI_API_KEY and AZURE_SPEECH_KEY with your actual API keys and set the appropriate Azure region. You can also set these variables in a `.env` file and source it in your terminal. +You can also customize the voice, system prompt, and initial message as needed. The code can be found [here](https://github.com/vocodedev/vocode-python/blob/main/quickstarts/turn_based_conversation.py).* -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) +```python +class Settings(BaseSettings): + """ + Settings for the turn-based conversation quickstart. + These parameters can be configured with environment variables. + """ + + openai_api_key: str = "ENTER_YOUR_OPENAI_API_KEY_HERE" + azure_speech_key: str = "ENTER_YOUR_AZURE_KEY_HERE" + + azure_speech_region: str = "eastus" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) -load_dotenv() -# See https://api.elevenlabs.io/v1/voices -ADAM_VOICE_ID = "pNInz6obpgDQGcFmaJgB" +settings = Settings() if __name__ == "__main__": ( microphone_input, speaker_output, - ) = create_turn_based_microphone_input_and_speaker_output(use_default_devices=False) + ) = create_turn_based_microphone_input_and_speaker_output( + use_default_devices=False, + ) conversation = TurnBasedConversation( input_device=microphone_input, output_device=speaker_output, - transcriber=WhisperTranscriber(api_key=getenv("OPENAI_API_KEY")), + transcriber=WhisperTranscriber(api_key=settings.openai_api_key), agent=ChatGPTAgent( system_prompt="The AI is having a pleasant conversation about life", initial_message="Hello!", - api_key=getenv("OPENAI_API_KEY"), + api_key=settings.openai_api_key, ), synthesizer=AzureSynthesizer( - api_key=getenv("AZURE_SPEECH_KEY"), - region=getenv("AZURE_SPEECH_REGION"), + api_key=settings.azure_speech_key, + region=settings.azure_speech_region, voice_name="en-US-SteffanNeural", ), - logger=logger, ) print("Starting conversation. Press Ctrl+C to exit.") while True: @@ -68,16 +77,4 @@ if __name__ == "__main__": conversation.end_speech_and_respond() except KeyboardInterrupt: break -``` - -This example demonstrates a turn-based conversation, using a ChatGPT agent for text generation, WhisperTranscriber for speech-to-text, -and AzureSynthesizer for text-to-speech. User interactions trigger the beginning and end of the recording, signaling the system when to listen and when to respond. - -Remember to replace OPENAI_API_KEY and AZURE_SPEECH_KEY with your actual API keys and set the appropriate Azure region. -You can also customize the voice, system prompt, and initial message as needed. - -## React turn-based quickstart - -🚧 Under construction - -If you want to work on a sample react app for this, reach out to us! +``` \ No newline at end of file diff --git a/docs/open-source/using-synthesizers.mdx b/docs/open-source/using-synthesizers.mdx index 99c51eaee7..013ce23729 100644 --- a/docs/open-source/using-synthesizers.mdx +++ b/docs/open-source/using-synthesizers.mdx @@ -16,10 +16,10 @@ Vocode currently supports the following synthesizers: 3. Eleven Labs 4. Rime 5. Play.ht -6. Coqui TTS -7. GTTS (Google Text-to-Speech) -8. Stream Elements -9. Bark +6. GTTS (Google Text-to-Speech) +7. Stream Elements +8. Bark +9. Amazon Polly These synthesizers are defined using their respective configuration classes, which are subclasses of the `SynthesizerConfig` class. @@ -46,6 +46,43 @@ server = InboundCallServer( In this example, the `ElevenLabsSynthesizerConfig.from_telephone_output_device()` method is used to create a configuration object for the Eleven Labs synthesizer. The method hardcodes some values like the `sampling_rate` and `audio_encoding` for compatibility with telephone output devices. +#### ElevenLabs Input Streaming + +You can try out our experimental implementation of ElevenLabs' [input streaming API](https://elevenlabs.io/docs/api-reference/websockets) by passing in `experimental_websocket=True` into the config and using the `ElevenLabsWSSynthesizer`, like: + +```python +from vocode.streaming.synthesizer.eleven_labs_websocket_synthesizer import ElevenLabsWSSynthesizer +from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig + +... +synthesizer_config=ElevenLabsSynthesizerConfig.from_telephone_output_device( + api_key=os.getenv("ELEVENLABS_API_KEY"), + voice_id=os.getenv("YOUR VOICE ID"), + experimental_websocket=True +) +... +synthesizer=ElevenLabsWSSynthesizer(ElevenLabsSynthesizerConfig.from_output_device( + speaker_output, + api_key=os.getenv("ELEVENLABS_API_KEY"), + voice_id=os.getenv("YOUR VOICE ID"), + experimental_websocket=True +)) +... +``` + +#### Play.ht v2 + +We now support Play.ht's new [gRPC streaming API](https://docs.play.ht/reference/python-sdk-audio-streaming), which runs much faster than their HTTP API and is designed for realtime communication. + +```python +... +synthesizer_config=PlayHtSynthesizerConfig.from_telephone_output_device( + api_key=os.getenv("PLAY_HT_API_KEY"), + user_id=os.getenv("PLAY_HT_USER_ID"), +) +... +``` + ### Example 2: Using Azure in StreamingConversation locally ```python @@ -67,22 +104,3 @@ conversation = StreamingConversation( In this example, the `AzureSynthesizerConfig.from_output_device()` method is used to create a configuration object for the Azure synthesizer. The method takes a `speaker_output` object as an argument, and extracts the `sampling_rate` and `audio_encoding` from the output device. - -## When to Use Configs vs. Synthesizer Objects - -- For everything except `StreamingConversation`, you must use configuration objects. -- For `StreamingConversation`, you can use the actual synthesizer object, but you still need to initialize it with a configuration object. - -## Synthesizer Comparisons - -| Provider | Latency | Voice Cloning | Natural Sounding | Notes | -| ----------------- | ------- | ------------- | ---------------- | ----------- | -| Azure (Microsoft) | Low | No | | | -| Google | Low | No | | | -| Eleven Labs | High | Yes | | | -| Rime | Low | No | | | -| Play.ht | High | Yes | | | -| Coqui TTS | | | | Open source | -| GTTS | | | | | -| Stream Elements | | | | | -| Bark | | | | | diff --git a/docs/open-source/using-transcribers.mdx b/docs/open-source/using-transcribers.mdx index 8fdc71f7b2..f4a2724780 100644 --- a/docs/open-source/using-transcribers.mdx +++ b/docs/open-source/using-transcribers.mdx @@ -33,7 +33,7 @@ from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, Punct server = InboundCallServer( ... transcriber_config=DeepgramTranscriberConfig.from_telephone_input_device( - endpointing_config=PunctuationEndpointingConfig() + endpointing_config=DeepgramEndpointingConfig() ), ... ) @@ -56,7 +56,7 @@ async def main(): output_device=speaker_output, transcriber=DeepgramTranscriber( DeepgramTranscriberConfig.from_input_device( - microphone_input, endpointing_config=PunctuationEndpointingConfig() + microphone_input, endpointing_config=DeepgramEndpointingConfig() ) ), ... @@ -66,11 +66,4 @@ async def main(): In this example, the `DeepgramTranscriberConfig.from_input_device()` method is used to create a configuration object for the Deepgram transcriber for use in a local `StreamingConversation`. The method takes a `microphone_input` object as an argument and extracts the `sampling_rate`, `audio_encoding`, and `chunk_size` from the input device. -## Endpointing - -Endpointing is the process of understanding when someone has finished speaking. The `EndpointingConfig` controls how this is done. There are a couple of different ways to configure endpointing: - -- Time-based endpointing: This method considers the speaker to be finished when there is a certain duration of silence. -- Punctuation-based endpointing: This method considers the speaker to be finished when there is a certain duration of silence after a punctuation mark. - -In the first example, the `PunctuationEndpointingConfig` is used to configure the Deepgram transcriber for punctuation-based endpointing. +See [Conversation Mechanics](/open-source/conversation-mechanics) for more information about endpointing. diff --git a/docs/welcome.mdx b/docs/welcome.mdx index e3e41f0bca..c54cb42809 100644 --- a/docs/welcome.mdx +++ b/docs/welcome.mdx @@ -26,7 +26,7 @@ operations flows. Get started with the [Hosted Service](/hosted-quickstart). ## Open Source Library Most of what we build is open source and free to use! Leverage all of the features mentioned in the introduction by taking a look -at our open source repos. Get started with [Open Source](/open-source-quickstart). +at our open source repos. Get started with [Open Source](/open-source-quickstarts). ## Quickstarts @@ -35,9 +35,9 @@ at our open source repos. Get started with [Open Source](/open-source-quickstart Start using the hosted telephony service.

g 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ⅆLM9N20K> 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

Run Vocode self hosted. diff --git a/playground/streaming/synthesizer/synthesize.py b/playground/streaming/synthesizer/synthesize.py index b27153c4b0..086169772f 100644 --- a/playground/streaming/synthesizer/synthesize.py +++ b/playground/streaming/synthesizer/synthesize.py @@ -3,7 +3,7 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import AzureSynthesizerConfig from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.output_device.speaker_output import SpeakerOutput +from vocode.streaming.output_device.blocking_speaker_output import BlockingSpeakerOutput from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer from vocode.streaming.utils import get_chunk_size_per_second @@ -58,7 +58,8 @@ async def speak( return message_sent, cut_off async def main(): - speaker_output = SpeakerOutput.from_default_device() + speaker_output = BlockingSpeakerOutput.from_default_device() + speaker_output.start() synthesizer = AzureSynthesizer(AzureSynthesizerConfig.from_output_device(speaker_output)) try: while True: diff --git a/quickstarts/streaming_conversation.py b/quickstarts/streaming_conversation.py index 9a482299fc..54d774f665 100644 --- a/quickstarts/streaming_conversation.py +++ b/quickstarts/streaming_conversation.py @@ -49,7 +49,6 @@ async def main(): speaker_output, ) = create_streaming_microphone_input_and_speaker_output( use_default_devices=False, - use_blocking_speaker_output=True, # this moves the playback to a separate thread, set to False to use the main thread ) conversation = StreamingConversation( diff --git a/tests/fakedata/conversation.py b/tests/fakedata/conversation.py index c538b45aef..25344a006b 100644 --- a/tests/fakedata/conversation.py +++ b/tests/fakedata/conversation.py @@ -26,6 +26,7 @@ ) DEFAULT_SYNTHESIZER_CONFIG = PlayHtSynthesizerConfig( + voice_id="test_voice_id", sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=AudioEncoding.MULAW, ) diff --git a/vocode/__init__.py b/vocode/__init__.py index c895c2e458..c0c7c06126 100644 --- a/vocode/__init__.py +++ b/vocode/__init__.py @@ -83,4 +83,5 @@ def getenv(key, default=None): ContextVar("conversation_id", default=None), ) sentry_span_tags: ContextWrapper = ContextWrapper(ContextVar("sentry_span_tags", default=None)) +sentry_transaction = ContextWrapper(ContextVar("sentry_transaction", default=None)) get_serialized_ctx_wrappers = ContextWrapper.serialize_instances diff --git a/vocode/helpers.py b/vocode/helpers.py index c7088f64d4..29727eb927 100644 --- a/vocode/helpers.py +++ b/vocode/helpers.py @@ -10,7 +10,6 @@ from vocode.streaming.output_device.blocking_speaker_output import ( BlockingSpeakerOutput as BlockingStreamingSpeakerOutput, ) -from vocode.streaming.output_device.speaker_output import SpeakerOutput as StreamingSpeakerOutput from vocode.turn_based.input_device.microphone_input import ( MicrophoneInput as TurnBasedMicrophoneInput, ) @@ -31,15 +30,10 @@ def create_streaming_microphone_input_and_speaker_output( output_device_name: Optional[str] = None, mic_sampling_rate=None, speaker_sampling_rate=None, - use_blocking_speaker_output=False, ): return _create_microphone_input_and_speaker_output( microphone_class=StreamingMicrophoneInput, - speaker_class=( - BlockingStreamingSpeakerOutput - if use_blocking_speaker_output - else StreamingSpeakerOutput - ), + speaker_class=(BlockingStreamingSpeakerOutput), use_default_devices=use_default_devices, input_device_name=input_device_name, output_device_name=output_device_name, @@ -70,7 +64,6 @@ def _create_microphone_input_and_speaker_output( microphone_class: typing.Type[Union[StreamingMicrophoneInput, TurnBasedMicrophoneInput]], speaker_class: typing.Type[ Union[ - StreamingSpeakerOutput, BlockingStreamingSpeakerOutput, TurnBasedSpeakerOutput, ] @@ -83,7 +76,7 @@ def _create_microphone_input_and_speaker_output( ) -> Union[ Tuple[ StreamingMicrophoneInput, - Union[StreamingSpeakerOutput, BlockingStreamingSpeakerOutput], + BlockingStreamingSpeakerOutput, ], Tuple[TurnBasedMicrophoneInput, TurnBasedSpeakerOutput], ]: diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index 6820543c2d..f1c8c01cbd 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -170,18 +170,17 @@ def override_voice_id_with_prompt(cls, voice_id, values): return voice_id or COQUI_DEFAULT_SPEAKER_ID -PLAYHT_DEFAULT_VOICE_ID = "larry" PlayHtVoiceVersionType = Literal["1", "2"] class PlayHtSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.PLAY_HT.value): # type: ignore + voice_id: str api_key: Optional[str] = None user_id: Optional[str] = None speed: Optional[float] = None seed: Optional[int] = None temperature: Optional[float] = None quality: Optional[str] = None - voice_id: str = PLAYHT_DEFAULT_VOICE_ID experimental_streaming: bool = False version: Literal[PlayHtVoiceVersionType] = "2" top_p: Optional[float] = None @@ -229,8 +228,8 @@ class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value sampling_rate: int = DEFAULT_POLLY_SAMPLING_RATE -DEFAULT_CARTESIA_MODEL_ID = 'upbeat-moon' -DEFAULT_CARTESIA_VOICE_ID = '5345cf08-6f37-424d-a5d9-8ae1101b9377' +DEFAULT_CARTESIA_MODEL_ID = "upbeat-moon" +DEFAULT_CARTESIA_VOICE_ID = "5345cf08-6f37-424d-a5d9-8ae1101b9377" class CartesiaSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.CARTESIA.value): # type: ignore diff --git a/vocode/streaming/output_device/blocking_speaker_output.py b/vocode/streaming/output_device/blocking_speaker_output.py index ba1515d9c1..99fdcd5593 100644 --- a/vocode/streaming/output_device/blocking_speaker_output.py +++ b/vocode/streaming/output_device/blocking_speaker_output.py @@ -54,3 +54,10 @@ def terminate(self): self._ended = True ThreadAsyncWorker.terminate(self) self.stream.close() + + @classmethod + def from_default_device( + cls, + **kwargs, + ): + return cls(sd.query_devices(kind="output"), **kwargs) diff --git a/vocode/streaming/output_device/speaker_output.py b/vocode/streaming/output_device/speaker_output.py index 543dbbfb0c..34d8be0092 100644 --- a/vocode/streaming/output_device/speaker_output.py +++ b/vocode/streaming/output_device/speaker_output.py @@ -7,6 +7,8 @@ from .base_output_device import BaseOutputDevice from vocode.streaming.models.audio import AudioEncoding +raise DeprecationWarning("Use BlockingSpeakerOutput instead") + class SpeakerOutput(BaseOutputDevice): DEFAULT_SAMPLING_RATE = 44100 diff --git a/vocode/streaming/output_device/vonage_output_device.py b/vocode/streaming/output_device/vonage_output_device.py index 6466303226..34a03c747e 100644 --- a/vocode/streaming/output_device/vonage_output_device.py +++ b/vocode/streaming/output_device/vonage_output_device.py @@ -4,7 +4,7 @@ from fastapi import WebSocket from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.output_device.speaker_output import SpeakerOutput +from vocode.streaming.output_device.blocking_speaker_output import BlockingSpeakerOutput from vocode.streaming.telephony.constants import ( PCM_SILENCE_BYTE, VONAGE_AUDIO_ENCODING, @@ -27,7 +27,7 @@ def __init__( self.process_task = asyncio_create_task_with_done_error_log(self.process()) self.output_to_speaker = output_to_speaker if output_to_speaker: - self.output_speaker = SpeakerOutput.from_default_device( + self.output_speaker = BlockingSpeakerOutput.from_default_device( sampling_rate=VONAGE_SAMPLING_RATE, blocksize=VONAGE_CHUNK_SIZE // 2 ) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index 8e47980166..aadf6bfa6c 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -421,7 +421,7 @@ async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): if self.last_agent_response_tracker is not None: await self.last_agent_response_tracker.wait() item.agent_response_tracker.set() - await self.conversation.mark_terminated(bot_disconnect=True) + self.conversation.mark_terminated(bot_disconnect=True) return agent_response_message = typing.cast(AgentResponseMessage, agent_response) @@ -747,7 +747,7 @@ async def send_initial_message( async def action_on_idle(self): logger.debug("Conversation idle for too long, terminating") - await self.mark_terminated(bot_disconnect=True) + self.mark_terminated(bot_disconnect=True) return async def check_for_idle(self): @@ -961,11 +961,11 @@ async def get_chunks( synthesis_result.synthesis_total_span.finish() return message_sent, cut_off - async def mark_terminated(self, bot_disconnect: bool = False): + def mark_terminated(self, bot_disconnect: bool = False): self.active = False async def terminate(self): - await self.mark_terminated() + self.mark_terminated() self.broadcast_interrupt() self.events_manager.publish_event( TranscriptCompleteEvent( diff --git a/vocode/streaming/telephony/server/router/calls.py b/vocode/streaming/telephony/server/router/calls.py index 486b697a3b..525096945e 100644 --- a/vocode/streaming/telephony/server/router/calls.py +++ b/vocode/streaming/telephony/server/router/calls.py @@ -2,6 +2,7 @@ from fastapi import APIRouter, HTTPException, WebSocket from loguru import logger +import sentry_sdk from vocode.streaming.agent.abstract_factory import AbstractAgentFactory from vocode.streaming.agent.default_factory import DefaultAgentFactory @@ -22,6 +23,7 @@ from vocode.streaming.transcriber.default_factory import DefaultTranscriberFactory from vocode.streaming.utils.base_router import BaseRouter from vocode.streaming.utils.events_manager import EventsManager +from vocode import sentry_transaction class CallsRouter(BaseRouter): @@ -96,25 +98,27 @@ def _from_call_config( raise ValueError(f"Unknown call config type {call_config.type}") async def connect_call(self, websocket: WebSocket, id: str): - await websocket.accept() - logger.debug("Phone WS connection opened for chat {}".format(id)) - call_config = await self.config_manager.get_config(id) - if not call_config: - raise HTTPException(status_code=400, detail="No active phone call") + with sentry_sdk.start_transaction(op="connect_call") as sentry_txn: + sentry_transaction.set(sentry_txn) + await websocket.accept() + logger.debug("Phone WS connection opened for chat {}".format(id)) + call_config = await self.config_manager.get_config(id) + if not call_config: + raise HTTPException(status_code=400, detail="No active phone call") - phone_conversation = self._from_call_config( - base_url=self.base_url, - call_config=call_config, - config_manager=self.config_manager, - conversation_id=id, - transcriber_factory=self.transcriber_factory, - agent_factory=self.agent_factory, - synthesizer_factory=self.synthesizer_factory, - events_manager=self.events_manager, - ) + phone_conversation = self._from_call_config( + base_url=self.base_url, + call_config=call_config, + config_manager=self.config_manager, + conversation_id=id, + transcriber_factory=self.transcriber_factory, + agent_factory=self.agent_factory, + synthesizer_factory=self.synthesizer_factory, + events_manager=self.events_manager, + ) - await phone_conversation.attach_ws_and_start(websocket) - logger.debug("Phone WS connection closed for chat {}".format(id)) + await phone_conversation.attach_ws_and_start(websocket) + logger.debug("Phone WS connection closed for chat {}".format(id)) def get_router(self) -> APIRouter: return self.router diff --git a/vocode/utils/sentry_utils.py b/vocode/utils/sentry_utils.py index 74da6a1f5a..5514a2c0d3 100644 --- a/vocode/utils/sentry_utils.py +++ b/vocode/utils/sentry_utils.py @@ -5,7 +5,7 @@ from loguru import logger from sentry_sdk.tracing import Span, Transaction, _SpanRecorder -from vocode import get_serialized_ctx_wrappers +from vocode import get_serialized_ctx_wrappers, sentry_transaction if TYPE_CHECKING: from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer @@ -163,8 +163,8 @@ def set_tags(span: Span) -> Span: @sentry_configured def get_span_by_op(op_value): - transaction: Transaction = sentry_sdk.Hub.current.scope.transaction - if transaction is not None: + transaction: Transaction = sentry_sdk.Hub.current.scope.transaction or sentry_transaction.value + if transaction is not None and transaction._span_recorder is not None: # Probably not great accessing an internal variable but transaction spans aren't # exposed publicly so it is what it is. span_matches = [ @@ -180,18 +180,25 @@ def get_span_by_op(op_value): return set_tags(most_recent_span) else: # If no span with the matching op was found - logger.error(f"No span found with op '{op_value}'.") + logger.warning(f"No span found with op '{op_value}'.") return None else: - logger.debug("No active transaction found.") + if transaction and transaction._span_recorder is None: + logger.warning(f"Transaction Span Recorder Missing -- {transaction}") + else: + logger.warning("No active transaction found.") return None @sentry_configured def complete_span_by_op(op_value): - span = get_span_by_op(op_value) + try: + span = get_span_by_op(op_value) + except Exception as e: + logger.error(f"Error getting span by op '{op_value}': {e}") + return None if span is None: - logger.error(f"No span found with op '{op_value}'.") + logger.warning(f"No span found with op '{op_value}'.") return None span.finish() From c4a47dce804d05a4300b16b19e5a47b34a7efd6d Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 14 Jun 2024 16:25:16 -0700 Subject: [PATCH 076/148] 0.1.112 prerelease (#557) * bump for prerelease * bumps to 0.1.112 --- apps/client_backend/Dockerfile | 2 +- apps/client_backend/README.md | 29 +- apps/client_backend/poetry.lock | 1245 +++++++++++------------- apps/client_backend/pyproject.toml | 6 +- apps/telephony_app/Dockerfile | 2 +- apps/telephony_app/poetry.lock | 1259 +++++++++++-------------- apps/telephony_app/pyproject.toml | 7 +- docs/open-source/react-quickstart.mdx | 16 +- docs/open-source/telephony.mdx | 2 + poetry.lock | 147 +-- pyproject.toml | 2 +- 11 files changed, 1219 insertions(+), 1498 deletions(-) diff --git a/apps/client_backend/Dockerfile b/apps/client_backend/Dockerfile index 87c26c8abe..523412a594 100644 --- a/apps/client_backend/Dockerfile +++ b/apps/client_backend/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-bullseye +FROM python:3.11-bullseye # get portaudio and ffmpeg RUN apt-get update \ diff --git a/apps/client_backend/README.md b/apps/client_backend/README.md index caefd280d1..29324ea4f9 100644 --- a/apps/client_backend/README.md +++ b/apps/client_backend/README.md @@ -1,34 +1,9 @@ # client_backend -## Docker - -1. Set up the configuration for your agent in `main.py`. -2. Set up an .env file using the template - -``` -cp .env.template .env -``` - -Fill in your API keys into .env - -3. Build the Docker image - -```bash -docker build -t vocode-client-backend . -``` - -4. Run the image and forward the port. - -```bash -docker run --env-file=.env -p 3000:3000 -t vocode-client-backend -``` - -Now you have a client backend hosted at localhost:3000 to pass into the Vocode React SDK. You'll likely need to tunnel port 3000 to ngrok / host your server in order to use it in the React SDK. - -## Non-docker setup - `main.py` just sets up a FastAPI server, so you can just run it with uvicorn: ``` uvicorn main:app ``` + +Note: building this with Docker is currently broken in 0.1.112 - we're planning an overhaul here, stay tuned! diff --git a/apps/client_backend/poetry.lock b/apps/client_backend/poetry.lock index 914efb029a..924292092a 100644 --- a/apps/client_backend/poetry.lock +++ b/apps/client_backend/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -136,12 +136,13 @@ files = [ [[package]] name = "anthropic" -version = "0.28.0" +version = "0.28.1" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, + {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, + {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, ] [package.dependencies] @@ -178,24 +179,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 = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - [[package]] name = "async-timeout" version = "4.0.3" @@ -228,17 +211,17 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "azure-cognitiveservices-speech" -version = "1.37.0" +version = "1.38.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:906d6bf65176e93464e2d763dd074ca00c48cfe1a896371fcdcb155a500910f7"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54ec8dd55d4dbd9058c61909e08485d3761d6d30954da189e1b17d84daf5e2e0"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:685424689725d2d4115485998c0888c8b5b502259037ff533e5a834575f80b66"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:384f66786c2335165035270897b34d0b91736a1fdf38f7696e9a227075cb2489"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win32.whl", hash = "sha256:343d5f449ccd6c9b53cd37dd46a70ece0905243517df7a0c047779e55072254c"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win_amd64.whl", hash = "sha256:a18fb45490cdcd681407ccaad9560fb14dda1c8276de297e219ea1a880467e28"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:18dce915ab032711f687abb3297dd19176b9cbea562b322ee6fa7365ef4a5091"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9dd0800fbc4a8438c6dfd5747a658251914fe2d205a29e9b46158cadac6ab381"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:1c344e8a6faadb063cea451f0301e13b44d9724e1242337039bff601e81e6f86"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e002595a749471efeac3a54c80097946570b76c13049760b97a4b881d9d24af"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win32.whl", hash = "sha256:16a530e6c646eb49ea0bc05cb45a9d28b99e4b67613f6c3a6c54e26e6bf65241"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, ] [[package]] @@ -252,15 +235,37 @@ files = [ {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] +[[package]] +name = "cartesia" +version = "0.1.1" +description = "The official Python library for the Cartesia API." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, + {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, +] + +[package.dependencies] +aiohttp = "*" +httpx = "*" +pytest-asyncio = "*" +requests = "*" +websockets = "*" + +[package.extras] +all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] +dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] + [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -453,43 +458,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -507,30 +512,19 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.6.6" +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.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, - {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, + {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 = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "deprecated" version = "1.2.14" @@ -581,18 +575,17 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "elevenlabs" -version = "1.2.2" +version = "1.3.0" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.2.2-py3-none-any.whl", hash = "sha256:60b92b0e2aabdfba93a43569f207f8a2ad397492519b8e11a2eebb32807ddefa"}, - {file = "elevenlabs-1.2.2.tar.gz", hash = "sha256:ebd02869b95602b8956874dd727981bb49ad16b9a3c2f5901193d838213694aa"}, + {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, + {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, ] [package.dependencies] httpx = ">=0.21.2" -ipython = ">=7.0" pydantic = ">=1.9.2" requests = ">=2.20" typing_extensions = ">=4.0.0" @@ -613,34 +606,6 @@ files = [ dnspython = ">=2.0.0" idna = ">=2.0.0" -[[package]] -name = "exceptiongroup" -version = "1.2.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = ">=3.5" -files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] - [[package]] name = "fastapi" version = "0.111.0" @@ -687,18 +652,18 @@ standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [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-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.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)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -789,13 +754,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.5.0" +version = "2024.6.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"}, + {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, + {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, ] [package.extras] @@ -804,6 +769,7 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] 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"] @@ -852,13 +818,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.29.0" +version = "2.30.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -909,17 +875,17 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "googleapis-common-protos" -version = "1.63.0" +version = "1.63.1" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, - {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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)"] @@ -997,61 +963,61 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.64.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, - {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, - {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, - {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, - {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, - {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, - {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, - {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, - {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, - {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, - {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, - {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, - {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, - {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, - {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, - {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, - {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, - {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, - {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, - {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, - {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.64.0)"] + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpcio-status" @@ -1175,13 +1141,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.2" +version = "0.23.4" 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.23.2-py3-none-any.whl", hash = "sha256:48727a16e704d409c4bb5913613308499664f22a99743435dc3a13b23c485827"}, - {file = "huggingface_hub-0.23.2.tar.gz", hash = "sha256:f6829b62d5fdecb452a76fdbec620cba4c1573655a8d710c1df71735fd9edbd2"}, + {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, ] [package.dependencies] @@ -1220,60 +1186,34 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "7.1.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-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [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"] +docs = ["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"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] -name = "ipython" -version = "8.18.1" -description = "IPython: Productive Interactive Computing" +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" files = [ - {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, - {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5" -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} - -[package.extras] -all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] - [[package]] name = "janus" version = "1.0.0" @@ -1288,25 +1228,6 @@ files = [ [package.dependencies] typing-extensions = ">=3.7.4.3" -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - [[package]] name = "jinja2" version = "3.1.4" @@ -1326,72 +1247,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.0" +version = "0.4.2" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, - {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, - {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, - {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, - {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, - {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, - {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, - {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, - {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, - {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, - {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, - {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, - {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, + {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, + {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, + {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, + {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, + {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, + {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, + {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, + {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, + {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, + {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, + {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, ] [[package]] @@ -1421,13 +1342,13 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] @@ -1467,99 +1388,78 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.1" +version = "0.2.5" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.1-py3-none-any.whl", hash = "sha256:3e13bf97c5717bce2c281f5117e8778823e8ccf62d949e73d3869448962b1c97"}, - {file = "langchain-0.2.1.tar.gz", hash = "sha256:5758a315e1ac92eb26dafec5ad0fafa03cafa686aba197d5bb0b1dd28cc03ebe"}, + {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, + {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -langchain-core = ">=0.2.0,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" -numpy = ">=1,<2" +numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] -clarifai = ["clarifai (>=9.1.0)"] -cli = ["typer (>=0.9.0,<0.10.0)"] -cohere = ["cohere (>=4,<6)"] -docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] -embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.1,<0.2)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] -javascript = ["esprima (>=4.0.1,<5.0.0)"] -llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (<2)", "tiktoken (>=0.7,<1.0)"] -qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] -text-helpers = ["chardet (>=5.1.0,<6.0.0)"] - [[package]] name = "langchain-community" -version = "0.2.1" +version = "0.2.5" description = "Community contributed LangChain integrations." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.1-py3-none-any.whl", hash = "sha256:b834e2c5ded6903b839fcaf566eee90a0ffae53405a0f7748202725e701d39cd"}, - {file = "langchain_community-0.2.1.tar.gz", hash = "sha256:079942e8f15da975769ccaae19042b7bba5481c42020bbbd7d8cad73a9393261"}, + {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, + {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.0,<0.3.0" -langchain-core = ">=0.2.0,<0.3.0" +langchain = ">=0.2.5,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" langsmith = ">=0.1.0,<0.2.0" -numpy = ">=1,<2" +numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpathlib (>=0.18,<0.19)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] - [[package]] name = "langchain-core" -version = "0.2.3" +version = "0.2.7" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.3-py3-none-any.whl", hash = "sha256:22189b5a3a30bfd65eb995f95e627f7c2c3acb322feb89f5f5f2fb7df21833a7"}, - {file = "langchain_core-0.2.3.tar.gz", hash = "sha256:fbc75a64b9c0b7655d96ca57a707df1e6c09efc1539c36adbd73260612549810"}, + {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, + {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.65,<0.2.0" -packaging = ">=23.2,<24.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" pydantic = ">=1,<3" PyYAML = ">=5.3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] - [[package]] name = "langchain-text-splitters" -version = "0.2.0" +version = "0.2.1" description = "LangChain text splitting utilities" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_text_splitters-0.2.0-py3-none-any.whl", hash = "sha256:7b4c6a45f8471630a882b321e138329b6897102a5bc62f4c12be1c0b05bb9199"}, - {file = "langchain_text_splitters-0.2.0.tar.gz", hash = "sha256:b32ab4f7397f7d42c1fa3283fefc2547ba356bd63a68ee9092865e5ad83c82f9"}, + {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, + {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, ] [package.dependencies] @@ -1570,13 +1470,13 @@ extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] name = "langsmith" -version = "0.1.65" +version = "0.1.77" 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.65-py3-none-any.whl", hash = "sha256:ab4487029240e69cca30da1065f1e9138e5a7ca2bbe8c697f0bd7d5839f71cf7"}, - {file = "langsmith-0.1.65.tar.gz", hash = "sha256:d3c2eb2391478bd79989f02652cf66e29a7959d677614b6993a47cef43f7f43b"}, + {file = "langsmith-0.1.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, + {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, ] [package.dependencies] @@ -1697,13 +1597,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.21.2" +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.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, - {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, ] [package.dependencies] @@ -1714,20 +1614,6 @@ 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 = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - [[package]] name = "mdurl" version = "0.1.2" @@ -1985,13 +1871,13 @@ files = [ [[package]] name = "openai" -version = "1.30.5" +version = "1.34.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.30.5-py3-none-any.whl", hash = "sha256:2ad95e926de0d2e09cde632a9204b0a6dca4a03c2cdcc84329b01f355784355a"}, - {file = "openai-1.30.5.tar.gz", hash = "sha256:5366562eb2c5917e6116ae0391b7ae6e3acd62b0ae3f565ada32b35d8fcfa106"}, + {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, + {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, ] [package.dependencies] @@ -2008,165 +1894,140 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.24.0" +version = "1.25.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"}, + {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, + {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.0" +importlib-metadata = ">=6.0,<=7.1" [[package]] name = "opentelemetry-sdk" -version = "1.24.0" +version = "1.25.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"}, + {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, + {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, ] [package.dependencies] -opentelemetry-api = "1.24.0" -opentelemetry-semantic-conventions = "0.45b0" +opentelemetry-api = "1.25.0" +opentelemetry-semantic-conventions = "0.46b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.45b0" +version = "0.46b0" 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"}, + {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, + {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, ] +[package.dependencies] +opentelemetry-api = "1.25.0" + [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] name = "phonenumbers" -version = "8.13.37" +version = "8.13.38" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.37-py2.py3-none-any.whl", hash = "sha256:4ea00ef5012422c08c7955c21131e7ae5baa9a3ef52cf2d561e963f023006b80"}, - {file = "phonenumbers-8.13.37.tar.gz", hash = "sha256:bd315fed159aea0516f7c367231810fe8344d5bec26156b88fa18374c11d1cf2"}, + {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, + {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, ] [[package]] -name = "prompt-toolkit" -version = "3.0.45" -description = "Library for building powerful interactive command lines in Python" +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8" files = [ - {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, - {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] -[package.dependencies] -wcwidth = "*" +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "proto-plus" @@ -2205,31 +2066,6 @@ files = [ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - [[package]] name = "pvkoala" version = "2.0.1" @@ -2279,18 +2115,18 @@ files = [ [[package]] name = "pydantic" -version = "2.7.2" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.2-py3-none-any.whl", hash = "sha256:834ab954175f94e6e68258537dc49402c4a5e9d0409b9f1b86b7e934a8372de7"}, - {file = "pydantic-2.7.2.tar.gz", hash = "sha256:71b2945998f9c9b7919a45bde9a50397b289937d215ae141c1d0903ba7149fd7"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.3" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -2298,95 +2134,114 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.3" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:744697428fcdec6be5670460b578161d1ffe34743a5c15656be7ea82b008197c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b40c05ced1ba4218b14986fe6f283d22e1ae2ff4c8e28881a70fb81fbfcda7"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a9a75622357076efb6b311983ff190fbfb3c12fc3a853122b34d3d358126c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2e253af04ceaebde8eb201eb3f3e3e7e390f2d275a88300d6a1959d710539e2"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:855ec66589c68aa367d989da5c4755bb74ee92ccad4fdb6af942c3612c067e34"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3e42bb54e7e9d72c13ce112e02eb1b3b55681ee948d748842171201a03a98a"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6ac9ffccc9d2e69d9fba841441d4259cb668ac180e51b30d3632cd7abca2b9b"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c56eca1686539fa0c9bda992e7bd6a37583f20083c37590413381acfc5f192d6"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17954d784bf8abfc0ec2a633108207ebc4fa2df1a0e4c0c3ccbaa9bb01d2c426"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:98ed737567d8f2ecd54f7c8d4f8572ca7c7921ede93a2e52939416170d357812"}, - {file = "pydantic_core-2.18.3-cp310-none-win32.whl", hash = "sha256:9f9e04afebd3ed8c15d67a564ed0a34b54e52136c6d40d14c5547b238390e779"}, - {file = "pydantic_core-2.18.3-cp310-none-win_amd64.whl", hash = "sha256:45e4ffbae34f7ae30d0047697e724e534a7ec0a82ef9994b7913a412c21462a0"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b9ebe8231726c49518b16b237b9fe0d7d361dd221302af511a83d4ada01183ab"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8e20e15d18bf7dbb453be78a2d858f946f5cdf06c5072453dace00ab652e2b2"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d9ff283cd3459fa0bf9b0256a2b6f01ac1ff9ffb034e24457b9035f75587cb"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f7ef5f0ebb77ba24c9970da18b771711edc5feaf00c10b18461e0f5f5949231"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73038d66614d2e5cde30435b5afdced2b473b4c77d4ca3a8624dd3e41a9c19be"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6afd5c867a74c4d314c557b5ea9520183fadfbd1df4c2d6e09fd0d990ce412cd"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd7df92f28d351bb9f12470f4c533cf03d1b52ec5a6e5c58c65b183055a60106"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80aea0ffeb1049336043d07799eace1c9602519fb3192916ff525b0287b2b1e4"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaee40f25bba38132e655ffa3d1998a6d576ba7cf81deff8bfa189fb43fd2bbe"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9128089da8f4fe73f7a91973895ebf2502539d627891a14034e45fb9e707e26d"}, - {file = "pydantic_core-2.18.3-cp311-none-win32.whl", hash = "sha256:fec02527e1e03257aa25b1a4dcbe697b40a22f1229f5d026503e8b7ff6d2eda7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_amd64.whl", hash = "sha256:58ff8631dbab6c7c982e6425da8347108449321f61fe427c52ddfadd66642af7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_arm64.whl", hash = "sha256:3fc1c7f67f34c6c2ef9c213e0f2a351797cda98249d9ca56a70ce4ebcaba45f4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0928cde2ae416a2d1ebe6dee324709c6f73e93494d8c7aea92df99aab1fc40f"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bee9bb305a562f8b9271855afb6ce00223f545de3d68560b3c1649c7c5295e9"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e862823be114387257dacbfa7d78547165a85d7add33b446ca4f4fae92c7ff5c"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a36f78674cbddc165abab0df961b5f96b14461d05feec5e1f78da58808b97e7"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba905d184f62e7ddbb7a5a751d8a5c805463511c7b08d1aca4a3e8c11f2e5048"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fdd362f6a586e681ff86550b2379e532fee63c52def1c666887956748eaa326"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b214b7ee3bd3b865e963dbed0f8bc5375f49449d70e8d407b567af3222aae4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691018785779766127f531674fa82bb368df5b36b461622b12e176c18e119022"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:60e4c625e6f7155d7d0dcac151edf5858102bc61bf959d04469ca6ee4e8381bd"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4e651e47d981c1b701dcc74ab8fec5a60a5b004650416b4abbef13db23bc7be"}, - {file = "pydantic_core-2.18.3-cp312-none-win32.whl", hash = "sha256:ffecbb5edb7f5ffae13599aec33b735e9e4c7676ca1633c60f2c606beb17efc5"}, - {file = "pydantic_core-2.18.3-cp312-none-win_amd64.whl", hash = "sha256:2c8333f6e934733483c7eddffdb094c143b9463d2af7e6bd85ebcb2d4a1b82c6"}, - {file = "pydantic_core-2.18.3-cp312-none-win_arm64.whl", hash = "sha256:7a20dded653e516a4655f4c98e97ccafb13753987434fe7cf044aa25f5b7d417"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:eecf63195be644b0396f972c82598cd15693550f0ff236dcf7ab92e2eb6d3522"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c44efdd3b6125419c28821590d7ec891c9cb0dff33a7a78d9d5c8b6f66b9702"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e59fca51ffbdd1638b3856779342ed69bcecb8484c1d4b8bdb237d0eb5a45e2"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70cf099197d6b98953468461d753563b28e73cf1eade2ffe069675d2657ed1d5"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63081a49dddc6124754b32a3774331467bfc3d2bd5ff8f10df36a95602560361"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:370059b7883485c9edb9655355ff46d912f4b03b009d929220d9294c7fd9fd60"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64faeedfd8254f05f5cf6fc755023a7e1606af3959cfc1a9285744cc711044"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d2e725de0f90d8671f89e420d36c3dd97639b98145e42fcc0e1f6d492a46dc"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:67bc078025d70ec5aefe6200ef094576c9d86bd36982df1301c758a9fff7d7f4"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf952c3f4100e203cbaf8e0c907c835d3e28f9041474e52b651761dc248a3c0"}, - {file = "pydantic_core-2.18.3-cp38-none-win32.whl", hash = "sha256:9a46795b1f3beb167eaee91736d5d17ac3a994bf2215a996aed825a45f897558"}, - {file = "pydantic_core-2.18.3-cp38-none-win_amd64.whl", hash = "sha256:200ad4e3133cb99ed82342a101a5abf3d924722e71cd581cc113fe828f727fbc"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:304378b7bf92206036c8ddd83a2ba7b7d1a5b425acafff637172a3aa72ad7083"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c826870b277143e701c9ccf34ebc33ddb4d072612683a044e7cce2d52f6c3fef"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e201935d282707394f3668380e41ccf25b5794d1b131cdd96b07f615a33ca4b1"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5560dda746c44b48bf82b3d191d74fe8efc5686a9ef18e69bdabccbbb9ad9442"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b32c2a1f8032570842257e4c19288eba9a2bba4712af542327de9a1204faff8"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:929c24e9dea3990bc8bcd27c5f2d3916c0c86f5511d2caa69e0d5290115344a9"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a8376fef60790152564b0eab376b3e23dd6e54f29d84aad46f7b264ecca943"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dccf3ef1400390ddd1fb55bf0632209d39140552d068ee5ac45553b556780e06"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41dbdcb0c7252b58fa931fec47937edb422c9cb22528f41cb8963665c372caf6"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:666e45cf071669fde468886654742fa10b0e74cd0fa0430a46ba6056b24fb0af"}, - {file = "pydantic_core-2.18.3-cp39-none-win32.whl", hash = "sha256:f9c08cabff68704a1b4667d33f534d544b8a07b8e5d039c37067fceb18789e78"}, - {file = "pydantic_core-2.18.3-cp39-none-win_amd64.whl", hash = "sha256:4afa5f5973e8572b5c0dcb4e2d4fda7890e7cd63329bd5cc3263a25c92ef0026"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:77319771a026f7c7d29c6ebc623de889e9563b7087911b46fd06c044a12aa5e9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:df11fa992e9f576473038510d66dd305bcd51d7dd508c163a8c8fe148454e059"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d531076bdfb65af593326ffd567e6ab3da145020dafb9187a1d131064a55f97c"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33ce258e4e6e6038f2b9e8b8a631d17d017567db43483314993b3ca345dcbbb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f9cd7f5635b719939019be9bda47ecb56e165e51dd26c9a217a433e3d0d59a9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cd4a032bb65cc132cae1fe3e52877daecc2097965cd3914e44fbd12b00dae7c5"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f2718430098bcdf60402136c845e4126a189959d103900ebabb6774a5d9fdb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0037a92cf0c580ed14e10953cdd26528e8796307bb8bb312dc65f71547df04d"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b95a0972fac2b1ff3c94629fc9081b16371dad870959f1408cc33b2f78ad347a"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a62e437d687cc148381bdd5f51e3e81f5b20a735c55f690c5be94e05da2b0d5c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b367a73a414bbb08507da102dc2cde0fa7afe57d09b3240ce82a16d608a7679c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ecce4b2360aa3f008da3327d652e74a0e743908eac306198b47e1c58b03dd2b"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4435b8d83f0c9561a2a9585b1de78f1abb17cb0cef5f39bf6a4b47d19bafe3"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:616221a6d473c5b9aa83fa8982745441f6a4a62a66436be9445c65f241b86c94"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7e6382ce89a92bc1d0c0c5edd51e931432202b9080dc921d8d003e616402efd1"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff58f379345603d940e461eae474b6bbb6dab66ed9a851ecd3cb3709bf4dcf6a"}, - {file = "pydantic_core-2.18.3.tar.gz", hash = "sha256:432e999088d85c8f36b9a3f769a8e2b57aabd817bbb729a90d1fe7f18f6f1f39"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.3.3" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.3-py3-none-any.whl", hash = "sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de"}, + {file = "pydantic_settings-2.3.3.tar.gz", hash = "sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pydub" version = "0.25.1" @@ -2449,6 +2304,44 @@ dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pyte docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] +[[package]] +name = "pytest" +version = "8.2.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" + +[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.7" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, +] + +[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 = "python-dotenv" version = "1.0.1" @@ -2550,13 +2443,13 @@ files = [ [[package]] name = "redis" -version = "5.0.4" +version = "5.0.6" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, ] [package.dependencies] @@ -2832,13 +2725,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.3.1" +version = "2.5.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.3.1-py2.py3-none-any.whl", hash = "sha256:c5aeb095ba226391d337dd42a6f9470d86c9fc236ecc71cfc7cd1942b45010c6"}, - {file = "sentry_sdk-2.3.1.tar.gz", hash = "sha256:139a71a19f5e9eb5d3623942491ce03cf8ebc14ea2e39ba3e6fe79560d8a5b1f"}, + {file = "sentry_sdk-2.5.1-py2.py3-none-any.whl", hash = "sha256:1f87acdce4a43a523ae5aa21a3fc37522d73ebd9ec04b1dbf01aa3d173852def"}, + {file = "sentry_sdk-2.5.1.tar.gz", hash = "sha256:fbc40a78a8a9c6675133031116144f0d0940376fa6e4e1acd5624c90b0aaf58b"}, ] [package.dependencies] @@ -2892,17 +2785,6 @@ files = [ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - [[package]] name = "sniffio" version = "1.3.1" @@ -3021,25 +2903,6 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - [[package]] name = "starlette" version = "0.37.2" @@ -3261,30 +3124,15 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - [[package]] name = "twilio" -version = "9.1.0" +version = "9.1.1" description = "Twilio API client and TwiML generator" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-9.1.0-py2.py3-none-any.whl", hash = "sha256:eb4687a9f81dc3118e8981c5a46d9f8184baee135c79afed47c714c759c31bbc"}, - {file = "twilio-9.1.0.tar.gz", hash = "sha256:ab2eb19c779855bf02cdca8a7e02ebaa64feee47da7b591ac9088ec07a6962e2"}, + {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, + {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, ] [package.dependencies] @@ -3312,13 +3160,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -3442,13 +3290,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.30.0" +version = "0.30.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, - {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, ] [package.dependencies] @@ -3511,67 +3359,67 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "vocode" -version = "0.1.111" +version = "0.1.112" description = "The all-in-one voice SDK" optional = false -python-versions = ">=3.9,<3.12" -files = [] -develop = true - -[package.dependencies] -aiohttp = "^3.9.5" -anthropic = {version = "^0.28.0", optional = true} -azure-cognitiveservices-speech = {version = "^1.37.0", optional = true} -elevenlabs = {version = "^1.2.2", optional = true} -fastapi = "^0.111.0" -google-cloud-speech = {version = "^2.26.0", optional = true} -google-cloud-texttospeech = {version = "^2.16.3", optional = true} -janus = "^1.0.0" -jinja2 = "^3.1.4" -jsonschema = "^4.22.0" -langchain = {version = "^0.2.1", optional = true} -langchain-community = {version = "^0.2.1", optional = true} -loguru = "^0.7.2" -miniaudio = {version = "^1.59", optional = true} -nltk = {version = "^3.8.1", optional = true} -openai = {version = "^1.30.5", optional = true} -opentelemetry-sdk = "^1.24.0" -phonenumbers = "^8.13.37" -pvkoala = {version = "^2.0.1", optional = true} -pydantic = "^2.7.2" -pydub = {version = "^0.25.1", optional = true} -pyht = {version = "^0.0.28", optional = true} -redis = {version = "^5.0.4", optional = true} -requests = "^2.32.3" -sentry-sdk = {version = "^2.3.1", extras = ["fastapi"], optional = true} -sounddevice = "^0.4.7" -tiktoken = {version = "0.7.0", optional = true} -twilio = {version = "^9.1.0", optional = true} -uvicorn = "^0.30.0" -vonage = {version = "^3.14.0", optional = true} -websockets = "^12.0" - -[package.extras] -agents = ["anthropic (>=0.28.0,<0.29.0)", "openai (>=1.30.5,<2.0.0)", "tiktoken (==0.7.0)"] -all = ["anthropic (>=0.28.0,<0.29.0)", "azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=1.30.5,<2.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)", "redis (>=5.0.4,<6.0.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)", "tiktoken (==0.7.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] -misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)"] -synthesizers = ["azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)"] -telephony = ["redis (>=5.0.4,<6.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +python-versions = "<4.0,>=3.10" +files = [ + {file = "vocode-0.1.112-py3-none-any.whl", hash = "sha256:6efcd1dd2676e1d2f049544e2c6e389f34c59dd2ec05ab2c588d0ea1624b193f"}, + {file = "vocode-0.1.112.tar.gz", hash = "sha256:e5a64d27089d6d7288a082751550f2465b2f1cd5d564f1e271c676c91dcf5b1d"}, +] + +[package.dependencies] +aiohttp = ">=3.9.5,<4.0.0" +anthropic = ">=0.28.0,<0.29.0" +azure-cognitiveservices-speech = ">=1.37.0,<2.0.0" +cartesia = {version = ">=0.1.1,<0.2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +elevenlabs = ">=1.2.2,<2.0.0" +fastapi = ">=0.111.0,<0.112.0" +google-cloud-speech = {version = ">=2.26.0,<3.0.0", optional = true, markers = "extra == \"transcribers\" or extra == \"all\""} +google-cloud-texttospeech = {version = ">=2.16.3,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +janus = ">=1.0.0,<2.0.0" +jinja2 = ">=3.1.4,<4.0.0" +jsonschema = ">=4.22.0,<5.0.0" +langchain = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} +langchain-community = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} +loguru = ">=0.7.2,<0.8.0" +miniaudio = {version = ">=1.59,<2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +nltk = {version = ">=3.8.1,<4.0.0", optional = true, markers = "extra == \"all\""} +numpy = ">=1.26.4,<2.0.0" +openai = ">=1.30.5,<2.0.0" +opentelemetry-sdk = ">=1.24.0,<2.0.0" +phonenumbers = ">=8.13.37,<9.0.0" +pvkoala = {version = ">=2.0.1,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pydantic = ">=2.7.2,<3.0.0" +pydantic-settings = ">=2.3.0,<3.0.0" +pydub = {version = ">=0.25.1,<0.26.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pyht = ">=0.0.28,<0.0.29" +redis = ">=5.0.4,<6.0.0" +requests = ">=2.32.3,<3.0.0" +sentry-sdk = {version = ">=2.3.1,<3.0.0", extras = ["fastapi"]} +sounddevice = ">=0.4.7,<0.5.0" +tiktoken = ">=0.7.0,<0.8.0" +twilio = {version = ">=9.1.0,<10.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} +uvicorn = ">=0.30.0,<0.31.0" +vonage = {version = ">=3.14.0,<4.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} +websockets = ">=12.0,<13.0" + +[package.extras] +all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)"] +synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)"] +telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] -[package.source] -type = "directory" -url = "../.." - [[package]] name = "vonage" -version = "3.14.0" +version = "3.16.0" description = "Vonage Server SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "vonage-3.14.0-py2.py3-none-any.whl", hash = "sha256:f8d28b8fcd157c0610d84b880779aadd3ab3768abfb18ef863e08669de163ccf"}, - {file = "vonage-3.14.0.tar.gz", hash = "sha256:ea001e9616abb19670c4250a1ac46288207030ebc9d9ecbcf5fcffef61fa5850"}, + {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, + {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, ] [package.dependencies] @@ -3698,17 +3546,6 @@ files = [ [package.dependencies] anyio = ">=3.0.0" -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - [[package]] name = "websockets" version = "12.0" @@ -3988,20 +3825,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.19.0" +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.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "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)"] +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.9,<3.12" -content-hash = "4f04aff2fd12f06ec9d2cb85b3ee1f4d34aca7ebd40858407f589fef00dab033" +python-versions = ">=3.11,<3.12" +content-hash = "ff98a04f8188e2a35f48409bc0b9d514ec16ad3ac4b88b88dcb2ef578a0ed982" diff --git a/apps/client_backend/pyproject.toml b/apps/client_backend/pyproject.toml index ab75265668..4f2a138931 100644 --- a/apps/client_backend/pyproject.toml +++ b/apps/client_backend/pyproject.toml @@ -6,11 +6,11 @@ authors = ["Your Name "] readme = "README.md" [tool.poetry.dependencies] -python = ">=3.9,<3.12" +python = ">=3.11,<3.12" python-dotenv = "^1.0.1" -vocode = { path = "../..", extras = [ +vocode = { version = "0.1.112", extras = [ "all", -], develop = true, python = ">=3.11,<3.12" } +] } elevenlabs = "^1.2.2" diff --git a/apps/telephony_app/Dockerfile b/apps/telephony_app/Dockerfile index 8c25f61403..4223fb77a3 100644 --- a/apps/telephony_app/Dockerfile +++ b/apps/telephony_app/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-bullseye +FROM python:3.10-bullseye # get portaudio and ffmpeg RUN apt-get update \ diff --git a/apps/telephony_app/poetry.lock b/apps/telephony_app/poetry.lock index d851a18351..a4f57179bf 100644 --- a/apps/telephony_app/poetry.lock +++ b/apps/telephony_app/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -87,6 +87,7 @@ files = [ [package.dependencies] aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" @@ -136,12 +137,13 @@ files = [ [[package]] name = "anthropic" -version = "0.28.0" +version = "0.28.1" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, + {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, + {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, ] [package.dependencies] @@ -170,32 +172,16 @@ files = [ ] [package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] -[[package]] -name = "asttokens" -version = "2.4.1" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = "*" -files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, -] - -[package.dependencies] -six = ">=1.12.0" - -[package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] - [[package]] name = "async-timeout" version = "4.0.3" @@ -228,17 +214,17 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "azure-cognitiveservices-speech" -version = "1.37.0" +version = "1.38.0" description = "Microsoft Cognitive Services Speech SDK for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:906d6bf65176e93464e2d763dd074ca00c48cfe1a896371fcdcb155a500910f7"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54ec8dd55d4dbd9058c61909e08485d3761d6d30954da189e1b17d84daf5e2e0"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:685424689725d2d4115485998c0888c8b5b502259037ff533e5a834575f80b66"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:384f66786c2335165035270897b34d0b91736a1fdf38f7696e9a227075cb2489"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win32.whl", hash = "sha256:343d5f449ccd6c9b53cd37dd46a70ece0905243517df7a0c047779e55072254c"}, - {file = "azure_cognitiveservices_speech-1.37.0-py3-none-win_amd64.whl", hash = "sha256:a18fb45490cdcd681407ccaad9560fb14dda1c8276de297e219ea1a880467e28"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:18dce915ab032711f687abb3297dd19176b9cbea562b322ee6fa7365ef4a5091"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9dd0800fbc4a8438c6dfd5747a658251914fe2d205a29e9b46158cadac6ab381"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:1c344e8a6faadb063cea451f0301e13b44d9724e1242337039bff601e81e6f86"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e002595a749471efeac3a54c80097946570b76c13049760b97a4b881d9d24af"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win32.whl", hash = "sha256:16a530e6c646eb49ea0bc05cb45a9d28b99e4b67613f6c3a6c54e26e6bf65241"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, ] [[package]] @@ -252,15 +238,37 @@ files = [ {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] +[[package]] +name = "cartesia" +version = "0.1.1" +description = "The official Python library for the Cartesia API." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, + {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, +] + +[package.dependencies] +aiohttp = "*" +httpx = "*" +pytest-asyncio = "*" +requests = "*" +websockets = "*" + +[package.extras] +all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] +dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] + [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.6.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, ] [[package]] @@ -453,43 +461,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.7" +version = "42.0.8" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477"}, - {file = "cryptography-42.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55"}, - {file = "cryptography-42.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da"}, - {file = "cryptography-42.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7"}, - {file = "cryptography-42.0.7-cp37-abi3-win32.whl", hash = "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b"}, - {file = "cryptography-42.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678"}, - {file = "cryptography-42.0.7-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda"}, - {file = "cryptography-42.0.7-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1"}, - {file = "cryptography-42.0.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886"}, - {file = "cryptography-42.0.7-cp39-abi3-win32.whl", hash = "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda"}, - {file = "cryptography-42.0.7-cp39-abi3-win_amd64.whl", hash = "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd"}, - {file = "cryptography-42.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9"}, - {file = "cryptography-42.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68"}, - {file = "cryptography-42.0.7.tar.gz", hash = "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, ] [package.dependencies] @@ -507,30 +515,19 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "dataclasses-json" -version = "0.6.6" +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.6-py3-none-any.whl", hash = "sha256:e54c5c87497741ad454070ba0ed411523d46beb5da102e221efb873801b0ba85"}, - {file = "dataclasses_json-0.6.6.tar.gz", hash = "sha256:0c09827d26fffda27f1be2fed7a7a01a29c5ddcd2eb6393ad5ebf9d77e9deae8"}, + {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 = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "deprecated" version = "1.2.14" @@ -581,18 +578,17 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "elevenlabs" -version = "1.2.2" +version = "1.3.0" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.2.2-py3-none-any.whl", hash = "sha256:60b92b0e2aabdfba93a43569f207f8a2ad397492519b8e11a2eebb32807ddefa"}, - {file = "elevenlabs-1.2.2.tar.gz", hash = "sha256:ebd02869b95602b8956874dd727981bb49ad16b9a3c2f5901193d838213694aa"}, + {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, + {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, ] [package.dependencies] httpx = ">=0.21.2" -ipython = ">=7.0" pydantic = ">=1.9.2" requests = ">=2.20" typing_extensions = ">=4.0.0" @@ -614,18 +610,18 @@ dnspython = ">=2.0.0" idna = ">=2.0.0" [[package]] -name = "executing" -version = "2.0.1" -description = "Get the currently executing AST node of a frame, and other information" +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, - {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] +test = ["pytest (>=6)"] [[package]] name = "fastapi" @@ -673,18 +669,18 @@ standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [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-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.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)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -775,13 +771,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.5.0" +version = "2024.6.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"}, + {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, + {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, ] [package.extras] @@ -790,6 +786,7 @@ adl = ["adlfs"] arrow = ["pyarrow (>=1)"] dask = ["dask", "distributed"] dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] 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"] @@ -825,8 +822,14 @@ files = [ [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} -grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio = [ + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, +] +grpcio-status = [ + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, +] proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" @@ -838,13 +841,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.29.0" +version = "2.30.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, - {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, + {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, + {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, ] [package.dependencies] @@ -895,17 +898,17 @@ protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4 [[package]] name = "googleapis-common-protos" -version = "1.63.0" +version = "1.63.1" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, - {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, + {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, + {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, ] [package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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)"] @@ -983,61 +986,61 @@ test = ["objgraph", "psutil"] [[package]] name = "grpcio" -version = "1.64.0" +version = "1.64.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, - {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, - {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, - {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, - {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, - {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, - {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, - {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, - {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, - {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, - {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, - {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, - {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, - {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, - {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, - {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, - {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, - {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, - {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, - {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, - {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, - {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, - {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, - {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, - {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, - {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, - {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, - {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, - {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, - {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, - {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, -] - -[package.extras] -protobuf = ["grpcio-tools (>=1.64.0)"] + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.1)"] [[package]] name = "grpcio-status" @@ -1161,13 +1164,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.2" +version = "0.23.4" 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.23.2-py3-none-any.whl", hash = "sha256:48727a16e704d409c4bb5913613308499664f22a99743435dc3a13b23c485827"}, - {file = "huggingface_hub-0.23.2.tar.gz", hash = "sha256:f6829b62d5fdecb452a76fdbec620cba4c1573655a8d710c1df71735fd9edbd2"}, + {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, ] [package.dependencies] @@ -1206,60 +1209,34 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.0" +version = "7.1.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-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [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"] +docs = ["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"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] -name = "ipython" -version = "8.24.0" -description = "IPython: Productive Interactive Computing" +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.10" +python-versions = ">=3.7" files = [ - {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, - {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt-toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack-data = "*" -traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} - -[package.extras] -all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] -kernel = ["ipykernel"] -matplotlib = ["matplotlib"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] - [[package]] name = "janus" version = "1.0.0" @@ -1274,25 +1251,6 @@ files = [ [package.dependencies] typing-extensions = ">=3.7.4.3" -[[package]] -name = "jedi" -version = "0.19.1" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, -] - -[package.dependencies] -parso = ">=0.8.3,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] - [[package]] name = "jinja2" version = "3.1.4" @@ -1312,72 +1270,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.0" +version = "0.4.2" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4aa6226d82a4a4505078c0bd5947bad65399635fc5cd4b226512e41753624edf"}, - {file = "jiter-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:947111ac906740a948e7b63799481acd3d5ef666ccb178d146e25718640b7408"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69572ffb4e84ae289a7422b9af4ea123cae2ce0772228859b37d4b26b4bc92ea"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ba6046cbb5d1baa5a781b846f7e5438596a332f249a857d63f86ef5d1d9563b0"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4f346e54602782e66d07df0d1c7389384fd93680052ed6170da2c6dc758409e"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49110ce693f07e97d61089d894cea05a0b9894d5ccc6ac6fc583028726c8c8af"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e358df6fd129f3a4e087539f086355ad0107e5da16dbc8bc857d94222eaeed5"}, - {file = "jiter-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7eb852ca39a48f3c049def56f0d1771b32e948e4f429a782d14ef4cc64cfd26e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:44dc045decb2545bffe2da04ea4c36d9438d3f3d49fc47ed423ea75c352b712e"}, - {file = "jiter-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:413adb15372ac63db04373240f40925788e4282c997eeafc2040530049a0a599"}, - {file = "jiter-0.4.0-cp310-none-win32.whl", hash = "sha256:0b48ea71673a97b897e4b94bbc871e62495a5a85f836c9f90712a4c70aa3ef7e"}, - {file = "jiter-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:6a1c84b44afafaf0ba6223679cf17af664b889da14da31d8af3595fd977d96fa"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b2cc498345fa37ca23fbc20271a553aa46e6eb00924600f49b7dc4b2aa8952ee"}, - {file = "jiter-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f7221ac09ab421abf04f89942026868297c568133998fb181bcf435760cbf3"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d01c52f3e5a56ae73af36bd13797dd1a56711eb522748e5e84d15425b3f10"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:39be97d5ce0c4d0dae28c23c03a0af0501a725589427e99763f99c42e18aa402"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eac2ed1ec1e577b92b7ea2d4e6de8aec0c1164defd8af8affdc8ec0f0ec2904a"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6258837d184c92c9cb91c983c310ad7269d41afb49d34f00ca9246e073943a03"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123c2a77b066bf17a4d021e238e8351058cfa56b90ac04f2522d120dc64ea055"}, - {file = "jiter-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2df939f792c7a40e55f36700417db551b9f6b84d348990fa0f2c608adeb1f11b"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cb1b09b16d40cf9ba1d11ba11e5b96ad29286a6a1c4ad5e6a2aef5e352a89f5d"}, - {file = "jiter-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0efb4208889ebdbf933bf08dbcbc16e64ffd34c8e2b28044ee142789a9dc3a67"}, - {file = "jiter-0.4.0-cp311-none-win32.whl", hash = "sha256:20545ac1b68e7e5b066a1e8347840c9cebdd02ace65faae2e655fc02ec5c915c"}, - {file = "jiter-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:6b300f9887c8e4431cd03a974ea3e4f9958885636003c3864220a9b2d2f8462b"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:923432a0563bbae404ff25bb010e348514a69bfab979f2f8119b23b625dbf6d9"}, - {file = "jiter-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab8bb0ec8b97cec4422dc8b37b525442d969244488c805b834609ab0ccd788e2"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b857adb127b9c533907226791eafa79c5038c3eb5a477984994bf7c4715ba518"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2609cc0d1d8d470e921ff9a604afeb4c701bbe13e00bd9834d5aa6e7ea732a9b"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d39e99f8b7df46a119b6f84321f6ba01f16fa46abfa765d44c05c486d8e66829"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56de8b518ebfe76a70f856741f6de248ce396c50a87acef827b6e8388e3a502d"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488b7e777be47f67ce1a1f8f8eb907f9bbd81af5c03784a9bab09d025c250233"}, - {file = "jiter-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ea35e0ecbb5dadd457855eb980dcc548c14cf5341bcd22a43814cb56f2bcc79"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e1a9e9ee69c80b63951c93226b68d0e955953f64fe758bad2afe7ef7f9016af9"}, - {file = "jiter-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:78e2f3cc2a32a21d43ccc5afcf66f5d17e827ccc4e6d21c0b353bdad2c7dcc9c"}, - {file = "jiter-0.4.0-cp312-none-win32.whl", hash = "sha256:eeaa7a2b47a99f4ebbb4142bb58b95617e09f24c87570f6a57d2770687c9ddbe"}, - {file = "jiter-0.4.0-cp312-none-win_amd64.whl", hash = "sha256:8d4a78b385b93ff59a67215d26000fcb4789a388fca3730d1b60fab17fc81e3c"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ebf20a3fac1089ce26963bf04140da0f803d55332ec69d59c5a87cf1a87d29c4"}, - {file = "jiter-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d62244ffc6a168187452277adeefb7b2c30170689c6bf543a51e98e8c17ddab7"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40b2cde77446a41cec595739fd168be87edff2428eaf7c3438231224dd0ab7a5"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e51fc0a22021ec8905b9b00a2f7d25756f2ff7a653e35a790a2067ae126b51f6"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a56e6f980b89d7cfe5c43811dcf52d6f37b319428a4540511235dafda9ea7808"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fec16adab8d3d3d6d74e3711a1f380836ebeab2a20e3f88cfe2ec5094d8b84"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e3de515801c954e8f1dc1f575282a4a86df9e782d4993ea1ed2be9a8dedaa0"}, - {file = "jiter-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17e0ad8abf0bb04d81810eaeaab35d2c99b5da11fcd1058e0a389607ff6503b0"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8dc0132b728f3b3e90ff0d1874504cd49c78f3553bf3745168a7fc0b4cf674e1"}, - {file = "jiter-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81a883104aa96e494d3d28eaf7070780d03ecee8ccfdfaf7e4899710340c47f1"}, - {file = "jiter-0.4.0-cp38-none-win32.whl", hash = "sha256:a044c53ab1aaa4af624ac9574181b5bad8e260aea7e03104738156511433deba"}, - {file = "jiter-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:d920035c869053e3d9a0b3ff94384d16a8ef5fde3dea55f97bd29916f6e27554"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:091e978f4e586a2f1c69bf940d45f4e6a23455877172a0ab7d6de04a3b119299"}, - {file = "jiter-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79134b2d601309bcbe3304a262d7d228ad61d53c80883231c637773000a6d683"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c471473e0b05058b5d729ff04271b6d45a575ac8bd9948563268c734b380ac7e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb84b8930da8b32b0b1fdff9817e2c4b47e8981b5647ad11c4975403416e4112"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2805e28941751ebfe0948596a64cde4cfb9b84bea5282affd020063e659c96"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42ef59f9e513bf081a8b5c5578933ea9c3a63e559e6e3501a3e72edcd456ff5e"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae12e3906f9e565120ab569de261b738e3a1ec50c40e30c67499e4f893e9a8c"}, - {file = "jiter-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:264dc1324f45a793bc89af4f653225229eb17bca9ec7107dce6c8fb4fe68d20f"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9a1c172ec47d846e25881dfbd52438ddb690da4ea04d185e477abd3db6c32f8a"}, - {file = "jiter-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ccde31d0bc114aedad0dbd71b7f63ba0f0eecd7ec9ae1926a0ca01c1eb2854e7"}, - {file = "jiter-0.4.0-cp39-none-win32.whl", hash = "sha256:13139b05792fbc13a0f9a5b4c89823ea0874141decae1b8f693f12bb1d28e061"}, - {file = "jiter-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:3a729b2631c6d5551a41069697415fee9659c3eadc9ab87369376ba51930cd00"}, - {file = "jiter-0.4.0.tar.gz", hash = "sha256:68203e02e0419bc3eca717c580c2d8f615aeee1150e2a1fb68d6600a7e52a37c"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, + {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, + {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, + {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, + {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, + {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, + {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, + {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, + {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, + {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, + {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, + {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, ] [[package]] @@ -1407,13 +1365,13 @@ jsonpointer = ">=1.9" [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] @@ -1453,99 +1411,79 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.1" +version = "0.2.5" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.1-py3-none-any.whl", hash = "sha256:3e13bf97c5717bce2c281f5117e8778823e8ccf62d949e73d3869448962b1c97"}, - {file = "langchain-0.2.1.tar.gz", hash = "sha256:5758a315e1ac92eb26dafec5ad0fafa03cafa686aba197d5bb0b1dd28cc03ebe"}, + {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, + {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" -langchain-core = ">=0.2.0,<0.3.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +langchain-core = ">=0.2.7,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" -numpy = ">=1,<2" +numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] -clarifai = ["clarifai (>=9.1.0)"] -cli = ["typer (>=0.9.0,<0.10.0)"] -cohere = ["cohere (>=4,<6)"] -docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] -embeddings = ["sentence-transformers (>=2,<3)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<6)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.1,<0.2)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] -javascript = ["esprima (>=4.0.1,<5.0.0)"] -llms = ["clarifai (>=9.1.0)", "cohere (>=4,<6)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] -openai = ["openai (<2)", "tiktoken (>=0.7,<1.0)"] -qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] -text-helpers = ["chardet (>=5.1.0,<6.0.0)"] - [[package]] name = "langchain-community" -version = "0.2.1" +version = "0.2.5" description = "Community contributed LangChain integrations." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.1-py3-none-any.whl", hash = "sha256:b834e2c5ded6903b839fcaf566eee90a0ffae53405a0f7748202725e701d39cd"}, - {file = "langchain_community-0.2.1.tar.gz", hash = "sha256:079942e8f15da975769ccaae19042b7bba5481c42020bbbd7d8cad73a9393261"}, + {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, + {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.0,<0.3.0" -langchain-core = ">=0.2.0,<0.3.0" +langchain = ">=0.2.5,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" langsmith = ">=0.1.0,<0.2.0" -numpy = ">=1,<2" +numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -cli = ["typer (>=0.9.0,<0.10.0)"] -extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "azure-identity (>=1.15.0,<2.0.0)", "azure-search-documents (==11.4.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.6,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpathlib (>=0.18,<0.19)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "httpx-sse (>=0.4.0,<0.5.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.3,<6.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "oracledb (>=2.2.0,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "premai (>=0.3.25,<0.4.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pyjwt (>=2.8.0,<3.0.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "vdms (>=0.0.20,<0.0.21)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] - [[package]] name = "langchain-core" -version = "0.2.3" +version = "0.2.7" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.3-py3-none-any.whl", hash = "sha256:22189b5a3a30bfd65eb995f95e627f7c2c3acb322feb89f5f5f2fb7df21833a7"}, - {file = "langchain_core-0.2.3.tar.gz", hash = "sha256:fbc75a64b9c0b7655d96ca57a707df1e6c09efc1539c36adbd73260612549810"}, + {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, + {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.65,<0.2.0" -packaging = ">=23.2,<24.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" pydantic = ">=1,<3" PyYAML = ">=5.3" tenacity = ">=8.1.0,<9.0.0" -[package.extras] -extended-testing = ["jinja2 (>=3,<4)"] - [[package]] name = "langchain-text-splitters" -version = "0.2.0" +version = "0.2.1" description = "LangChain text splitting utilities" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_text_splitters-0.2.0-py3-none-any.whl", hash = "sha256:7b4c6a45f8471630a882b321e138329b6897102a5bc62f4c12be1c0b05bb9199"}, - {file = "langchain_text_splitters-0.2.0.tar.gz", hash = "sha256:b32ab4f7397f7d42c1fa3283fefc2547ba356bd63a68ee9092865e5ad83c82f9"}, + {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, + {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, ] [package.dependencies] @@ -1556,13 +1494,13 @@ extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] name = "langsmith" -version = "0.1.65" +version = "0.1.77" 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.65-py3-none-any.whl", hash = "sha256:ab4487029240e69cca30da1065f1e9138e5a7ca2bbe8c697f0bd7d5839f71cf7"}, - {file = "langsmith-0.1.65.tar.gz", hash = "sha256:d3c2eb2391478bd79989f02652cf66e29a7959d677614b6993a47cef43f7f43b"}, + {file = "langsmith-0.1.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, + {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, ] [package.dependencies] @@ -1683,13 +1621,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.21.2" +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.2-py3-none-any.whl", hash = "sha256:70b54a6282f4704d12c0a41599682c5c5450e843b9ec406308653b47c59648a1"}, - {file = "marshmallow-3.21.2.tar.gz", hash = "sha256:82408deadd8b33d56338d2182d455db632c6313aa2af61916672146bb32edc56"}, + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, ] [package.dependencies] @@ -1700,20 +1638,6 @@ 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 = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - [[package]] name = "mdurl" version = "0.1.2" @@ -1971,13 +1895,13 @@ files = [ [[package]] name = "openai" -version = "1.30.5" +version = "1.34.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.30.5-py3-none-any.whl", hash = "sha256:2ad95e926de0d2e09cde632a9204b0a6dca4a03c2cdcc84329b01f355784355a"}, - {file = "openai-1.30.5.tar.gz", hash = "sha256:5366562eb2c5917e6116ae0391b7ae6e3acd62b0ae3f565ada32b35d8fcfa106"}, + {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, + {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, ] [package.dependencies] @@ -1994,165 +1918,140 @@ datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.24.0" +version = "1.25.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"}, + {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, + {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.0" +importlib-metadata = ">=6.0,<=7.1" [[package]] name = "opentelemetry-sdk" -version = "1.24.0" +version = "1.25.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"}, + {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, + {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, ] [package.dependencies] -opentelemetry-api = "1.24.0" -opentelemetry-semantic-conventions = "0.45b0" +opentelemetry-api = "1.25.0" +opentelemetry-semantic-conventions = "0.46b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.45b0" +version = "0.46b0" 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"}, + {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, + {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, ] +[package.dependencies] +opentelemetry-api = "1.25.0" + [[package]] name = "orjson" -version = "3.10.3" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.3-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9fb6c3f9f5490a3eb4ddd46fc1b6eadb0d6fc16fb3f07320149c3286a1409dd8"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:252124b198662eee80428f1af8c63f7ff077c88723fe206a25df8dc57a57b1fa"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f3e87733823089a338ef9bbf363ef4de45e5c599a9bf50a7a9b82e86d0228da"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8334c0d87103bb9fbbe59b78129f1f40d1d1e8355bbed2ca71853af15fa4ed3"}, - {file = "orjson-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1952c03439e4dce23482ac846e7961f9d4ec62086eb98ae76d97bd41d72644d7"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0403ed9c706dcd2809f1600ed18f4aae50be263bd7112e54b50e2c2bc3ebd6d"}, - {file = "orjson-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:382e52aa4270a037d41f325e7d1dfa395b7de0c367800b6f337d8157367bf3a7"}, - {file = "orjson-3.10.3-cp310-none-win32.whl", hash = "sha256:be2aab54313752c04f2cbaab4515291ef5af8c2256ce22abc007f89f42f49109"}, - {file = "orjson-3.10.3-cp310-none-win_amd64.whl", hash = "sha256:416b195f78ae461601893f482287cee1e3059ec49b4f99479aedf22a20b1098b"}, - {file = "orjson-3.10.3-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:73100d9abbbe730331f2242c1fc0bcb46a3ea3b4ae3348847e5a141265479700"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a12eee96e3ab828dbfcb4d5a0023aa971b27143a1d35dc214c176fdfb29b3"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520de5e2ef0b4ae546bea25129d6c7c74edb43fc6cf5213f511a927f2b28148b"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ccaa0a401fc02e8828a5bedfd80f8cd389d24f65e5ca3954d72c6582495b4bcf"}, - {file = "orjson-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7bc9e8bc11bac40f905640acd41cbeaa87209e7e1f57ade386da658092dc16"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3582b34b70543a1ed6944aca75e219e1192661a63da4d039d088a09c67543b08"}, - {file = "orjson-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c23dfa91481de880890d17aa7b91d586a4746a4c2aa9a145bebdbaf233768d5"}, - {file = "orjson-3.10.3-cp311-none-win32.whl", hash = "sha256:1770e2a0eae728b050705206d84eda8b074b65ee835e7f85c919f5705b006c9b"}, - {file = "orjson-3.10.3-cp311-none-win_amd64.whl", hash = "sha256:93433b3c1f852660eb5abdc1f4dd0ced2be031ba30900433223b28ee0140cde5"}, - {file = "orjson-3.10.3-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a39aa73e53bec8d410875683bfa3a8edf61e5a1c7bb4014f65f81d36467ea098"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0943a96b3fa09bee1afdfccc2cb236c9c64715afa375b2af296c73d91c23eab2"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e852baafceff8da3c9defae29414cc8513a1586ad93e45f27b89a639c68e8176"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18566beb5acd76f3769c1d1a7ec06cdb81edc4d55d2765fb677e3eaa10fa99e0"}, - {file = "orjson-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd2218d5a3aa43060efe649ec564ebedec8ce6ae0a43654b81376216d5ebd42"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cf20465e74c6e17a104ecf01bf8cd3b7b252565b4ccee4548f18b012ff2f8069"}, - {file = "orjson-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba7f67aa7f983c4345eeda16054a4677289011a478ca947cd69c0a86ea45e534"}, - {file = "orjson-3.10.3-cp312-none-win32.whl", hash = "sha256:17e0713fc159abc261eea0f4feda611d32eabc35708b74bef6ad44f6c78d5ea0"}, - {file = "orjson-3.10.3-cp312-none-win_amd64.whl", hash = "sha256:4c895383b1ec42b017dd2c75ae8a5b862fc489006afde06f14afbdd0309b2af0"}, - {file = "orjson-3.10.3-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:be2719e5041e9fb76c8c2c06b9600fe8e8584e6980061ff88dcbc2691a16d20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0175a5798bdc878956099f5c54b9837cb62cfbf5d0b86ba6d77e43861bcec2"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:978be58a68ade24f1af7758626806e13cff7748a677faf95fbb298359aa1e20d"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16bda83b5c61586f6f788333d3cf3ed19015e3b9019188c56983b5a299210eb5"}, - {file = "orjson-3.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ad1f26bea425041e0a1adad34630c4825a9e3adec49079b1fb6ac8d36f8b754"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9e253498bee561fe85d6325ba55ff2ff08fb5e7184cd6a4d7754133bd19c9195"}, - {file = "orjson-3.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0a62f9968bab8a676a164263e485f30a0b748255ee2f4ae49a0224be95f4532b"}, - {file = "orjson-3.10.3-cp38-none-win32.whl", hash = "sha256:8d0b84403d287d4bfa9bf7d1dc298d5c1c5d9f444f3737929a66f2fe4fb8f134"}, - {file = "orjson-3.10.3-cp38-none-win_amd64.whl", hash = "sha256:8bc7a4df90da5d535e18157220d7915780d07198b54f4de0110eca6b6c11e290"}, - {file = "orjson-3.10.3-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9059d15c30e675a58fdcd6f95465c1522b8426e092de9fff20edebfdc15e1cb0"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d40c7f7938c9c2b934b297412c067936d0b54e4b8ab916fd1a9eb8f54c02294"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a654ec1de8fdaae1d80d55cee65893cb06494e124681ab335218be6a0691e7"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:831c6ef73f9aa53c5f40ae8f949ff7681b38eaddb6904aab89dca4d85099cb78"}, - {file = "orjson-3.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99b880d7e34542db89f48d14ddecbd26f06838b12427d5a25d71baceb5ba119d"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e5e176c994ce4bd434d7aafb9ecc893c15f347d3d2bbd8e7ce0b63071c52e25"}, - {file = "orjson-3.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b69a58a37dab856491bf2d3bbf259775fdce262b727f96aafbda359cb1d114d8"}, - {file = "orjson-3.10.3-cp39-none-win32.whl", hash = "sha256:b8d4d1a6868cde356f1402c8faeb50d62cee765a1f7ffcfd6de732ab0581e063"}, - {file = "orjson-3.10.3-cp39-none-win_amd64.whl", hash = "sha256:5102f50c5fc46d94f2033fe00d392588564378260d64377aec702f21a7a22912"}, - {file = "orjson-3.10.3.tar.gz", hash = "sha256:2b166507acae7ba2f7c315dcf185a9111ad5e992ac81f2d507aac39193c2c818"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] name = "phonenumbers" -version = "8.13.37" +version = "8.13.38" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.37-py2.py3-none-any.whl", hash = "sha256:4ea00ef5012422c08c7955c21131e7ae5baa9a3ef52cf2d561e963f023006b80"}, - {file = "phonenumbers-8.13.37.tar.gz", hash = "sha256:bd315fed159aea0516f7c367231810fe8344d5bec26156b88fa18374c11d1cf2"}, + {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, + {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, ] [[package]] -name = "prompt-toolkit" -version = "3.0.45" -description = "Library for building powerful interactive command lines in Python" +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8" files = [ - {file = "prompt_toolkit-3.0.45-py3-none-any.whl", hash = "sha256:a29b89160e494e3ea8622b09fa5897610b437884dcdcd054fdc1308883326c2a"}, - {file = "prompt_toolkit-3.0.45.tar.gz", hash = "sha256:07c60ee4ab7b7e90824b61afa840c8f5aad2d46b3e2e10acc33d8ecc94a49089"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] -[package.dependencies] -wcwidth = "*" +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "proto-plus" @@ -2191,31 +2090,6 @@ files = [ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.2" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, -] - -[package.extras] -tests = ["pytest"] - [[package]] name = "pvkoala" version = "2.0.1" @@ -2265,18 +2139,18 @@ files = [ [[package]] name = "pydantic" -version = "2.7.2" +version = "2.7.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.2-py3-none-any.whl", hash = "sha256:834ab954175f94e6e68258537dc49402c4a5e9d0409b9f1b86b7e934a8372de7"}, - {file = "pydantic-2.7.2.tar.gz", hash = "sha256:71b2945998f9c9b7919a45bde9a50397b289937d215ae141c1d0903ba7149fd7"}, + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.3" +pydantic-core = "2.18.4" typing-extensions = ">=4.6.1" [package.extras] @@ -2284,95 +2158,114 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.3" +version = "2.18.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:744697428fcdec6be5670460b578161d1ffe34743a5c15656be7ea82b008197c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b40c05ced1ba4218b14986fe6f283d22e1ae2ff4c8e28881a70fb81fbfcda7"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:544a9a75622357076efb6b311983ff190fbfb3c12fc3a853122b34d3d358126c"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2e253af04ceaebde8eb201eb3f3e3e7e390f2d275a88300d6a1959d710539e2"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:855ec66589c68aa367d989da5c4755bb74ee92ccad4fdb6af942c3612c067e34"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3e42bb54e7e9d72c13ce112e02eb1b3b55681ee948d748842171201a03a98a"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6ac9ffccc9d2e69d9fba841441d4259cb668ac180e51b30d3632cd7abca2b9b"}, - {file = "pydantic_core-2.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c56eca1686539fa0c9bda992e7bd6a37583f20083c37590413381acfc5f192d6"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:17954d784bf8abfc0ec2a633108207ebc4fa2df1a0e4c0c3ccbaa9bb01d2c426"}, - {file = "pydantic_core-2.18.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:98ed737567d8f2ecd54f7c8d4f8572ca7c7921ede93a2e52939416170d357812"}, - {file = "pydantic_core-2.18.3-cp310-none-win32.whl", hash = "sha256:9f9e04afebd3ed8c15d67a564ed0a34b54e52136c6d40d14c5547b238390e779"}, - {file = "pydantic_core-2.18.3-cp310-none-win_amd64.whl", hash = "sha256:45e4ffbae34f7ae30d0047697e724e534a7ec0a82ef9994b7913a412c21462a0"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b9ebe8231726c49518b16b237b9fe0d7d361dd221302af511a83d4ada01183ab"}, - {file = "pydantic_core-2.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b8e20e15d18bf7dbb453be78a2d858f946f5cdf06c5072453dace00ab652e2b2"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d9ff283cd3459fa0bf9b0256a2b6f01ac1ff9ffb034e24457b9035f75587cb"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f7ef5f0ebb77ba24c9970da18b771711edc5feaf00c10b18461e0f5f5949231"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73038d66614d2e5cde30435b5afdced2b473b4c77d4ca3a8624dd3e41a9c19be"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6afd5c867a74c4d314c557b5ea9520183fadfbd1df4c2d6e09fd0d990ce412cd"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd7df92f28d351bb9f12470f4c533cf03d1b52ec5a6e5c58c65b183055a60106"}, - {file = "pydantic_core-2.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:80aea0ffeb1049336043d07799eace1c9602519fb3192916ff525b0287b2b1e4"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaee40f25bba38132e655ffa3d1998a6d576ba7cf81deff8bfa189fb43fd2bbe"}, - {file = "pydantic_core-2.18.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9128089da8f4fe73f7a91973895ebf2502539d627891a14034e45fb9e707e26d"}, - {file = "pydantic_core-2.18.3-cp311-none-win32.whl", hash = "sha256:fec02527e1e03257aa25b1a4dcbe697b40a22f1229f5d026503e8b7ff6d2eda7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_amd64.whl", hash = "sha256:58ff8631dbab6c7c982e6425da8347108449321f61fe427c52ddfadd66642af7"}, - {file = "pydantic_core-2.18.3-cp311-none-win_arm64.whl", hash = "sha256:3fc1c7f67f34c6c2ef9c213e0f2a351797cda98249d9ca56a70ce4ebcaba45f4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f0928cde2ae416a2d1ebe6dee324709c6f73e93494d8c7aea92df99aab1fc40f"}, - {file = "pydantic_core-2.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bee9bb305a562f8b9271855afb6ce00223f545de3d68560b3c1649c7c5295e9"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e862823be114387257dacbfa7d78547165a85d7add33b446ca4f4fae92c7ff5c"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a36f78674cbddc165abab0df961b5f96b14461d05feec5e1f78da58808b97e7"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba905d184f62e7ddbb7a5a751d8a5c805463511c7b08d1aca4a3e8c11f2e5048"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fdd362f6a586e681ff86550b2379e532fee63c52def1c666887956748eaa326"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24b214b7ee3bd3b865e963dbed0f8bc5375f49449d70e8d407b567af3222aae4"}, - {file = "pydantic_core-2.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:691018785779766127f531674fa82bb368df5b36b461622b12e176c18e119022"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:60e4c625e6f7155d7d0dcac151edf5858102bc61bf959d04469ca6ee4e8381bd"}, - {file = "pydantic_core-2.18.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4e651e47d981c1b701dcc74ab8fec5a60a5b004650416b4abbef13db23bc7be"}, - {file = "pydantic_core-2.18.3-cp312-none-win32.whl", hash = "sha256:ffecbb5edb7f5ffae13599aec33b735e9e4c7676ca1633c60f2c606beb17efc5"}, - {file = "pydantic_core-2.18.3-cp312-none-win_amd64.whl", hash = "sha256:2c8333f6e934733483c7eddffdb094c143b9463d2af7e6bd85ebcb2d4a1b82c6"}, - {file = "pydantic_core-2.18.3-cp312-none-win_arm64.whl", hash = "sha256:7a20dded653e516a4655f4c98e97ccafb13753987434fe7cf044aa25f5b7d417"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:eecf63195be644b0396f972c82598cd15693550f0ff236dcf7ab92e2eb6d3522"}, - {file = "pydantic_core-2.18.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c44efdd3b6125419c28821590d7ec891c9cb0dff33a7a78d9d5c8b6f66b9702"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e59fca51ffbdd1638b3856779342ed69bcecb8484c1d4b8bdb237d0eb5a45e2"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70cf099197d6b98953468461d753563b28e73cf1eade2ffe069675d2657ed1d5"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63081a49dddc6124754b32a3774331467bfc3d2bd5ff8f10df36a95602560361"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:370059b7883485c9edb9655355ff46d912f4b03b009d929220d9294c7fd9fd60"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a64faeedfd8254f05f5cf6fc755023a7e1606af3959cfc1a9285744cc711044"}, - {file = "pydantic_core-2.18.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19d2e725de0f90d8671f89e420d36c3dd97639b98145e42fcc0e1f6d492a46dc"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:67bc078025d70ec5aefe6200ef094576c9d86bd36982df1301c758a9fff7d7f4"}, - {file = "pydantic_core-2.18.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf952c3f4100e203cbaf8e0c907c835d3e28f9041474e52b651761dc248a3c0"}, - {file = "pydantic_core-2.18.3-cp38-none-win32.whl", hash = "sha256:9a46795b1f3beb167eaee91736d5d17ac3a994bf2215a996aed825a45f897558"}, - {file = "pydantic_core-2.18.3-cp38-none-win_amd64.whl", hash = "sha256:200ad4e3133cb99ed82342a101a5abf3d924722e71cd581cc113fe828f727fbc"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:304378b7bf92206036c8ddd83a2ba7b7d1a5b425acafff637172a3aa72ad7083"}, - {file = "pydantic_core-2.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c826870b277143e701c9ccf34ebc33ddb4d072612683a044e7cce2d52f6c3fef"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e201935d282707394f3668380e41ccf25b5794d1b131cdd96b07f615a33ca4b1"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5560dda746c44b48bf82b3d191d74fe8efc5686a9ef18e69bdabccbbb9ad9442"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b32c2a1f8032570842257e4c19288eba9a2bba4712af542327de9a1204faff8"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:929c24e9dea3990bc8bcd27c5f2d3916c0c86f5511d2caa69e0d5290115344a9"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a8376fef60790152564b0eab376b3e23dd6e54f29d84aad46f7b264ecca943"}, - {file = "pydantic_core-2.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dccf3ef1400390ddd1fb55bf0632209d39140552d068ee5ac45553b556780e06"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:41dbdcb0c7252b58fa931fec47937edb422c9cb22528f41cb8963665c372caf6"}, - {file = "pydantic_core-2.18.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:666e45cf071669fde468886654742fa10b0e74cd0fa0430a46ba6056b24fb0af"}, - {file = "pydantic_core-2.18.3-cp39-none-win32.whl", hash = "sha256:f9c08cabff68704a1b4667d33f534d544b8a07b8e5d039c37067fceb18789e78"}, - {file = "pydantic_core-2.18.3-cp39-none-win_amd64.whl", hash = "sha256:4afa5f5973e8572b5c0dcb4e2d4fda7890e7cd63329bd5cc3263a25c92ef0026"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:77319771a026f7c7d29c6ebc623de889e9563b7087911b46fd06c044a12aa5e9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:df11fa992e9f576473038510d66dd305bcd51d7dd508c163a8c8fe148454e059"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d531076bdfb65af593326ffd567e6ab3da145020dafb9187a1d131064a55f97c"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33ce258e4e6e6038f2b9e8b8a631d17d017567db43483314993b3ca345dcbbb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1f9cd7f5635b719939019be9bda47ecb56e165e51dd26c9a217a433e3d0d59a9"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cd4a032bb65cc132cae1fe3e52877daecc2097965cd3914e44fbd12b00dae7c5"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f2718430098bcdf60402136c845e4126a189959d103900ebabb6774a5d9fdb"}, - {file = "pydantic_core-2.18.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0037a92cf0c580ed14e10953cdd26528e8796307bb8bb312dc65f71547df04d"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b95a0972fac2b1ff3c94629fc9081b16371dad870959f1408cc33b2f78ad347a"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a62e437d687cc148381bdd5f51e3e81f5b20a735c55f690c5be94e05da2b0d5c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b367a73a414bbb08507da102dc2cde0fa7afe57d09b3240ce82a16d608a7679c"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ecce4b2360aa3f008da3327d652e74a0e743908eac306198b47e1c58b03dd2b"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd4435b8d83f0c9561a2a9585b1de78f1abb17cb0cef5f39bf6a4b47d19bafe3"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:616221a6d473c5b9aa83fa8982745441f6a4a62a66436be9445c65f241b86c94"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7e6382ce89a92bc1d0c0c5edd51e931432202b9080dc921d8d003e616402efd1"}, - {file = "pydantic_core-2.18.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff58f379345603d940e461eae474b6bbb6dab66ed9a851ecd3cb3709bf4dcf6a"}, - {file = "pydantic_core-2.18.3.tar.gz", hash = "sha256:432e999088d85c8f36b9a3f769a8e2b57aabd817bbb729a90d1fe7f18f6f1f39"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, ] [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.3.3" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.3.3-py3-none-any.whl", hash = "sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de"}, + {file = "pydantic_settings-2.3.3.tar.gz", hash = "sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pydub" version = "0.25.1" @@ -2453,6 +2346,46 @@ PyYAML = ">=5.1" dev = ["coverage[toml]", "flake8", "flake8-pyproject", "pep8-naming", "psutil"] docs = ["Sphinx", "mypy", "sphinx-autodoc-typehints (==1.25.2)", "sphinx-notfound-page", "sphinx-substitution-extensions", "types-PyYAML"] +[[package]] +name = "pytest" +version = "8.2.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[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.7" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, + {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, +] + +[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 = "python-dotenv" version = "1.0.1" @@ -2554,13 +2487,13 @@ files = [ [[package]] name = "redis" -version = "5.0.4" +version = "5.0.6" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, - {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, ] [package.dependencies] @@ -2836,13 +2769,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.3.1" +version = "2.5.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.3.1-py2.py3-none-any.whl", hash = "sha256:c5aeb095ba226391d337dd42a6f9470d86c9fc236ecc71cfc7cd1942b45010c6"}, - {file = "sentry_sdk-2.3.1.tar.gz", hash = "sha256:139a71a19f5e9eb5d3623942491ce03cf8ebc14ea2e39ba3e6fe79560d8a5b1f"}, + {file = "sentry_sdk-2.5.1-py2.py3-none-any.whl", hash = "sha256:1f87acdce4a43a523ae5aa21a3fc37522d73ebd9ec04b1dbf01aa3d173852def"}, + {file = "sentry_sdk-2.5.1.tar.gz", hash = "sha256:fbc40a78a8a9c6675133031116144f0d0940376fa6e4e1acd5624c90b0aaf58b"}, ] [package.dependencies] @@ -2896,17 +2829,6 @@ files = [ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - [[package]] name = "sniffio" version = "1.3.1" @@ -3025,25 +2947,6 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - [[package]] name = "starlette" version = "0.37.2" @@ -3245,6 +3148,17 @@ dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + [[package]] name = "tqdm" version = "4.66.4" @@ -3265,30 +3179,15 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - [[package]] name = "twilio" -version = "9.1.0" +version = "9.1.1" description = "Twilio API client and TwiML generator" optional = false python-versions = ">=3.7.0" files = [ - {file = "twilio-9.1.0-py2.py3-none-any.whl", hash = "sha256:eb4687a9f81dc3118e8981c5a46d9f8184baee135c79afed47c714c759c31bbc"}, - {file = "twilio-9.1.0.tar.gz", hash = "sha256:ab2eb19c779855bf02cdca8a7e02ebaa64feee47da7b591ac9088ec07a6962e2"}, + {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, + {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, ] [package.dependencies] @@ -3316,13 +3215,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "typing-extensions" -version = "4.12.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, - {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -3446,13 +3345,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.30.0" +version = "0.30.1" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.0-py3-none-any.whl", hash = "sha256:78fa0b5f56abb8562024a59041caeb555c86e48d0efdd23c3fe7de7a4075bdab"}, - {file = "uvicorn-0.30.0.tar.gz", hash = "sha256:f678dec4fa3a39706bbf49b9ec5fc40049d42418716cea52b53f07828a60aa37"}, + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, ] [package.dependencies] @@ -3462,6 +3361,7 @@ h11 = ">=0.8" httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} @@ -3515,67 +3415,67 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "vocode" -version = "0.1.111" +version = "0.1.112" description = "The all-in-one voice SDK" optional = false -python-versions = ">=3.9,<3.12" -files = [] -develop = true - -[package.dependencies] -aiohttp = "^3.9.5" -anthropic = {version = "^0.28.0", optional = true} -azure-cognitiveservices-speech = {version = "^1.37.0", optional = true} -elevenlabs = {version = "^1.2.2", optional = true} -fastapi = "^0.111.0" -google-cloud-speech = {version = "^2.26.0", optional = true} -google-cloud-texttospeech = {version = "^2.16.3", optional = true} -janus = "^1.0.0" -jinja2 = "^3.1.4" -jsonschema = "^4.22.0" -langchain = {version = "^0.2.1", optional = true} -langchain-community = {version = "^0.2.1", optional = true} -loguru = "^0.7.2" -miniaudio = {version = "^1.59", optional = true} -nltk = {version = "^3.8.1", optional = true} -openai = {version = "^1.30.5", optional = true} -opentelemetry-sdk = "^1.24.0" -phonenumbers = "^8.13.37" -pvkoala = {version = "^2.0.1", optional = true} -pydantic = "^2.7.2" -pydub = {version = "^0.25.1", optional = true} -pyht = {version = "^0.0.28", optional = true} -redis = {version = "^5.0.4", optional = true} -requests = "^2.32.3" -sentry-sdk = {version = "^2.3.1", extras = ["fastapi"], optional = true} -sounddevice = "^0.4.7" -tiktoken = {version = "0.7.0", optional = true} -twilio = {version = "^9.1.0", optional = true} -uvicorn = "^0.30.0" -vonage = {version = "^3.14.0", optional = true} -websockets = "^12.0" - -[package.extras] -agents = ["anthropic (>=0.28.0,<0.29.0)", "openai (>=1.30.5,<2.0.0)", "tiktoken (==0.7.0)"] -all = ["anthropic (>=0.28.0,<0.29.0)", "azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "openai (>=1.30.5,<2.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)", "redis (>=5.0.4,<6.0.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)", "tiktoken (==0.7.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] -misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "sentry-sdk[fastapi] (>=2.3.1,<3.0.0)"] -synthesizers = ["azure-cognitiveservices-speech (>=1.37.0,<2.0.0)", "elevenlabs (>=1.2.2,<2.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "pyht (>=0.0.28,<0.0.29)"] -telephony = ["redis (>=5.0.4,<6.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +python-versions = "<4.0,>=3.10" +files = [ + {file = "vocode-0.1.112-py3-none-any.whl", hash = "sha256:6efcd1dd2676e1d2f049544e2c6e389f34c59dd2ec05ab2c588d0ea1624b193f"}, + {file = "vocode-0.1.112.tar.gz", hash = "sha256:e5a64d27089d6d7288a082751550f2465b2f1cd5d564f1e271c676c91dcf5b1d"}, +] + +[package.dependencies] +aiohttp = ">=3.9.5,<4.0.0" +anthropic = ">=0.28.0,<0.29.0" +azure-cognitiveservices-speech = ">=1.37.0,<2.0.0" +cartesia = {version = ">=0.1.1,<0.2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +elevenlabs = ">=1.2.2,<2.0.0" +fastapi = ">=0.111.0,<0.112.0" +google-cloud-speech = {version = ">=2.26.0,<3.0.0", optional = true, markers = "extra == \"transcribers\" or extra == \"all\""} +google-cloud-texttospeech = {version = ">=2.16.3,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +janus = ">=1.0.0,<2.0.0" +jinja2 = ">=3.1.4,<4.0.0" +jsonschema = ">=4.22.0,<5.0.0" +langchain = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} +langchain-community = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} +loguru = ">=0.7.2,<0.8.0" +miniaudio = {version = ">=1.59,<2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +nltk = {version = ">=3.8.1,<4.0.0", optional = true, markers = "extra == \"all\""} +numpy = ">=1.26.4,<2.0.0" +openai = ">=1.30.5,<2.0.0" +opentelemetry-sdk = ">=1.24.0,<2.0.0" +phonenumbers = ">=8.13.37,<9.0.0" +pvkoala = {version = ">=2.0.1,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pydantic = ">=2.7.2,<3.0.0" +pydantic-settings = ">=2.3.0,<3.0.0" +pydub = {version = ">=0.25.1,<0.26.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pyht = ">=0.0.28,<0.0.29" +redis = ">=5.0.4,<6.0.0" +requests = ">=2.32.3,<3.0.0" +sentry-sdk = {version = ">=2.3.1,<3.0.0", extras = ["fastapi"]} +sounddevice = ">=0.4.7,<0.5.0" +tiktoken = ">=0.7.0,<0.8.0" +twilio = {version = ">=9.1.0,<10.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} +uvicorn = ">=0.30.0,<0.31.0" +vonage = {version = ">=3.14.0,<4.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} +websockets = ">=12.0,<13.0" + +[package.extras] +all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)"] +synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)"] +telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] -[package.source] -type = "directory" -url = "../.." - [[package]] name = "vonage" -version = "3.14.0" +version = "3.16.0" description = "Vonage Server SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "vonage-3.14.0-py2.py3-none-any.whl", hash = "sha256:f8d28b8fcd157c0610d84b880779aadd3ab3768abfb18ef863e08669de163ccf"}, - {file = "vonage-3.14.0.tar.gz", hash = "sha256:ea001e9616abb19670c4250a1ac46288207030ebc9d9ecbcf5fcffef61fa5850"}, + {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, + {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, ] [package.dependencies] @@ -3702,17 +3602,6 @@ files = [ [package.dependencies] anyio = ">=3.0.0" -[[package]] -name = "wcwidth" -version = "0.2.13" -description = "Measures the displayed width of unicode strings in a terminal" -optional = false -python-versions = "*" -files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, -] - [[package]] name = "websockets" version = "12.0" @@ -3992,20 +3881,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.19.0" +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.0-py3-none-any.whl", hash = "sha256:96dc6ad62f1441bcaccef23b274ec471518daf4fbbc580341204936a5a3dddec"}, - {file = "zipp-3.19.0.tar.gz", hash = "sha256:952df858fb3164426c976d9338d3961e8e8b3758e2e059e0f754b8c4262625ee"}, + {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, + {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "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)"] +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.9,<3.12" -content-hash = "34b3cef8d3c84f54cf50b30e588a545a89fffe91d46a33cb269f48c222176f4e" +python-versions = ">=3.10,<3.12" +content-hash = "31eda1014b931a0fdc20581ea1d18d00a011f57cf4247b1c54498d87f9b0969d" diff --git a/apps/telephony_app/pyproject.toml b/apps/telephony_app/pyproject.toml index 01f6fc1b69..befa855df1 100644 --- a/apps/telephony_app/pyproject.toml +++ b/apps/telephony_app/pyproject.toml @@ -6,12 +6,13 @@ authors = ["Your Name "] readme = "README.md" [tool.poetry.dependencies] -python = ">=3.9,<3.12" +python = ">=3.10,<3.12" pyngrok = "^7.1.6" python-dotenv = "^1.0.1" -vocode = { path = "../..", extras = [ +azure-cognitiveservices-speech = "^1.38.0" +vocode = { version = "0.1.112", extras = [ "all", -], develop = true, python = ">=3.11,<3.12" } +]} [build-system] diff --git a/docs/open-source/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx index 08f89cf6ee..c90f6921fb 100644 --- a/docs/open-source/react-quickstart.mdx +++ b/docs/open-source/react-quickstart.mdx @@ -38,8 +38,17 @@ AZURE_SPEECH_KEY= AZURE_SPEECH_REGION= ``` +### Running with Python + +``` +pip3 install vocode +uvicorn main:app --port 3000 +``` + ### Running with Docker +Note: this is currently broken in 0.1.112 - we're planning an overhaul here, stay tuned! + From the `client_backend` directory: ``` @@ -47,13 +56,6 @@ docker build -t vocode-client-backend . docker run --env-file=.env -p 3000:3000 -t vocode-client-backend ``` -### Running with Python - -``` -pip3 install vocode -uvicorn main:app --port 3000 -``` - You now have a server with a Vocode websocket route at localhost:3000! You can now use the `useConversation` hook with your self-hosted backend as follows: ```typescript diff --git a/docs/open-source/telephony.mdx b/docs/open-source/telephony.mdx index 6537e1e3b5..cd0c5e9734 100644 --- a/docs/open-source/telephony.mdx +++ b/docs/open-source/telephony.mdx @@ -58,6 +58,8 @@ Pick one of these two ways to run the server: 1. Run everything with Docker, 2. ### Option 1: Run everything With Docker +Note: Support for the Azure synthesizer is currently broken in the current base Docker Python image. + 1. Build the telephony app Docker image. From the `telephony_app` directory, run: ```bash diff --git a/poetry.lock b/poetry.lock index c1b8234c67..dc2856dc5d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -151,12 +151,13 @@ files = [ [[package]] name = "anthropic" -version = "0.28.0" +version = "0.28.1" description = "The official Python library for the anthropic API" optional = false python-versions = ">=3.7" files = [ - {file = "anthropic-0.28.0-py3-none-any.whl", hash = "sha256:2b620b21aee3d20c5d8005483c34df239d53ae895687113b26b8a36892a7e20f"}, + {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, + {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, ] [package.dependencies] @@ -1313,13 +1314,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.3" +version = "0.23.4" 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.23.3-py3-none-any.whl", hash = "sha256:22222c41223f1b7c209ae5511d2d82907325a0e3cdbce5f66949d43c598ff3bc"}, - {file = "huggingface_hub-0.23.3.tar.gz", hash = "sha256:1a1118a0b3dea3bab6c325d71be16f5ffe441d32f3ac7c348d6875911b694b5b"}, + {file = "huggingface_hub-0.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, ] [package.dependencies] @@ -1574,22 +1575,25 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.3" +version = "0.2.4" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.3-py3-none-any.whl", hash = "sha256:5dc33cd9c8008693d328b7cb698df69073acecc89ad9c2a95f243b3314f8d834"}, - {file = "langchain-0.2.3.tar.gz", hash = "sha256:81962cc72cce6515f7bd71e01542727870789bf8b666c6913d85559080c1a201"}, + {file = "langchain-0.2.4-py3-none-any.whl", hash = "sha256:a04813215c30f944df006031e2febde872af8fab628dcee825d969e07b6cd621"}, + {file = "langchain-0.2.4.tar.gz", hash = "sha256:e704b5b06222d5eba2d02c76f891321d1bac8952ed54e093831b2bdabf99dcd5"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.0,<0.3.0" +langchain-core = ">=0.2.6,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" -numpy = ">=1,<2" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" @@ -1621,19 +1625,19 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.5" +version = "0.2.7" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.5-py3-none-any.whl", hash = "sha256:abe5138f22acff23a079ec538be5268bbf97cf023d51987a0dd474d2a16cae3e"}, - {file = "langchain_core-0.2.5.tar.gz", hash = "sha256:4a5c2f56b22396a63ef4790043660e393adbfa6832b978f023ca996a04b8e752"}, + {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, + {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.66,<0.2.0" -packaging = ">=23.2,<24.0" +langsmith = ">=0.1.75,<0.2.0" +packaging = ">=23.2,<25" pydantic = ">=1,<3" PyYAML = ">=5.3" tenacity = ">=8.1.0,<9.0.0" @@ -2173,68 +2177,68 @@ opentelemetry-api = "1.25.0" [[package]] name = "orjson" -version = "3.10.4" +version = "3.10.5" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:afca963f19ca60c7aedadea9979f769139127288dd58ccf3f7c5e8e6dc62cabf"}, - {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b112eff36ba7ccc7a9d6b87e17b9d6bde4312d05e3ddf66bf5662481dee846"}, - {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02b192eaba048b1039eca9a0cef67863bd5623042f5c441889a9957121d97e14"}, - {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:827c3d0e4fc44242c82bfdb1a773235b8c0575afee99a9fa9a8ce920c14e440f"}, - {file = "orjson-3.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca8ec09724f10ec209244caeb1f9f428b6bb03f2eda9ed5e2c4dd7f2b7fabd44"}, - {file = "orjson-3.10.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8eaa5d531a8fde11993cbcb27e9acf7d9c457ba301adccb7fa3a021bfecab46c"}, - {file = "orjson-3.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e112aa7fc4ea67367ec5e86c39a6bb6c5719eddc8f999087b1759e765ddaf2d4"}, - {file = "orjson-3.10.4-cp310-none-win32.whl", hash = "sha256:1538844fb88446c42da3889f8c4ecce95a630b5a5ba18ecdfe5aea596f4dff21"}, - {file = "orjson-3.10.4-cp310-none-win_amd64.whl", hash = "sha256:de02811903a2e434127fba5389c3cc90f689542339a6e52e691ab7f693407b5a"}, - {file = "orjson-3.10.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:358afaec75de7237dfea08e6b1b25d226e33a1e3b6dc154fc99eb697f24a1ffa"}, - {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb4e292c3198ab3d93e5f877301d2746be4ca0ba2d9c513da5e10eb90e19ff52"}, - {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c39e57cf6323a39238490092985d5d198a7da4a3be013cc891a33fef13a536e"}, - {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f86df433fc01361ff9270ad27455ce1ad43cd05e46de7152ca6adb405a16b2f6"}, - {file = "orjson-3.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c9966276a2c97e93e6cbe8286537f88b2a071827514f0d9d47a0aefa77db458"}, - {file = "orjson-3.10.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c499a14155a1f5a1e16e0cd31f6cf6f93965ac60a0822bc8340e7e2d3dac1108"}, - {file = "orjson-3.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3087023ce904a327c29487eb7e1f2c060070e8dbb9a3991b8e7952a9c6e62f38"}, - {file = "orjson-3.10.4-cp311-none-win32.whl", hash = "sha256:f965893244fe348b59e5ce560693e6dd03368d577ce26849b5d261ce31c70101"}, - {file = "orjson-3.10.4-cp311-none-win_amd64.whl", hash = "sha256:c212f06fad6aa6ce85d5665e91a83b866579f29441a47d3865c57329c0857357"}, - {file = "orjson-3.10.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d0965a8b0131959833ca8a65af60285995d57ced0de2fd8f16fc03235975d238"}, - {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27b64695d9f2aef3ae15a0522e370ec95c946aaea7f2c97a1582a62b3bdd9169"}, - {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:867d882ddee6a20be4c8b03ae3d2b0333894d53ad632d32bd9b8123649577171"}, - {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0667458f8a8ceb6dee5c08fec0b46195f92c474cbbec71dca2a6b7fd5b67b8d"}, - {file = "orjson-3.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3eac9befc4eaec1d1ff3bba6210576be4945332dde194525601c5ddb5c060d3"}, - {file = "orjson-3.10.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4343245443552eae240a33047a6d1bcac7a754ad4b1c57318173c54d7efb9aea"}, - {file = "orjson-3.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30153e269eea43e98918d4d462a36a7065031d9246407dfff2579a4e457515c1"}, - {file = "orjson-3.10.4-cp312-none-win32.whl", hash = "sha256:1a7d092ee043abf3db19c2183115e80676495c9911843fdb3ebd48ca7b73079e"}, - {file = "orjson-3.10.4-cp312-none-win_amd64.whl", hash = "sha256:07a2adbeb8b9efe6d68fc557685954a1f19d9e33f5cc018ae1a89e96647c1b65"}, - {file = "orjson-3.10.4-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f5a746f3d908bce1a1e347b9ca89864047533bdfab5a450066a0315f6566527b"}, - {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:465b4a8a3e459f8d304c19071b4badaa9b267c59207a005a7dd9dfe13d3a423f"}, - {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35858d260728c434a3d91b60685ab32418318567e8902039837e1c2af2719e0b"}, - {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a5ba090d40c4460312dd69c232b38c2ff67a823185cfe667e841c9dd5c06841"}, - {file = "orjson-3.10.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dde86755d064664e62e3612a166c28298aa8dfd35a991553faa58855ae739cc"}, - {file = "orjson-3.10.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:020a9e9001cfec85c156ef3b185ff758b62ef986cefdb8384c4579facd5ce126"}, - {file = "orjson-3.10.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3bf8e6e3388a2e83a86466c912387e0f0a765494c65caa7e865f99969b76ba0d"}, - {file = "orjson-3.10.4-cp38-none-win32.whl", hash = "sha256:c5a1cca6a4a3129db3da68a25dc0a459a62ae58e284e363b35ab304202d9ba9e"}, - {file = "orjson-3.10.4-cp38-none-win_amd64.whl", hash = "sha256:ecd97d98d7bee3e3d51d0b51c92c457f05db4993329eea7c69764f9820e27eb3"}, - {file = "orjson-3.10.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:71362daa330a2fc85553a1469185ac448547392a8f83d34e67779f8df3a52743"}, - {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d24b59d1fecb0fd080c177306118a143f7322335309640c55ed9580d2044e363"}, - {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e906670aea5a605b083ebb58d575c35e88cf880fa372f7cedaac3d51e98ff164"}, - {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ce32ed4bc4d632268e4978e595fe5ea07e026b751482b4a0feec48f66a90abc"}, - {file = "orjson-3.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dcd34286246e0c5edd0e230d1da2daab2c1b465fcb6bac85b8d44057229d40a"}, - {file = "orjson-3.10.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c45d4b8c403e50beedb1d006a8916d9910ed56bceaf2035dc253618b44d0a161"}, - {file = "orjson-3.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:aaed3253041b5002a4f5bfdf6f7b5cce657d974472b0699a469d439beba40381"}, - {file = "orjson-3.10.4-cp39-none-win32.whl", hash = "sha256:9a4f41b7dbf7896f8dbf559b9b43dcd99e31e0d49ac1b59d74f52ce51ab10eb9"}, - {file = "orjson-3.10.4-cp39-none-win_amd64.whl", hash = "sha256:6c4eb7d867ed91cb61e6514cb4f457aa01d7b0fd663089df60a69f3d38b69d4c"}, - {file = "orjson-3.10.4.tar.gz", hash = "sha256:c912ed25b787c73fe994a5decd81c3f3b256599b8a87d410d799d5d52013af2a"}, + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, ] [[package]] name = "packaging" -version = "23.2" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -2741,6 +2745,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2748,8 +2753,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2766,6 +2779,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2773,6 +2787,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, diff --git a/pyproject.toml b/pyproject.toml index b613eb7bfa..835e92bef5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.112a0" +version = "0.1.112" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From e27711adcae75a7b54671ce114d33fede4753c3f Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 14 Jun 2024 17:28:41 -0700 Subject: [PATCH 077/148] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c0faea62ae..ff27689007 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ We'd love to talk to you on [Discord](https://discord.gg/NaU4mMgcnC) about new i # 🚀 Quickstart ```bash -pip install 'vocode' +pip install vocode ``` ```python From b44134cfc1e60607d7f7b5808fe5ab2efacb77de Mon Sep 17 00:00:00 2001 From: rjheeta Date: Sun, 16 Jun 2024 13:37:32 -0400 Subject: [PATCH 078/148] extend transfer call to optionally pass the phone number dynamically (#561) * extend transfer call to optionally pass the phone number dynamically * fixed linting errors and improved abstraction with get_phone_number * fixed the transfer_call tests to work with new changes --- tests/streaming/action/test_transfer_call.py | 8 ++-- vocode/streaming/action/transfer_call.py | 48 ++++++++++++++++---- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/tests/streaming/action/test_transfer_call.py b/tests/streaming/action/test_transfer_call.py index 59c6ea35ce..afa3f932f0 100644 --- a/tests/streaming/action/test_transfer_call.py +++ b/tests/streaming/action/test_transfer_call.py @@ -9,7 +9,7 @@ from tests.fakedata.id import generate_uuid from vocode.streaming.action.transfer_call import ( - TransferCallParameters, + TransferCallEmptyParameters, TransferCallVocodeActionConfig, TwilioTransferCall, VonageTransferCall, @@ -95,7 +95,7 @@ async def test_twilio_transfer_call_succeeds( action_input = TwilioPhoneConversationActionInput( action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), conversation_id=conversation_id, - params=TransferCallParameters(), + params=TransferCallEmptyParameters(), twilio_sid=twilio_sid, user_message_tracker=user_message_tracker, ) @@ -155,7 +155,7 @@ async def test_twilio_transfer_call_fails_if_interrupted( action_input = TwilioPhoneConversationActionInput( action_config=TransferCallVocodeActionConfig(phone_number=TRANSFER_PHONE_NUMBER), conversation_id=conversation_id, - params=TransferCallParameters(), + params=TransferCallEmptyParameters(), twilio_sid="twilio_sid", user_message_tracker=user_message_tracker, ) @@ -202,7 +202,7 @@ async def test_vonage_transfer_call_inbound( action_input = VonagePhoneConversationActionInput( action_config=TransferCallVocodeActionConfig(phone_number=transfer_phone_number), conversation_id=conversation_id, - params=TransferCallParameters(), + params=TransferCallEmptyParameters(), vonage_uuid=str(vonage_uuid), user_message_tracker=user_message_tracker, ) diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index f78fcea654..48500ae97f 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -1,7 +1,7 @@ -from typing import Literal, Type +from typing import Literal, Type, Optional, Union, get_args from loguru import logger -from pydantic.v1 import BaseModel +from pydantic.v1 import BaseModel, Field from vocode.streaming.action.phone_call_action import ( TwilioPhoneConversationAction, @@ -17,19 +17,35 @@ ) -class TransferCallParameters(BaseModel): +class TransferCallEmptyParameters(BaseModel): pass +class TransferCallRequiredParameters(BaseModel): + phone_number: str = Field(..., description="The phone number to transfer the call to") + + +TransferCallParameters = Union[TransferCallEmptyParameters, TransferCallRequiredParameters] + + class TransferCallResponse(BaseModel): success: bool class TransferCallVocodeActionConfig(VocodeActionConfig, type="action_transfer_call"): # type: ignore - phone_number: str + phone_number: Optional[str] = Field(None, description="The phone number to transfer the call to") + + def get_phone_number(self, input: ActionInput) -> str: + if isinstance(input.params, TransferCallRequiredParameters): + return input.params.phone_number + elif isinstance(input.params, TransferCallEmptyParameters): + assert self.phone_number, "phone number must be set" + return self.phone_number + else: + raise TypeError("Invalid input params type") def action_attempt_to_string(self, input: ActionInput) -> str: - assert isinstance(input.params, TransferCallParameters) + assert isinstance(input.params, get_args(TransferCallParameters)) return f"Attempting to transfer call to {self.phone_number}" def action_result_to_string(self, input: ActionInput, output: ActionOutput) -> str: @@ -53,10 +69,16 @@ class TwilioTransferCall( ] ): description: str = FUNCTION_DESCRIPTION - parameters_type: Type[TransferCallParameters] = TransferCallParameters response_type: Type[TransferCallResponse] = TransferCallResponse conversation_state_manager: TwilioPhoneConversationStateManager + @property + def parameters_type(self) -> Type[TransferCallParameters]: + if self.action_config.phone_number: + return TransferCallEmptyParameters + else: + return TransferCallRequiredParameters + def __init__( self, action_config: TransferCallVocodeActionConfig, @@ -93,7 +115,8 @@ async def run( ) -> ActionOutput[TransferCallResponse]: twilio_call_sid = self.get_twilio_sid(action_input) - sanitized_phone_number = sanitize_phone_number(self.action_config.phone_number) + phone_number = self.action_config.get_phone_number(action_input) + sanitized_phone_number = sanitize_phone_number(phone_number) if action_input.user_message_tracker is not None: await action_input.user_message_tracker.wait() @@ -121,10 +144,16 @@ class VonageTransferCall( ] ): description: str = FUNCTION_DESCRIPTION - parameters_type: Type[TransferCallParameters] = TransferCallParameters response_type: Type[TransferCallResponse] = TransferCallResponse conversation_state_manager: VonagePhoneConversationStateManager + @property + def parameters_type(self) -> Type[TransferCallParameters]: + if self.action_config.phone_number: + return TransferCallEmptyParameters + else: + return TransferCallRequiredParameters + def __init__(self, action_config: TransferCallVocodeActionConfig): super().__init__( action_config, @@ -140,7 +169,8 @@ async def run( await action_input.user_message_tracker.wait() self.conversation_state_manager.mute_agent() - sanitized_phone_number = sanitize_phone_number(self.action_config.phone_number) + phone_number = self.action_config.get_phone_number(action_input) + sanitized_phone_number = sanitize_phone_number(phone_number) if self.conversation_state_manager.get_direction() == "outbound": agent_phone_number = self.conversation_state_manager.get_from_phone() From d854abf18887d65df20ee58fd9e48fd3f384badd Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Mon, 17 Jun 2024 09:32:01 -0700 Subject: [PATCH 079/148] Langchain agent with custom chains (#559) * langchain agent with factory and custom chains (#22) * update poetry.lock --- poetry.lock | 438 +++++++++++++++++++++- pyproject.toml | 15 +- vocode/streaming/agent/anthropic_utils.py | 9 + vocode/streaming/agent/langchain_agent.py | 133 +++++++ vocode/streaming/models/agent.py | 8 + 5 files changed, 585 insertions(+), 18 deletions(-) create mode 100644 vocode/streaming/agent/langchain_agent.py diff --git a/poetry.lock b/poetry.lock index dc2856dc5d..2d6cf8ea24 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -655,6 +655,17 @@ files = [ marshmallow = ">=3.18.0,<4.0.0" typing-inspect = ">=0.4.0,<1" +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + [[package]] name = "deprecated" version = "1.2.14" @@ -703,6 +714,17 @@ idna = ["idna (>=3.6)"] trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] +[[package]] +name = "docstring-parser" +version = "0.16" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = true +python-versions = ">=3.6,<4.0" +files = [ + {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, + {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, +] + [[package]] name = "elevenlabs" version = "1.3.0" @@ -1012,6 +1034,120 @@ pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] +[[package]] +name = "google-cloud-aiplatform" +version = "1.55.0" +description = "Vertex AI API client library" +optional = true +python-versions = ">=3.8" +files = [ + {file = "google-cloud-aiplatform-1.55.0.tar.gz", hash = "sha256:aa87cb6c49ae5fde87fb831ce8ad4a853c4656fe04babe505e9144c7a9e09c1a"}, + {file = "google_cloud_aiplatform-1.55.0-py2.py3-none-any.whl", hash = "sha256:c6cc76ca5537f4636a0c3f8c0288d2e0d2d86ef708e562d2654313e11d6ee46a"}, +] + +[package.dependencies] +docstring-parser = "<1" +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.8.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0dev" +google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" +google-cloud-storage = ">=1.32.0,<3.0.0dev" +packaging = ">=14.3" +proto-plus = ">=1.22.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +pydantic = "<3" +shapely = "<3.0.0dev" + +[package.extras] +autologging = ["mlflow (>=1.27.0,<=2.1.1)"] +cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)"] +endpoint = ["requests (>=2.28.1)"] +full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] +langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] +langchain-testing = ["absl-py", "cloudpickle (>=2.2.1,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist"] +lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] +metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] +pipelines = ["pyyaml (>=5.3.1,<7)"] +prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.109.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] +preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)"] +private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] +rapid-evaluation = ["nest-asyncio (>=1.0.0,<1.6.0)", "pandas (>=1.0.0,<2.2.0)"] +ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "setuptools (<70.0.0)"] +ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] +reasoningengine = ["cloudpickle (>=2.2.1,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] +tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] +testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +vizier = ["google-vizier (>=0.1.6)"] +xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] + +[[package]] +name = "google-cloud-bigquery" +version = "3.24.0" +description = "Google BigQuery API client library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-3.24.0.tar.gz", hash = "sha256:e95e6f6e0aa32e6c453d44e2b3298931fdd7947c309ea329a31b6ff1f939e17e"}, + {file = "google_cloud_bigquery-3.24.0-py2.py3-none-any.whl", hash = "sha256:bc08323ce99dee4e811b7c3d0cde8929f5bf0b1aeaed6bcd75fc89796dd87652"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<3.0.0dev" +google-cloud-core = ">=1.6.0,<3.0.0dev" +google-resumable-media = ">=0.6.0,<3.0dev" +packaging = ">=20.0.0" +python-dateutil = ">=2.7.2,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" + +[package.extras] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "importlib-metadata (>=1.0.0)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bigquery-v2 = ["proto-plus (>=1.15.0,<2.0.0dev)", "protobuf (>=3.19.5,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "importlib-metadata (>=1.0.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] +tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] + +[[package]] +name = "google-cloud-core" +version = "2.4.1" +description = "Google Cloud API client core library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, + {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] + +[[package]] +name = "google-cloud-resource-manager" +version = "1.12.3" +description = "Google Cloud Resource Manager API client library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-cloud-resource-manager-1.12.3.tar.gz", hash = "sha256:809851824119834e4f2310b2c4f38621c1d16b2bb14d5b9f132e69c79d355e7f"}, + {file = "google_cloud_resource_manager-1.12.3-py2.py3-none-any.whl", hash = "sha256:92be7d6959927b76d90eafc4028985c37975a46ded5466a018f02e8649e113d4"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" + [[package]] name = "google-cloud-speech" version = "2.26.0" @@ -1029,6 +1165,28 @@ google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +[[package]] +name = "google-cloud-storage" +version = "2.17.0" +description = "Google Cloud Storage API client library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-cloud-storage-2.17.0.tar.gz", hash = "sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388"}, + {file = "google_cloud_storage-2.17.0-py2.py3-none-any.whl", hash = "sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1"}, +] + +[package.dependencies] +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<5.0.0dev)"] + [[package]] name = "google-cloud-texttospeech" version = "2.16.3" @@ -1046,6 +1204,104 @@ google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +[[package]] +name = "google-crc32c" +version = "1.5.0" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.7.1" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = true +python-versions = ">=3.7" +files = [ + {file = "google-resumable-media-2.7.1.tar.gz", hash = "sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33"}, + {file = "google_resumable_media-2.7.1-py2.py3-none-any.whl", hash = "sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c"}, +] + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + [[package]] name = "googleapis-common-protos" version = "1.63.1" @@ -1058,6 +1314,7 @@ files = [ ] [package.dependencies] +grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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] @@ -1134,6 +1391,22 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "grpc-google-iam-v1" +version = "0.13.0" +description = "IAM API client library" +optional = true +python-versions = ">=3.7" +files = [ + {file = "grpc-google-iam-v1-0.13.0.tar.gz", hash = "sha256:fad318608b9e093258fbf12529180f400d1c44453698a33509cc6ecf005b294e"}, + {file = "grpc_google_iam_v1-0.13.0-py2.py3-none-any.whl", hash = "sha256:53902e2af7de8df8c1bd91373d9be55b0743ec267a7428ea638db3775becae89"}, +] + +[package.dependencies] +googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} +grpcio = ">=1.44.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0dev" + [[package]] name = "grpcio" version = "1.64.1" @@ -1575,19 +1848,19 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.4" +version = "0.2.5" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.4-py3-none-any.whl", hash = "sha256:a04813215c30f944df006031e2febde872af8fab628dcee825d969e07b6cd621"}, - {file = "langchain-0.2.4.tar.gz", hash = "sha256:e704b5b06222d5eba2d02c76f891321d1bac8952ed54e093831b2bdabf99dcd5"}, + {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, + {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.6,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ @@ -1600,24 +1873,43 @@ requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" tenacity = ">=8.1.0,<9.0.0" +[[package]] +name = "langchain-anthropic" +version = "0.1.15" +description = "An integration package connecting AnthropicMessages and LangChain" +optional = true +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_anthropic-0.1.15-py3-none-any.whl", hash = "sha256:7cceea526f473e4d514f39295dc128eec57da628a4bbb54850d11dda7aa959fc"}, + {file = "langchain_anthropic-0.1.15.tar.gz", hash = "sha256:c5c3c6eaccb11ed99a63886e50873ac21eaf8e9441e0f75c7ae7cd8cdef65155"}, +] + +[package.dependencies] +anthropic = ">=0.28.0,<1" +defusedxml = ">=0.7.1,<0.8.0" +langchain-core = ">=0.2.2rc1,<0.3" + [[package]] name = "langchain-community" -version = "0.2.4" +version = "0.2.5" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.4-py3-none-any.whl", hash = "sha256:8582e9800f4837660dc297cccd2ee1ddc1d8c440d0fe8b64edb07620f0373b0e"}, - {file = "langchain_community-0.2.4.tar.gz", hash = "sha256:2bb6a1a36b8500a564d25d76469c02457b1a7c3afea6d4a609a47c06b993e3e4"}, + {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, + {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.0,<0.3.0" -langchain-core = ">=0.2.0,<0.3.0" +langchain = ">=0.2.5,<0.3.0" +langchain-core = ">=0.2.7,<0.3.0" langsmith = ">=0.1.0,<0.2.0" -numpy = ">=1,<2" +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" @@ -1642,6 +1934,41 @@ pydantic = ">=1,<3" PyYAML = ">=5.3" tenacity = ">=8.1.0,<9.0.0" +[[package]] +name = "langchain-google-vertexai" +version = "1.0.5" +description = "An integration package connecting Google VertexAI and LangChain" +optional = true +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_google_vertexai-1.0.5-py3-none-any.whl", hash = "sha256:38f4a39bf35927d744d0883907c4d4a59eef059e9b36f28bb5c737c2aae6963b"}, + {file = "langchain_google_vertexai-1.0.5.tar.gz", hash = "sha256:50005dc12ff9d66bbbab9e1ab660574b1584eee3e7b5a647dc8a009a94f0c500"}, +] + +[package.dependencies] +google-cloud-aiplatform = ">=1.47.0,<2.0.0" +google-cloud-storage = ">=2.14.0,<3.0.0" +langchain-core = ">=0.2.2,<0.3" + +[package.extras] +anthropic = ["anthropic[vertexai] (>=0.23.0,<1)"] + +[[package]] +name = "langchain-openai" +version = "0.1.8" +description = "An integration package connecting OpenAI and LangChain" +optional = true +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.8-py3-none-any.whl", hash = "sha256:8125c84223e9f43b05defbca64eedbcf362fd78a680de6c25e64f973b34a8063"}, + {file = "langchain_openai-0.1.8.tar.gz", hash = "sha256:a11fcce15def7917c44232abda6baaa63dfc79fe44be1531eea650d39a44cd95"}, +] + +[package.dependencies] +langchain-core = ">=0.2.2,<0.3" +openai = ">=1.26.0,<2.0.0" +tiktoken = ">=0.7,<1" + [[package]] name = "langchain-text-splitters" version = "0.2.1" @@ -2694,6 +3021,20 @@ pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = true +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" version = "1.0.1" @@ -3126,6 +3467,63 @@ starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] +[[package]] +name = "shapely" +version = "2.0.4" +description = "Manipulation and analysis of geometric objects" +optional = true +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f"}, + {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17"}, + {file = "shapely-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd"}, + {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6"}, + {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58"}, + {file = "shapely-2.0.4-cp310-cp310-win32.whl", hash = "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7"}, + {file = "shapely-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7"}, + {file = "shapely-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07"}, + {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47"}, + {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d"}, + {file = "shapely-2.0.4-cp311-cp311-win32.whl", hash = "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879"}, + {file = "shapely-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, + {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, + {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, + {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, + {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, + {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, + {file = "shapely-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b"}, + {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf"}, + {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113"}, + {file = "shapely-2.0.4-cp37-cp37m-win32.whl", hash = "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53"}, + {file = "shapely-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa"}, + {file = "shapely-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e"}, + {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679"}, + {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"}, + {file = "shapely-2.0.4-cp38-cp38-win32.whl", hash = "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7"}, + {file = "shapely-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa"}, + {file = "shapely-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc"}, + {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242"}, + {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc"}, + {file = "shapely-2.0.4-cp39-cp39-win32.whl", hash = "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c"}, + {file = "shapely-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398"}, + {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, +] + +[package.dependencies] +numpy = ">=1.14,<3" + +[package.extras] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + [[package]] name = "shellingham" version = "1.5.4" @@ -3137,6 +3535,17 @@ files = [ {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -4240,8 +4649,9 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke 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)"] [extras] -all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-community", "miniaudio", "nltk", "pvkoala", "pydub", "twilio", "vonage"] -misc = ["langchain", "langchain-community"] +all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "miniaudio", "nltk", "pvkoala", "pydub", "twilio", "vonage"] +langchain = ["langchain", "langchain-community"] +langchain-extras = ["langchain-anthropic", "langchain-google-vertexai", "langchain-openai"] synthesizers = ["cartesia", "google-cloud-texttospeech", "miniaudio", "pvkoala", "pydub"] telephony = ["twilio", "vonage"] transcribers = ["google-cloud-speech"] @@ -4249,4 +4659,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "6a94ac4f14452e6e73f6d5984455bf7935a15f6812dfe6214a38ebd1be30adb9" +content-hash = "4c4b13856a4fa064b4a38e929d5beccd8dde7ded344a8a352527c85149a547dd" diff --git a/pyproject.toml b/pyproject.toml index 835e92bef5..d9af386d20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,9 +49,12 @@ google-cloud-speech = { version = "^2.26.0", optional = true } twilio = { version = "^9.1.0", optional = true } vonage = { version = "^3.14.0", optional = true } -# Misc -langchain = { version = "^0.2.1", optional = true } -langchain-community = { version = "^0.2.1", optional = true } +# Langchain +langchain = { version = "^0.2.3", optional = true } +langchain-community = { version = "^0.2.4", optional = true } +langchain-openai = { version = "^0.1.8", optional = true } +langchain-anthropic = { version = "^0.1.15", optional = true } +langchain-google-vertexai = { version = "^1.0.5", optional = true } [tool.poetry.group.lint.dependencies] @@ -86,7 +89,8 @@ synthesizers = [ ] transcribers = ["google-cloud-speech"] telephony = ["twilio", "vonage"] -misc = ["langchain", "langchain-community"] +langchain = ["langchain", "langchain-community"] +langchain-extras = ["langchain-openai", "langchain-anthropic", "langchain-google-vertexai"] all = [ "google-cloud-texttospeech", "miniaudio", @@ -98,6 +102,9 @@ all = [ "vonage", "langchain", "langchain-community", + "langchain-openai", + "langchain-anthropic", + "langchain-google-vertexai", "cartesia" ] diff --git a/vocode/streaming/agent/anthropic_utils.py b/vocode/streaming/agent/anthropic_utils.py index 2a2e131d2d..54cefa972c 100644 --- a/vocode/streaming/agent/anthropic_utils.py +++ b/vocode/streaming/agent/anthropic_utils.py @@ -27,3 +27,12 @@ def format_anthropic_chat_messages_from_transcript( {"role": "assistant", "content": "BOT:"}, ] # TODO: reliably count tokens of Anthropic messages so that we don't exceed the context window + +def merge_bot_messages_for_langchain(messages: list[tuple]) -> list[tuple]: + merged_messages: list[tuple] = [] + for role, message in messages: + if role == "ai" and merged_messages and merged_messages[-1][0] == "ai": + merged_messages[-1] = ("ai", merged_messages[-1][1] + message) + else: + merged_messages.append((role, message)) + return merged_messages \ No newline at end of file diff --git a/vocode/streaming/agent/langchain_agent.py b/vocode/streaming/agent/langchain_agent.py new file mode 100644 index 0000000000..9daa426caa --- /dev/null +++ b/vocode/streaming/agent/langchain_agent.py @@ -0,0 +1,133 @@ +from typing import AsyncGenerator, AsyncIterator, Optional + +import sentry_sdk +from loguru import logger + +from langchain_core.messages.base import BaseMessage as LangchainBaseMessage +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables.base import Runnable +from langchain.chat_models import init_chat_model + +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.default_factory import DefaultActionFactory +from vocode.streaming.agent.anthropic_utils import merge_bot_messages_for_langchain +from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent, StreamedResponse +from vocode.streaming.agent.streaming_utils import collate_response_async, stream_response_async +from vocode.streaming.models.agent import LangchainAgentConfig +from vocode.streaming.models.events import Sender +from vocode.streaming.models.message import BaseMessage, LLMToken +from vocode.streaming.models.transcript import Message +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span + + +class LangchainAgent(RespondAgent[LangchainAgentConfig]): + + def __init__( + self, + agent_config: LangchainAgentConfig, + action_factory: AbstractActionFactory = DefaultActionFactory(), + chain: Optional[Runnable] = None, + **kwargs, + ): + super().__init__( + agent_config=agent_config, + action_factory=action_factory, + **kwargs, + ) + self.chain = chain if chain else self.create_chain() + + def create_chain(self): + model = init_chat_model(model = self.agent_config.model_name, model_provider=self.agent_config.provider, temperature=self.agent_config.temperature, max_tokens=self.agent_config.max_tokens) + messages_for_prompt_template = [ + ("placeholder", "{chat_history}") + ] + if self.agent_config.prompt_preamble: + messages_for_prompt_template.insert(0, ("system", self.agent_config.prompt_preamble)) + prompt_template = ChatPromptTemplate.from_messages(messages_for_prompt_template) + chain = prompt_template | model + return chain + + async def token_generator( + self, + gen: AsyncIterator[LangchainBaseMessage], + ) -> AsyncGenerator[str, None]: + async for chunk in gen: + if isinstance(chunk.content, str): + yield chunk.content + else: + raise ValueError(f"Received unexpected message type {type(chunk)} from Langchain. Expected str.") + + def format_langchain_messages_from_transcript(self) -> list[tuple]: + if not self.transcript: + raise ValueError("A transcript is not attached to the agent") + messages = [] + for event_log in self.transcript.event_logs: + if isinstance(event_log, Message): + messages.append( + ("ai" if event_log.sender == Sender.BOT else "human", event_log.to_string(include_sender=False)) + ) + else: + raise ValueError(f"Invalid event log type {type(event_log)}. Langchain currently only supports human and bot messages") + + if self.agent_config.provider == "anthropic": + messages = merge_bot_messages_for_langchain(messages) + + return messages + + async def generate_response( + self, + human_input, + conversation_id: str, + is_interrupt: bool = False, + bot_was_in_medias_res: bool = False, + ) -> AsyncGenerator[GeneratedResponse, None]: + if not self.transcript: + raise ValueError("A transcript is not attached to the agent") + try: + first_sentence_total_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.LLM_FIRST_SENTENCE_TOTAL + ) + + ttft_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.TIME_TO_FIRST_TOKEN + ) + stream = self.chain.astream({"chat_history": self.format_langchain_messages_from_transcript()}) + except Exception as e: + logger.error( + f"Error while hitting Langchain", + exc_info=True, + ) + raise e + + response_generator = collate_response_async + + using_input_streaming_synthesizer = ( + self.conversation_state_manager.using_input_streaming_synthesizer() + ) + if using_input_streaming_synthesizer: + response_generator = stream_response_async + async for message in response_generator( + conversation_id=conversation_id, + gen=self.token_generator( + stream, + ), + sentry_span=ttft_span, + ): + if first_sentence_total_span: + first_sentence_total_span.finish() + + ResponseClass = ( + StreamedResponse if using_input_streaming_synthesizer else GeneratedResponse + ) + MessageType = LLMToken if using_input_streaming_synthesizer else BaseMessage + + if isinstance(message, str): + yield ResponseClass( + message=MessageType(text=message), + is_interruptible=True, + ) + else: + yield ResponseClass( + message=message, + is_interruptible=True, + ) diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index 7e5a3e6bae..26e5165f1b 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -48,6 +48,7 @@ class AgentType(str, Enum): RESTFUL_USER_IMPLEMENTED = "agent_restful_user_implemented" WEBSOCKET_USER_IMPLEMENTED = "agent_websocket_user_implemented" ACTION = "agent_action" + LANGCHAIN = "agent_langchain" class FillerAudioConfig(BaseModel): @@ -130,6 +131,13 @@ class AnthropicAgentConfig(AgentConfig, type=AgentType.ANTHROPIC.value): # type model_name: str = CHAT_ANTHROPIC_DEFAULT_MODEL_NAME max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE + +class LangchainAgentConfig(AgentConfig, type=AgentType.LANGCHAIN.value): # type: ignore + prompt_preamble: str + model_name: str + provider: str + temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE + max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS class ChatVertexAIAgentConfig(AgentConfig, type=AgentType.CHAT_VERTEX_AI.value): # type: ignore From 286b6e71b5e03c6442230bc619d1766f4244cd8d Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 17 Jun 2024 16:34:36 -0700 Subject: [PATCH 080/148] fix barebones deps (#563) * fix barebones deps * remove prints * restore support for azure on docker * fix quickstarts and bump to 0.1.113 --- README.md | 1 + apps/client_backend/README.md | 29 +- apps/client_backend/poetry.lock | 854 +---------------- apps/client_backend/pyproject.toml | 4 +- apps/telephony_app/poetry.lock | 874 +----------------- apps/telephony_app/pyproject.toml | 4 +- docs/open-source/python-quickstart.mdx | 1 + docs/open-source/react-quickstart.mdx | 16 +- docs/open-source/telephony.mdx | 2 - poetry.lock | 54 +- pyproject.toml | 13 +- quickstarts/streaming_conversation.py | 1 + quickstarts/turn_based_conversation.py | 5 +- .../conversation/vonage_phone_conversation.py | 3 +- vocode/turn_based/agent/chat_gpt_agent.py | 6 +- .../transcriber/whisper_transcriber.py | 6 +- 16 files changed, 127 insertions(+), 1746 deletions(-) diff --git a/README.md b/README.md index ff27689007..316918fd43 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", + extra="ignore", ) diff --git a/apps/client_backend/README.md b/apps/client_backend/README.md index 29324ea4f9..caefd280d1 100644 --- a/apps/client_backend/README.md +++ b/apps/client_backend/README.md @@ -1,9 +1,34 @@ # client_backend +## Docker + +1. Set up the configuration for your agent in `main.py`. +2. Set up an .env file using the template + +``` +cp .env.template .env +``` + +Fill in your API keys into .env + +3. Build the Docker image + +```bash +docker build -t vocode-client-backend . +``` + +4. Run the image and forward the port. + +```bash +docker run --env-file=.env -p 3000:3000 -t vocode-client-backend +``` + +Now you have a client backend hosted at localhost:3000 to pass into the Vocode React SDK. You'll likely need to tunnel port 3000 to ngrok / host your server in order to use it in the React SDK. + +## Non-docker setup + `main.py` just sets up a FastAPI server, so you can just run it with uvicorn: ``` uvicorn main:app ``` - -Note: building this with Docker is currently broken in 0.1.112 - we're planning an overhaul here, stay tuned! diff --git a/apps/client_backend/poetry.lock b/apps/client_backend/poetry.lock index 924292092a..88921cd39a 100644 --- a/apps/client_backend/poetry.lock +++ b/apps/client_backend/poetry.lock @@ -95,20 +95,6 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns", "brotlicffi"] -[[package]] -name = "aiohttp-retry" -version = "2.8.3" -description = "Simple retry client for aiohttp" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiohttp_retry-2.8.3-py3-none-any.whl", hash = "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45"}, - {file = "aiohttp_retry-2.8.3.tar.gz", hash = "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9"}, -] - -[package.dependencies] -aiohttp = "*" - [[package]] name = "aiosignal" version = "1.3.1" @@ -224,39 +210,6 @@ files = [ {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, ] -[[package]] -name = "cachetools" -version = "5.3.3" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, -] - -[[package]] -name = "cartesia" -version = "0.1.1" -description = "The official Python library for the Cartesia API." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, - {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, -] - -[package.dependencies] -aiohttp = "*" -httpx = "*" -pytest-asyncio = "*" -requests = "*" -websockets = "*" - -[package.extras] -all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] -dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] - [[package]] name = "certifi" version = "2024.6.2" @@ -456,75 +409,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "cryptography" -version = "42.0.8" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "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 = "deprecated" version = "1.2.14" @@ -575,13 +459,13 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "elevenlabs" -version = "1.3.0" +version = "1.3.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, - {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, + {file = "elevenlabs-1.3.1-py3-none-any.whl", hash = "sha256:96cb48d3527393b0f56fb9c6a26ad6520e2999a4c1ac9ca2b525ab7a26ea7342"}, + {file = "elevenlabs-1.3.1.tar.gz", hash = "sha256:23df9b48960bc1d48b9fe13a5dad74144a83ce5ed83708dd7dcf6180f44ce697"}, ] [package.dependencies] @@ -593,13 +477,13 @@ websockets = ">=11.0" [[package]] name = "email-validator" -version = "2.1.1" +version = "2.1.2" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.1.2-py3-none-any.whl", hash = "sha256:d89f6324e13b1e39889eab7f9ca2f91dc9aebb6fa50a6d8bd4329ab50f251115"}, + {file = "email_validator-2.1.2.tar.gz", hash = "sha256:14c0f3d343c4beda37400421b39fa411bbe33a75df20825df73ad53e06a9f04c"}, ] [package.dependencies] @@ -791,176 +675,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 = "google-api-core" -version = "2.19.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} -grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-auth" -version = "2.30.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-cloud-speech" -version = "2.26.0" -description = "Google Cloud Speech API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, - {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - -[[package]] -name = "google-cloud-texttospeech" -version = "2.16.3" -description = "Google Cloud Texttospeech API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, - {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - -[[package]] -name = "googleapis-common-protos" -version = "1.63.1" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, -] - -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - [[package]] name = "grpcio" version = "1.64.1" @@ -1019,22 +733,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.64.1)"] -[[package]] -name = "grpcio-status" -version = "1.62.2" -description = "Status proto mapping for gRPC" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, - {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.2" -protobuf = ">=4.21.6" - [[package]] name = "h11" version = "0.14.0" @@ -1203,17 +901,6 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "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" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - [[package]] name = "janus" version = "1.0.0" @@ -1326,31 +1013,6 @@ files = [ {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - [[package]] name = "jsonschema" version = "4.22.0" @@ -1386,104 +1048,6 @@ files = [ [package.dependencies] referencing = ">=0.31.0" -[[package]] -name = "langchain" -version = "0.2.5" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, - {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -langchain-core = ">=0.2.7,<0.3.0" -langchain-text-splitters = ">=0.2.0,<0.3.0" -langsmith = ">=0.1.17,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} -pydantic = ">=1,<3" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-community" -version = "0.2.5" -description = "Community contributed LangChain integrations." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, - {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.5,<0.3.0" -langchain-core = ">=0.2.7,<0.3.0" -langsmith = ">=0.1.0,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-core" -version = "0.2.7" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, - {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, -] - -[package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.75,<0.2.0" -packaging = ">=23.2,<25" -pydantic = ">=1,<3" -PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-text-splitters" -version = "0.2.1" -description = "LangChain text splitting utilities" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, - {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, -] - -[package.dependencies] -langchain-core = ">=0.2.0,<0.3.0" - -[package.extras] -extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] - -[[package]] -name = "langsmith" -version = "0.1.77" -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.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, - {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, -] - -[package.dependencies] -orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" -requests = ">=2,<3" - [[package]] name = "loguru" version = "0.7.2" @@ -1595,25 +1159,6 @@ 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" @@ -1788,17 +1333,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[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 = "nltk" version = "3.8.1" @@ -2005,47 +1539,15 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.38" +version = "8.13.39" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, - {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "proto-plus" -version = "1.23.0" -description = "Beautiful, Pythonic protocol buffers." -optional = false -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, + {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, + {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, ] -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - [[package]] name = "protobuf" version = "4.25.3" @@ -2066,42 +1568,6 @@ files = [ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] -[[package]] -name = "pvkoala" -version = "2.0.1" -description = "Koala Noise Suppression Engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pvkoala-2.0.1-py3-none-any.whl", hash = "sha256:8b153e076b4d14adccdcb4d800aa84e8d2f91e0640b959677582d3128cbcb249"}, - {file = "pvkoala-2.0.1.tar.gz", hash = "sha256:5e017c671fc1338d42dc20f9dee003d0144bbba1757b6f1fcd6272c5308da242"}, -] - -[[package]] -name = "pyasn1" -version = "0.6.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.0" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.7.0" - [[package]] name = "pycparser" version = "2.22" @@ -2284,64 +1750,6 @@ grpcio = ">=1.58.0,<2.0.0" protobuf = ">=4.24.3,<5.0.0" requests = ">=2.31.0,<3.0.0" -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.dependencies] -cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pytest" -version = "8.2.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2.0" - -[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.7" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, - {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, -] - -[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 = "python-dotenv" version = "1.0.1" @@ -2370,17 +1778,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 = "pyyaml" version = "6.0.1" @@ -2709,20 +2106,6 @@ files = [ {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "sentry-sdk" version = "2.5.1" @@ -2816,93 +2199,6 @@ CFFI = ">=1.0" [package.extras] numpy = ["NumPy"] -[[package]] -name = "sqlalchemy" -version = "2.0.30" -description = "Database Abstraction Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.6.0" - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] - [[package]] name = "starlette" version = "0.37.2" @@ -2920,21 +2216,6 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] -[[package]] -name = "tenacity" -version = "8.3.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - [[package]] name = "tiktoken" version = "0.7.0" @@ -3124,23 +2405,6 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "twilio" -version = "9.1.1" -description = "Twilio API client and TwiML generator" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, - {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, -] - -[package.dependencies] -aiohttp = ">=3.8.4" -aiohttp-retry = ">=2.8.3" -PyJWT = ">=2.0.0,<3.0.0" -requests = ">=2.0.0" - [[package]] name = "typer" version = "0.12.3" @@ -3169,21 +2433,6 @@ 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 = "ujson" version = "5.10.0" @@ -3273,13 +2522,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -3359,106 +2608,51 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "vocode" -version = "0.1.112" +version = "0.1.113" description = "The all-in-one voice SDK" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "vocode-0.1.112-py3-none-any.whl", hash = "sha256:6efcd1dd2676e1d2f049544e2c6e389f34c59dd2ec05ab2c588d0ea1624b193f"}, - {file = "vocode-0.1.112.tar.gz", hash = "sha256:e5a64d27089d6d7288a082751550f2465b2f1cd5d564f1e271c676c91dcf5b1d"}, + {file = "vocode-0.1.113-py3-none-any.whl", hash = "sha256:7e99a12c74ba09654489d3743e0512bbdc378961f42c143d2705ca4a323a5784"}, + {file = "vocode-0.1.113.tar.gz", hash = "sha256:3e7cb142cea58764bd17d411b973eda9082642a70e56cce5b36a5a9021165451"}, ] [package.dependencies] aiohttp = ">=3.9.5,<4.0.0" anthropic = ">=0.28.0,<0.29.0" -azure-cognitiveservices-speech = ">=1.37.0,<2.0.0" -cartesia = {version = ">=0.1.1,<0.2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +azure-cognitiveservices-speech = ">=1.38.0,<2.0.0" elevenlabs = ">=1.2.2,<2.0.0" fastapi = ">=0.111.0,<0.112.0" -google-cloud-speech = {version = ">=2.26.0,<3.0.0", optional = true, markers = "extra == \"transcribers\" or extra == \"all\""} -google-cloud-texttospeech = {version = ">=2.16.3,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} janus = ">=1.0.0,<2.0.0" jinja2 = ">=3.1.4,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -langchain = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} -langchain-community = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} loguru = ">=0.7.2,<0.8.0" -miniaudio = {version = ">=1.59,<2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} -nltk = {version = ">=3.8.1,<4.0.0", optional = true, markers = "extra == \"all\""} +miniaudio = ">=1.59.0,<2.0.0" +nltk = ">=3.8.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openai = ">=1.30.5,<2.0.0" opentelemetry-sdk = ">=1.24.0,<2.0.0" phonenumbers = ">=8.13.37,<9.0.0" -pvkoala = {version = ">=2.0.1,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} pydantic = ">=2.7.2,<3.0.0" pydantic-settings = ">=2.3.0,<3.0.0" -pydub = {version = ">=0.25.1,<0.26.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pydub = ">=0.25.1,<0.26.0" pyht = ">=0.0.28,<0.0.29" redis = ">=5.0.4,<6.0.0" requests = ">=2.32.3,<3.0.0" sentry-sdk = {version = ">=2.3.1,<3.0.0", extras = ["fastapi"]} sounddevice = ">=0.4.7,<0.5.0" tiktoken = ">=0.7.0,<0.8.0" -twilio = {version = ">=9.1.0,<10.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} uvicorn = ">=0.30.0,<0.31.0" -vonage = {version = ">=3.14.0,<4.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} websockets = ">=12.0,<13.0" [package.extras] -all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] -misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)"] -synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)"] +all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.3,<0.3.0)", "langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-community (>=0.2.4,<0.3.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)", "pvkoala (>=2.0.1,<3.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +langchain = ["langchain (>=0.2.3,<0.3.0)", "langchain-community (>=0.2.4,<0.3.0)"] +langchain-extras = ["langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)"] +synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "pvkoala (>=2.0.1,<3.0.0)"] telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] -[[package]] -name = "vonage" -version = "3.16.0" -description = "Vonage Server SDK for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, - {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, -] - -[package.dependencies] -Deprecated = "*" -pydantic = ">=2.5.2" -pytz = ">=2018.5" -requests = ">=2.4.2" -vonage-jwt = ">=1.1.0" - -[[package]] -name = "vonage-jwt" -version = "1.1.1" -description = "Tooling for working with JWTs for Vonage APIs in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, - {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, -] - -[package.dependencies] -pyjwt = {version = ">=1.6.4", extras = ["crypto"]} -vonage-utils = ">=1.1.2" - -[[package]] -name = "vonage-utils" -version = "1.1.2" -description = "Utils package containing objects for use with Vonage APIs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, - {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, -] - -[package.dependencies] -pydantic = ">=2.7.1" -typing-extensions = ">=4.9.0" - [[package]] name = "watchfiles" version = "0.22.0" @@ -3841,4 +3035,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.12" -content-hash = "ff98a04f8188e2a35f48409bc0b9d514ec16ad3ac4b88b88dcb2ef578a0ed982" +content-hash = "1475e90b0391e1ead9a47bda035b9f91f5a4df7b2f9d197864b7c47b6cd6801c" diff --git a/apps/client_backend/pyproject.toml b/apps/client_backend/pyproject.toml index 4f2a138931..5f93319a8c 100644 --- a/apps/client_backend/pyproject.toml +++ b/apps/client_backend/pyproject.toml @@ -8,9 +8,7 @@ readme = "README.md" [tool.poetry.dependencies] python = ">=3.11,<3.12" python-dotenv = "^1.0.1" -vocode = { version = "0.1.112", extras = [ - "all", -] } +vocode = "0.1.113" elevenlabs = "^1.2.2" diff --git a/apps/telephony_app/poetry.lock b/apps/telephony_app/poetry.lock index a4f57179bf..cd4f85aef8 100644 --- a/apps/telephony_app/poetry.lock +++ b/apps/telephony_app/poetry.lock @@ -96,20 +96,6 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns", "brotlicffi"] -[[package]] -name = "aiohttp-retry" -version = "2.8.3" -description = "Simple retry client for aiohttp" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiohttp_retry-2.8.3-py3-none-any.whl", hash = "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45"}, - {file = "aiohttp_retry-2.8.3.tar.gz", hash = "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9"}, -] - -[package.dependencies] -aiohttp = "*" - [[package]] name = "aiosignal" version = "1.3.1" @@ -227,39 +213,6 @@ files = [ {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, ] -[[package]] -name = "cachetools" -version = "5.3.3" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, -] - -[[package]] -name = "cartesia" -version = "0.1.1" -description = "The official Python library for the Cartesia API." -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, - {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, -] - -[package.dependencies] -aiohttp = "*" -httpx = "*" -pytest-asyncio = "*" -requests = "*" -websockets = "*" - -[package.extras] -all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] -dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] - [[package]] name = "certifi" version = "2024.6.2" @@ -459,75 +412,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "cryptography" -version = "42.0.8" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "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 = "deprecated" version = "1.2.14" @@ -578,13 +462,13 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "elevenlabs" -version = "1.3.0" +version = "1.3.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, - {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, + {file = "elevenlabs-1.3.1-py3-none-any.whl", hash = "sha256:96cb48d3527393b0f56fb9c6a26ad6520e2999a4c1ac9ca2b525ab7a26ea7342"}, + {file = "elevenlabs-1.3.1.tar.gz", hash = "sha256:23df9b48960bc1d48b9fe13a5dad74144a83ce5ed83708dd7dcf6180f44ce697"}, ] [package.dependencies] @@ -596,13 +480,13 @@ websockets = ">=11.0" [[package]] name = "email-validator" -version = "2.1.1" +version = "2.1.2" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.1.2-py3-none-any.whl", hash = "sha256:d89f6324e13b1e39889eab7f9ca2f91dc9aebb6fa50a6d8bd4329ab50f251115"}, + {file = "email_validator-2.1.2.tar.gz", hash = "sha256:14c0f3d343c4beda37400421b39fa411bbe33a75df20825df73ad53e06a9f04c"}, ] [package.dependencies] @@ -808,182 +692,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 = "google-api-core" -version = "2.19.0" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.dev0" -googleapis-common-protos = ">=1.56.2,<2.0.dev0" -grpcio = [ - {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, - {version = ">=1.33.2,<2.0dev", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, -] -grpcio-status = [ - {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, - {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, -] -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" -requests = ">=2.18.0,<3.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-auth" -version = "2.30.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-cloud-speech" -version = "2.26.0" -description = "Google Cloud Speech API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, - {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - -[[package]] -name = "google-cloud-texttospeech" -version = "2.16.3" -description = "Google Cloud Texttospeech API client library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, - {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, -] - -[package.dependencies] -google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} -google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" -proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" - -[[package]] -name = "googleapis-common-protos" -version = "1.63.1" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, -] - -[package.dependencies] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=3.7" -files = [ - {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, - {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, - {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, - {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, - {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, - {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, - {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, - {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, - {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, - {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, - {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, - {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, - {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, - {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, - {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, - {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, - {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, - {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, - {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, - {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, - {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, - {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, -] - -[package.extras] -docs = ["Sphinx", "furo"] -test = ["objgraph", "psutil"] - [[package]] name = "grpcio" version = "1.64.1" @@ -1042,22 +750,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.64.1)"] -[[package]] -name = "grpcio-status" -version = "1.62.2" -description = "Status proto mapping for gRPC" -optional = false -python-versions = ">=3.6" -files = [ - {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, - {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, -] - -[package.dependencies] -googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.2" -protobuf = ">=4.21.6" - [[package]] name = "h11" version = "0.14.0" @@ -1226,17 +918,6 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link perf = ["ipython"] testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "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" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - [[package]] name = "janus" version = "1.0.0" @@ -1349,31 +1030,6 @@ files = [ {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] -[[package]] -name = "jsonpatch" -version = "1.33" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" -files = [ - {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, - {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, -] - [[package]] name = "jsonschema" version = "4.22.0" @@ -1409,105 +1065,6 @@ files = [ [package.dependencies] referencing = ">=0.31.0" -[[package]] -name = "langchain" -version = "0.2.5" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, - {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.7,<0.3.0" -langchain-text-splitters = ">=0.2.0,<0.3.0" -langsmith = ">=0.1.17,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} -pydantic = ">=1,<3" -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-community" -version = "0.2.5" -description = "Community contributed LangChain integrations." -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, - {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, -] - -[package.dependencies] -aiohttp = ">=3.8.3,<4.0.0" -dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.5,<0.3.0" -langchain-core = ">=0.2.7,<0.3.0" -langsmith = ">=0.1.0,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} -PyYAML = ">=5.3" -requests = ">=2,<3" -SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-core" -version = "0.2.7" -description = "Building applications with LLMs through composability" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, - {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, -] - -[package.dependencies] -jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.75,<0.2.0" -packaging = ">=23.2,<25" -pydantic = ">=1,<3" -PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" - -[[package]] -name = "langchain-text-splitters" -version = "0.2.1" -description = "LangChain text splitting utilities" -optional = false -python-versions = "<4.0,>=3.8.1" -files = [ - {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, - {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, -] - -[package.dependencies] -langchain-core = ">=0.2.0,<0.3.0" - -[package.extras] -extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] - -[[package]] -name = "langsmith" -version = "0.1.77" -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.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, - {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, -] - -[package.dependencies] -orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" -requests = ">=2,<3" - [[package]] name = "loguru" version = "0.7.2" @@ -1619,25 +1176,6 @@ 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" @@ -1812,17 +1350,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[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 = "nltk" version = "3.8.1" @@ -2029,47 +1556,15 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.38" +version = "8.13.39" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, - {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, + {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, + {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, ] -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "proto-plus" -version = "1.23.0" -description = "Beautiful, Pythonic protocol buffers." -optional = false -python-versions = ">=3.6" -files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] - [[package]] name = "protobuf" version = "4.25.3" @@ -2090,42 +1585,6 @@ files = [ {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] -[[package]] -name = "pvkoala" -version = "2.0.1" -description = "Koala Noise Suppression Engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pvkoala-2.0.1-py3-none-any.whl", hash = "sha256:8b153e076b4d14adccdcb4d800aa84e8d2f91e0640b959677582d3128cbcb249"}, - {file = "pvkoala-2.0.1.tar.gz", hash = "sha256:5e017c671fc1338d42dc20f9dee003d0144bbba1757b6f1fcd6272c5308da242"}, -] - -[[package]] -name = "pyasn1" -version = "0.6.0" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, - {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.0" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, - {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.7.0" - [[package]] name = "pycparser" version = "2.22" @@ -2308,26 +1767,6 @@ grpcio = ">=1.58.0,<2.0.0" protobuf = ">=4.24.3,<5.0.0" requests = ">=2.31.0,<3.0.0" -[[package]] -name = "pyjwt" -version = "2.8.0" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, -] - -[package.dependencies] -cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pyngrok" version = "7.1.6" @@ -2346,46 +1785,6 @@ PyYAML = ">=5.1" dev = ["coverage[toml]", "flake8", "flake8-pyproject", "pep8-naming", "psutil"] docs = ["Sphinx", "mypy", "sphinx-autodoc-typehints (==1.25.2)", "sphinx-notfound-page", "sphinx-substitution-extensions", "types-PyYAML"] -[[package]] -name = "pytest" -version = "8.2.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2.0" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} - -[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.7" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, - {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, -] - -[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 = "python-dotenv" version = "1.0.1" @@ -2414,17 +1813,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 = "pyyaml" version = "6.0.1" @@ -2753,20 +2141,6 @@ files = [ {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, ] -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "sentry-sdk" version = "2.5.1" @@ -2860,93 +2234,6 @@ CFFI = ">=1.0" [package.extras] numpy = ["NumPy"] -[[package]] -name = "sqlalchemy" -version = "2.0.30" -description = "Database Abstraction Library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, -] - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} -typing-extensions = ">=4.6.0" - -[package.extras] -aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] -aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] -mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] -mssql = ["pyodbc"] -mssql-pymssql = ["pymssql"] -mssql-pyodbc = ["pyodbc"] -mypy = ["mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0)"] -mysql-connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=8)"] -oracle-oracledb = ["oracledb (>=1.0.1)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] -postgresql-pg8000 = ["pg8000 (>=1.29.1)"] -postgresql-psycopg = ["psycopg (>=3.0.7)"] -postgresql-psycopg2binary = ["psycopg2-binary"] -postgresql-psycopg2cffi = ["psycopg2cffi"] -postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] -pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3_binary"] - [[package]] name = "starlette" version = "0.37.2" @@ -2964,21 +2251,6 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] -[[package]] -name = "tenacity" -version = "8.3.0" -description = "Retry code until it succeeds" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, -] - -[package.extras] -doc = ["reno", "sphinx"] -test = ["pytest", "tornado (>=4.5)", "typeguard"] - [[package]] name = "tiktoken" version = "0.7.0" @@ -3148,17 +2420,6 @@ dev = ["tokenizers[testing]"] docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - [[package]] name = "tqdm" version = "4.66.4" @@ -3179,23 +2440,6 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "twilio" -version = "9.1.1" -description = "Twilio API client and TwiML generator" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, - {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, -] - -[package.dependencies] -aiohttp = ">=3.8.4" -aiohttp-retry = ">=2.8.3" -PyJWT = ">=2.0.0,<3.0.0" -requests = ">=2.0.0" - [[package]] name = "typer" version = "0.12.3" @@ -3224,21 +2468,6 @@ 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 = "ujson" version = "5.10.0" @@ -3328,13 +2557,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -3415,106 +2644,51 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "vocode" -version = "0.1.112" +version = "0.1.113" description = "The all-in-one voice SDK" optional = false python-versions = "<4.0,>=3.10" files = [ - {file = "vocode-0.1.112-py3-none-any.whl", hash = "sha256:6efcd1dd2676e1d2f049544e2c6e389f34c59dd2ec05ab2c588d0ea1624b193f"}, - {file = "vocode-0.1.112.tar.gz", hash = "sha256:e5a64d27089d6d7288a082751550f2465b2f1cd5d564f1e271c676c91dcf5b1d"}, + {file = "vocode-0.1.113-py3-none-any.whl", hash = "sha256:7e99a12c74ba09654489d3743e0512bbdc378961f42c143d2705ca4a323a5784"}, + {file = "vocode-0.1.113.tar.gz", hash = "sha256:3e7cb142cea58764bd17d411b973eda9082642a70e56cce5b36a5a9021165451"}, ] [package.dependencies] aiohttp = ">=3.9.5,<4.0.0" anthropic = ">=0.28.0,<0.29.0" -azure-cognitiveservices-speech = ">=1.37.0,<2.0.0" -cartesia = {version = ">=0.1.1,<0.2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +azure-cognitiveservices-speech = ">=1.38.0,<2.0.0" elevenlabs = ">=1.2.2,<2.0.0" fastapi = ">=0.111.0,<0.112.0" -google-cloud-speech = {version = ">=2.26.0,<3.0.0", optional = true, markers = "extra == \"transcribers\" or extra == \"all\""} -google-cloud-texttospeech = {version = ">=2.16.3,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} janus = ">=1.0.0,<2.0.0" jinja2 = ">=3.1.4,<4.0.0" jsonschema = ">=4.22.0,<5.0.0" -langchain = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} -langchain-community = {version = ">=0.2.1,<0.3.0", optional = true, markers = "extra == \"misc\" or extra == \"all\""} loguru = ">=0.7.2,<0.8.0" -miniaudio = {version = ">=1.59,<2.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} -nltk = {version = ">=3.8.1,<4.0.0", optional = true, markers = "extra == \"all\""} +miniaudio = ">=1.59.0,<2.0.0" +nltk = ">=3.8.1,<4.0.0" numpy = ">=1.26.4,<2.0.0" openai = ">=1.30.5,<2.0.0" opentelemetry-sdk = ">=1.24.0,<2.0.0" phonenumbers = ">=8.13.37,<9.0.0" -pvkoala = {version = ">=2.0.1,<3.0.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} pydantic = ">=2.7.2,<3.0.0" pydantic-settings = ">=2.3.0,<3.0.0" -pydub = {version = ">=0.25.1,<0.26.0", optional = true, markers = "extra == \"synthesizers\" or extra == \"all\""} +pydub = ">=0.25.1,<0.26.0" pyht = ">=0.0.28,<0.0.29" redis = ">=5.0.4,<6.0.0" requests = ">=2.32.3,<3.0.0" sentry-sdk = {version = ">=2.3.1,<3.0.0", extras = ["fastapi"]} sounddevice = ">=0.4.7,<0.5.0" tiktoken = ">=0.7.0,<0.8.0" -twilio = {version = ">=9.1.0,<10.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} uvicorn = ">=0.30.0,<0.31.0" -vonage = {version = ">=3.14.0,<4.0.0", optional = true, markers = "extra == \"telephony\" or extra == \"all\""} websockets = ">=12.0,<13.0" [package.extras] -all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)", "miniaudio (>=1.59,<2.0)", "nltk (>=3.8.1,<4.0.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] -misc = ["langchain (>=0.2.1,<0.3.0)", "langchain-community (>=0.2.1,<0.3.0)"] -synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "miniaudio (>=1.59,<2.0)", "pvkoala (>=2.0.1,<3.0.0)", "pydub (>=0.25.1,<0.26.0)"] +all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.3,<0.3.0)", "langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-community (>=0.2.4,<0.3.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)", "pvkoala (>=2.0.1,<3.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +langchain = ["langchain (>=0.2.3,<0.3.0)", "langchain-community (>=0.2.4,<0.3.0)"] +langchain-extras = ["langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)"] +synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "pvkoala (>=2.0.1,<3.0.0)"] telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] -[[package]] -name = "vonage" -version = "3.16.0" -description = "Vonage Server SDK for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, - {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, -] - -[package.dependencies] -Deprecated = "*" -pydantic = ">=2.5.2" -pytz = ">=2018.5" -requests = ">=2.4.2" -vonage-jwt = ">=1.1.0" - -[[package]] -name = "vonage-jwt" -version = "1.1.1" -description = "Tooling for working with JWTs for Vonage APIs in Python." -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, - {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, -] - -[package.dependencies] -pyjwt = {version = ">=1.6.4", extras = ["crypto"]} -vonage-utils = ">=1.1.2" - -[[package]] -name = "vonage-utils" -version = "1.1.2" -description = "Utils package containing objects for use with Vonage APIs" -optional = false -python-versions = ">=3.8" -files = [ - {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, - {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, -] - -[package.dependencies] -pydantic = ">=2.7.1" -typing-extensions = ">=4.9.0" - [[package]] name = "watchfiles" version = "0.22.0" @@ -3897,4 +3071,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "31eda1014b931a0fdc20581ea1d18d00a011f57cf4247b1c54498d87f9b0969d" +content-hash = "8afcf31d9adf4f896c839a2e1f2a1f9cd7a538cacc09899f6a5f1e4cea239945" diff --git a/apps/telephony_app/pyproject.toml b/apps/telephony_app/pyproject.toml index befa855df1..e6b1c0d477 100644 --- a/apps/telephony_app/pyproject.toml +++ b/apps/telephony_app/pyproject.toml @@ -10,9 +10,7 @@ python = ">=3.10,<3.12" pyngrok = "^7.1.6" python-dotenv = "^1.0.1" azure-cognitiveservices-speech = "^1.38.0" -vocode = { version = "0.1.112", extras = [ - "all", -]} +vocode = "0.1.113" [build-system] diff --git a/docs/open-source/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx index 7c22707f35..fb6f21b7fe 100644 --- a/docs/open-source/python-quickstart.mdx +++ b/docs/open-source/python-quickstart.mdx @@ -78,6 +78,7 @@ class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", + extra="ignore" ) diff --git a/docs/open-source/react-quickstart.mdx b/docs/open-source/react-quickstart.mdx index c90f6921fb..08f89cf6ee 100644 --- a/docs/open-source/react-quickstart.mdx +++ b/docs/open-source/react-quickstart.mdx @@ -38,17 +38,8 @@ AZURE_SPEECH_KEY= AZURE_SPEECH_REGION= ``` -### Running with Python - -``` -pip3 install vocode -uvicorn main:app --port 3000 -``` - ### Running with Docker -Note: this is currently broken in 0.1.112 - we're planning an overhaul here, stay tuned! - From the `client_backend` directory: ``` @@ -56,6 +47,13 @@ docker build -t vocode-client-backend . docker run --env-file=.env -p 3000:3000 -t vocode-client-backend ``` +### Running with Python + +``` +pip3 install vocode +uvicorn main:app --port 3000 +``` + You now have a server with a Vocode websocket route at localhost:3000! You can now use the `useConversation` hook with your self-hosted backend as follows: ```typescript diff --git a/docs/open-source/telephony.mdx b/docs/open-source/telephony.mdx index cd0c5e9734..6537e1e3b5 100644 --- a/docs/open-source/telephony.mdx +++ b/docs/open-source/telephony.mdx @@ -58,8 +58,6 @@ Pick one of these two ways to run the server: 1. Run everything with Docker, 2. ### Option 1: Run everything With Docker -Note: Support for the Azure synthesizer is currently broken in the current base Docker Python image. - 1. Build the telephony app Docker image. From the `telephony_app` directory, run: ```bash diff --git a/poetry.lock b/poetry.lock index 2d6cf8ea24..763cdcb8c7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -727,13 +727,13 @@ files = [ [[package]] name = "elevenlabs" -version = "1.3.0" +version = "1.3.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.3.0-py3-none-any.whl", hash = "sha256:a4191799f83641be39c845a413381cc8881225eb53c290f1f8821d1648e0688e"}, - {file = "elevenlabs-1.3.0.tar.gz", hash = "sha256:5bb1b21497f60785a8b7b36fac165e7610ef249356947dd4272714825a6c26d4"}, + {file = "elevenlabs-1.3.1-py3-none-any.whl", hash = "sha256:96cb48d3527393b0f56fb9c6a26ad6520e2999a4c1ac9ca2b525ab7a26ea7342"}, + {file = "elevenlabs-1.3.1.tar.gz", hash = "sha256:23df9b48960bc1d48b9fe13a5dad74144a83ce5ed83708dd7dcf6180f44ce697"}, ] [package.dependencies] @@ -745,13 +745,13 @@ websockets = ">=11.0" [[package]] name = "email-validator" -version = "2.1.1" +version = "2.1.2" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, + {file = "email_validator-2.1.2-py3-none-any.whl", hash = "sha256:d89f6324e13b1e39889eab7f9ca2f91dc9aebb6fa50a6d8bd4329ab50f251115"}, + {file = "email_validator-2.1.2.tar.gz", hash = "sha256:14c0f3d343c4beda37400421b39fa411bbe33a75df20825df73ad53e06a9f04c"}, ] [package.dependencies] @@ -1917,13 +1917,13 @@ tenacity = ">=8.1.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.7" +version = "0.2.8" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.7-py3-none-any.whl", hash = "sha256:fd02e153c898486dd728d634684ffc64bc257ff2ba443dc7e53d017ac0bf4658"}, - {file = "langchain_core-0.2.7.tar.gz", hash = "sha256:b0b1b6dfbdedb39426fcb8bd3f07e40eec7964856e3fc384c420ca6dba61b34e"}, + {file = "langchain_core-0.2.8-py3-none-any.whl", hash = "sha256:172c81c858dc1f3123cc72b7e44e10f44c92f8a761cae18c364081f6c208e9f6"}, + {file = "langchain_core-0.2.8.tar.gz", hash = "sha256:2db866a4514672c4875b69d5590aa2ed50aa0d144874268bef68d74b5e7f33f9"}, ] [package.dependencies] @@ -1988,13 +1988,13 @@ extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] [[package]] name = "langsmith" -version = "0.1.77" +version = "0.1.78" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.77-py3-none-any.whl", hash = "sha256:2202cc21b1ed7e7b9e5d2af2694be28898afa048c09fdf09f620cbd9301755ae"}, - {file = "langsmith-0.1.77.tar.gz", hash = "sha256:4ace09077a9a4e412afeb4b517ca68e7de7b07f36e4792dc8236ac5207c0c0c7"}, + {file = "langsmith-0.1.78-py3-none-any.whl", hash = "sha256:87bc5d9072bfcb6392d7552cbcd6089dcc1faed36d688b1587d80bd48a1acba2"}, + {file = "langsmith-0.1.78.tar.gz", hash = "sha256:d9112d2e9298ec6b02d3b1afec6ed557df9db3746c79d34ef3b448fc18e116cd"}, ] [package.dependencies] @@ -2147,7 +2147,7 @@ files = [ name = "miniaudio" version = "1.59" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" -optional = true +optional = false python-versions = "*" files = [ {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, @@ -2581,13 +2581,13 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.38" +version = "8.13.39" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.38-py2.py3-none-any.whl", hash = "sha256:d22aa747fb591ef2a18afec13cab5a0e294ab20fce5a1560e4949e459e70eeef"}, - {file = "phonenumbers-8.13.38.tar.gz", hash = "sha256:2822c74ee9334e9d8ad792fc352cc8d21004307349b6b1bb61da12937fa2eaba"}, + {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, + {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, ] [[package]] @@ -2838,7 +2838,7 @@ yaml = ["pyyaml (>=6.0.1)"] name = "pydub" version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" -optional = true +optional = false python-versions = "*" files = [ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, @@ -3694,13 +3694,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 [[package]] name = "tenacity" -version = "8.3.0" +version = "8.4.1" description = "Retry code until it succeeds" optional = true python-versions = ">=3.8" files = [ - {file = "tenacity-8.3.0-py3-none-any.whl", hash = "sha256:3649f6443dbc0d9b01b9d8020a9c4ec7a1ff5f6f3c6c8a036ef371f573fe9185"}, - {file = "tenacity-8.3.0.tar.gz", hash = "sha256:953d4e6ad24357bceffbc9707bc74349aca9d245f68eb65419cf0c249a1949a2"}, + {file = "tenacity-8.4.1-py3-none-any.whl", hash = "sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa"}, + {file = "tenacity-8.4.1.tar.gz", hash = "sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd"}, ] [package.extras] @@ -4136,13 +4136,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -4649,14 +4649,14 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke 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)"] [extras] -all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "miniaudio", "nltk", "pvkoala", "pydub", "twilio", "vonage"] +all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "pvkoala", "twilio", "vonage"] langchain = ["langchain", "langchain-community"] langchain-extras = ["langchain-anthropic", "langchain-google-vertexai", "langchain-openai"] -synthesizers = ["cartesia", "google-cloud-texttospeech", "miniaudio", "pvkoala", "pydub"] +synthesizers = ["cartesia", "google-cloud-texttospeech", "pvkoala"] telephony = ["twilio", "vonage"] transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "4c4b13856a4fa064b4a38e929d5beccd8dde7ded344a8a352527c85149a547dd" +content-hash = "4597df1fca08478e2300adee246255ea9852721e74d05871a8b3f854d5f9a85f" diff --git a/pyproject.toml b/pyproject.toml index d9af386d20..e3a01f1d83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.112" +version = "0.1.113" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" @@ -12,19 +12,21 @@ homepage = "https://github.com/vocodedev/vocode-python" python = ">=3.10,<4.0" aiohttp = "^3.9.5" anthropic = "^0.28.0" -azure-cognitiveservices-speech = "^1.37.0" +azure-cognitiveservices-speech = "^1.38.0" elevenlabs = "^1.2.2" fastapi = "^0.111.0" janus = "^1.0.0" jinja2 = "^3.1.4" jsonschema = "^4.22.0" loguru = "^0.7.2" +miniaudio = "^1.59.0" numpy = "^1.26.4" openai = "^1.30.5" opentelemetry-sdk = "^1.24.0" phonenumbers = "^8.13.37" pydantic = "^2.7.2" pydantic-settings = "^2.3.0" +pydub = "^0.25.1" pyht = "^0.0.28" redis = "^5.0.4" requests = "^2.32.3" @@ -37,9 +39,7 @@ nltk = "^3.8.1" # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } -miniaudio = { version = "^1.59", optional = true } pvkoala = { version = "^2.0.1", optional = true } -pydub = { version = "^0.25.1", optional = true } cartesia = { version = "^0.1.1", optional = true } # Transcribers @@ -82,9 +82,7 @@ pytest-mock = "^3.14.0" [tool.poetry.extras] synthesizers = [ "google-cloud-texttospeech", - "miniaudio", "pvkoala", - "pydub", "cartesia", ] transcribers = ["google-cloud-speech"] @@ -93,10 +91,7 @@ langchain = ["langchain", "langchain-community"] langchain-extras = ["langchain-openai", "langchain-anthropic", "langchain-google-vertexai"] all = [ "google-cloud-texttospeech", - "miniaudio", - "nltk", "pvkoala", - "pydub", "google-cloud-speech", "twilio", "vonage", diff --git a/quickstarts/streaming_conversation.py b/quickstarts/streaming_conversation.py index 54d774f665..61a83e64e4 100644 --- a/quickstarts/streaming_conversation.py +++ b/quickstarts/streaming_conversation.py @@ -37,6 +37,7 @@ class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", + extra="ignore", ) diff --git a/quickstarts/turn_based_conversation.py b/quickstarts/turn_based_conversation.py index 73cfb0f0ca..4fb215c322 100644 --- a/quickstarts/turn_based_conversation.py +++ b/quickstarts/turn_based_conversation.py @@ -20,10 +20,7 @@ class Settings(BaseSettings): # This means a .env file can be used to overload these settings # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above - model_config = SettingsConfigDict( - env_file=".env", - env_file_encoding="utf-8", - ) + model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") settings = Settings() diff --git a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py index 65adc73f4a..8af5399d55 100644 --- a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py @@ -2,7 +2,6 @@ from typing import Optional import numpy as np -import pvkoala from fastapi import WebSocket, WebSocketDisconnect from loguru import logger @@ -78,6 +77,8 @@ def __init__( self.vonage_uuid = vonage_uuid self.noise_suppression = noise_suppression if self.noise_suppression: + import pvkoala + logger.info("Using PV koala noise suppression") self.buffer = bytearray() self.koala = pvkoala.create( diff --git a/vocode/turn_based/agent/chat_gpt_agent.py b/vocode/turn_based/agent/chat_gpt_agent.py index a6d8ac41c9..7171bb7f08 100644 --- a/vocode/turn_based/agent/chat_gpt_agent.py +++ b/vocode/turn_based/agent/chat_gpt_agent.py @@ -17,10 +17,10 @@ def __init__( max_tokens: int = 100, ): super().__init__(initial_message=initial_message) - openai.api_key = getenv("OPENAI_API_KEY", api_key) - if not openai.api_key: + api_key = getenv("OPENAI_API_KEY", api_key) + if not api_key: raise ValueError("OpenAI API key not provided") - self.client = openai.OpenAI() + self.client = openai.OpenAI(api_key=api_key) self.prompt = system_prompt self.model_name = model_name self.messages: List[Any] = [ diff --git a/vocode/turn_based/transcriber/whisper_transcriber.py b/vocode/turn_based/transcriber/whisper_transcriber.py index 1b6c582b1a..b1dc275d1b 100644 --- a/vocode/turn_based/transcriber/whisper_transcriber.py +++ b/vocode/turn_based/transcriber/whisper_transcriber.py @@ -10,10 +10,10 @@ class WhisperTranscriber(BaseTranscriber): def __init__(self, api_key: Optional[str] = None): - openai.api_key = getenv("OPENAI_API_KEY", api_key) - if not openai.api_key: + api_key = getenv("OPENAI_API_KEY", api_key) + if not api_key: raise ValueError("OpenAI API key not provided") - self.client = openai.OpenAI() + self.client = openai.OpenAI(api_key=api_key) def transcribe(self, audio_segment: AudioSegment) -> str: in_memory_wav = io.BytesIO() From c882cc5101f8a6d9f0692ce00b8abc12314ce100 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 17 Jun 2024 16:46:13 -0700 Subject: [PATCH 081/148] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 316918fd43..82cc97c65b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ ![Hero](https://user-images.githubusercontent.com/6234599/228337850-e32bb01d-3701-47ef-a433-3221c9e0e56e.png) -[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/vocodehq.svg?style=social&label=Follow%20%40vocodehq)](https://twitter.com/vocodehq) [![GitHub Repo stars](https://img.shields.io/github/stars/vocodedev/vocode-python?style=social)](https://github.com/vocodedev/vocode-python) +[![Twitter](https://img.shields.io/twitter/url/https/twitter.com/vocodehq.svg?style=social&label=Follow%20%40vocodehq)](https://twitter.com/vocodehq) [![GitHub Repo stars](https://img.shields.io/github/stars/vocodedev/vocode-core?style=social)](https://github.com/vocodedev/vocode-core) +[![pypi](https://img.shields.io/pypi/v/vocode.svg)](https://pypi.python.org/pypi/vocode) [![Downloads](https://static.pepy.tech/badge/vocode/month)](https://pepy.tech/project/vocode) [Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) From 86d7880148e5d1202db9c44d1bca8894b8e13b15 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 17 Jun 2024 17:19:43 -0700 Subject: [PATCH 082/148] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82cc97c65b..e2aa40ecee 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![pypi](https://img.shields.io/pypi/v/vocode.svg)](https://pypi.python.org/pypi/vocode) [![Downloads](https://static.pepy.tech/badge/vocode/month)](https://pepy.tech/project/vocode) -[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) +[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) | [Discord](https://discord.gg/NaU4mMgcnC) From 72da2b70df39400f1437e0beafa3c3306ff5e6a6 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 17 Jun 2024 17:20:22 -0700 Subject: [PATCH 083/148] Update welcome.mdx --- docs/welcome.mdx | 52 ------------------------------------------------ 1 file changed, 52 deletions(-) diff --git a/docs/welcome.mdx b/docs/welcome.mdx index c54cb42809..1c60a3b4a7 100644 --- a/docs/welcome.mdx +++ b/docs/welcome.mdx @@ -43,58 +43,6 @@ at our open source repos. Get started with [Open Source](/open-source-quickstart
-## Demos - - - - Prank call your friends with an AI that can say anything. - - - Conduct a mock YC interview entirely done via AI. - - - {" "} - {" "} - {" "} - - - } - href="https://replit.com/@vocode" - > - View the source for all of our demos and templates for quickstarts. - - - ## How to contact us Learn more about how to take your documentation to the next level From 261d29e7c8276dd3e6032ccdb6d678451979a635 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 17 Jun 2024 17:39:03 -0700 Subject: [PATCH 084/148] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2aa40ecee..82cc97c65b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![pypi](https://img.shields.io/pypi/v/vocode.svg)](https://pypi.python.org/pypi/vocode) [![Downloads](https://static.pepy.tech/badge/vocode/month)](https://pepy.tech/project/vocode) -[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) | [Discord](https://discord.gg/NaU4mMgcnC) +[Community](https://discord.gg/NaU4mMgcnC) | [Docs](https://docs.vocode.dev/open-source) | [Dashboard](https://app.vocode.dev) From 479ab54d413f11f6e76a79926e07adfc270c5103 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 18 Jun 2024 14:57:48 -0700 Subject: [PATCH 085/148] don't send to ws when it is already closed (#565) --- vocode/streaming/output_device/twilio_output_device.py | 3 +++ vocode/streaming/output_device/vonage_output_device.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/vocode/streaming/output_device/twilio_output_device.py b/vocode/streaming/output_device/twilio_output_device.py index 0563f08cff..565ec65f1e 100644 --- a/vocode/streaming/output_device/twilio_output_device.py +++ b/vocode/streaming/output_device/twilio_output_device.py @@ -6,6 +6,7 @@ from typing import Optional from fastapi import WebSocket +from fastapi.websockets import WebSocketState from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE @@ -24,6 +25,8 @@ def __init__(self, ws: Optional[WebSocket] = None, stream_sid: Optional[str] = N async def process(self): while self.active: message = await self.queue.get() + if self.ws.application_state == WebSocketState.DISCONNECTED: + break await self.ws.send_text(message) def consume_nonblocking(self, chunk: bytes): diff --git a/vocode/streaming/output_device/vonage_output_device.py b/vocode/streaming/output_device/vonage_output_device.py index 34a03c747e..76aef2b125 100644 --- a/vocode/streaming/output_device/vonage_output_device.py +++ b/vocode/streaming/output_device/vonage_output_device.py @@ -2,6 +2,7 @@ from typing import Optional from fastapi import WebSocket +from fastapi.websockets import WebSocketState from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.output_device.blocking_speaker_output import BlockingSpeakerOutput @@ -34,6 +35,8 @@ def __init__( async def process(self): while self.active: chunk = await self.queue.get() + if self.ws.application_state == WebSocketState.DISCONNECTED: + break if self.output_to_speaker: self.output_speaker.consume_nonblocking(chunk) for i in range(0, len(chunk), VONAGE_CHUNK_SIZE): From 61e285fc87c6ea4311a84588a673b1fae6b7e476 Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Tue, 18 Jun 2024 17:01:56 -0700 Subject: [PATCH 086/148] add langchain agent docs (#564) --- docs/mint.json | 5 +- docs/open-source/langchain-agent-dep.mdx | 209 ++++++++++++++++ docs/open-source/langchain-agent.mdx | 285 ++++++++-------------- vocode/streaming/agent/langchain_agent.py | 32 ++- 4 files changed, 340 insertions(+), 191 deletions(-) create mode 100644 docs/open-source/langchain-agent-dep.mdx diff --git a/docs/mint.json b/docs/mint.json index f2a629542a..1271ee8c0f 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -82,13 +82,14 @@ "open-source/sentry", "open-source/logging-with-loguru", "open-source/turn-based-conversation", - "open-source/language-support" + "open-source/language-support", + "open-source/langchain-agent" ] }, { "group": "Legacy (0.0.111) Guides", "pages": [ - "open-source/langchain-agent", + "open-source/langchain-agent-dep", "open-source/local-conversation" ] }, diff --git a/docs/open-source/langchain-agent-dep.mdx b/docs/open-source/langchain-agent-dep.mdx new file mode 100644 index 0000000000..a5cafccb36 --- /dev/null +++ b/docs/open-source/langchain-agent-dep.mdx @@ -0,0 +1,209 @@ +--- +title: "(Deprecated) Langchain Agent" +description: "Empower Langchain agents to interact with the real world via phone calls" +--- + +# Introduction + +This example shows how to use Vocode as a tool augmenting the abilities of a Langchain +agent. By providing it with access to Vocode, a [Langchain Agent](https://python.langchain.com/en/latest/modules/agents.html) +can now make autonomous phone calls and take action based on the outcome of the calls. + +Our demo will walk through how to instruct the agent to lookup a phone number and make the +appropriate call. + +
+ +
+
+ +# How to run it + +## Requirements + +1. Install [Ngrok](https://ngrok.com/) +2. Install [Redis](https://redis.com/) +3. Install [Poetry](https://python-poetry.org/) + +## Run the example + +Note: `gpt-4` is required for this to work. `gpt-3.5-turbo` or older models are not smart enough to parse JSON responses in Langchain agents reliably out-of-the-box. + +To get started, clone the Vocode repo or copy the [Langchain agent app](https://github.com/vocodedev/vocode-python/tree/main/apps/langchain_agent) directory. + +```bash +git clone https://github.com/vocodedev/vocode-python.git +``` + +### Environment + +1. Copy the `.env.template` and fill in your API keys. You'll need: + +- [Deepgram](https://deepgram.com) (for speech transcription) +- [OpenAI](https://platform.openai.com) (for the underlying agent) +- [Azure](https://azure.microsoft.com/en-us/products/cognitive-services/text-to-speech/) (for speech synthesis) +- [Twilio](https://console.twilio.com/) (for telephony) + +2. Tunnel port 3000 to ngrok by running: + +``` +ngrok http 3000 +``` + +Fill in the `TELEPHONY_SERVER_BASE_URL` environment variable with your ngrok base URL: don't include `https://` so should be something like: + +``` +TELEPHONY_SERVER_BASE_URL=asdf1234.ngrok.app +``` + +3. Buy a phone number on Twilio or [verify your caller ID](https://support.twilio.com/hc/en-us/articles/223180048-Adding-a-Verified-Phone-Number-or-Caller-ID-with-Twilio) to use as the outbound phone number. + Set this phone number as the `OUTBOUND_CALLER_NUMBER` environment variable. Include `+` and the area code, so for a US phone number, it would look something like. + +``` +OUTBOUND_CALLER_NUMBER=+15555555555 +``` + +### Set up self-hosted telephony server + +Run the following setups from the `langchain_agent` directory. + +#### Running with Docker + +1. Build the telephony server Docker image + +``` +docker build -t vocode-langchain-agent-telephony-app . +``` + +2. Run the service using `docker-compose` + +``` +docker-compose up +``` + +#### Running with Python + +1. (optional) Set up a Python environment: we recommend `virtualenv` + +``` +python3 -m venv venv +source venv/bin/activate +``` + +2. Install requirements + +```bash +poetry install +``` + +3. Run an instance of Redis at http://localhost:6379. With Docker, this can be done with: + +``` +docker run -dp 6379:6379 -it redis/redis-stack:latest +``` + +4. Run the `TelephonyServer`: + +```bash +uvicorn telephony_app:app --reload --port 3000 +``` + +### Set up the Langchain agent + +With the self-hosted telephony server running: + +1. Update the phone numbers in the contact book in `tools/contacts.py` + +```python +CONTACTS = [{"name": "Kian", "phone": "+123456789"}] +``` + +2. Run `main.py` + +```bash +poetry install +poetry run python main.py +``` + +# Code explanation +The Langchain agent is implemented in `main.py`. It uses the Langchain library to initialize an agent that can have a conversation. + +## Langchain Agent +`main.py` instantiates the langchain agent and relevant tools. It sets an objective, initializes a Langchain agent, and runs the conversation. +```python +agent = initialize_agent( + tools=[get_all_contacts, call_phone_number, word_of_the_day], + llm=llm, + agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, + verbose=verbose, + memory=memory, +) +``` + +## Langchain tools + +### Tool to get all contacts +```python +@tool("get_all_contacts") +def get_all_contacts(placeholder: str) -> List[dict]: + """Get contacts.""" + return CONTACTS +``` + +### Tool to call phone number +`tools/vocode.py` makes use of the `OutboundCall` class to initiate a phone call +```python +@tool("call phone number") +def call_phone_number(input: str) -> str: + """calls a phone number as a bot and returns a transcript of the conversation. + the input to this tool is a pipe separated list of a phone number, a prompt, and the first thing the bot should say. + The prompt should instruct the bot with what to do on the call and be in the 3rd person, + like 'the assistant is performing this task' instead of 'perform this task'. + + should only use this tool once it has found an adequate phone number to call. + + for example, `+15555555555|the assistant is explaining the meaning of life|i'm going to tell you the meaning of life` will call +15555555555, say 'i'm going to tell you the meaning of life', and instruct the assistant to tell the human what the meaning of life is. + """ + phone_number, prompt, initial_message = input.split("|", 2) + call = OutboundCall( + base_url=os.environ["TELEPHONY_SERVER_BASE_URL"], + to_phone=phone_number, + from_phone=os.environ["OUTBOUND_CALLER_NUMBER"], + config_manager=RedisConfigManager(), + agent_config=ChatGPTAgentConfig( + prompt_preamble=prompt, + initial_message=BaseMessage(text=initial_message), + ), + logger=logging.Logger("call_phone_number"), + ) + LOOP.run_until_complete(call.start()) + while True: + maybe_transcript = get_transcript(call.conversation_id) + if maybe_transcript: + delete_transcript(call.conversation_id) + return maybe_transcript + else: + time.sleep(1) +``` + +## TelephonyServer +`telephony_app.py` instantiates a `TelephonyServer` object to manage the phone call initiated by `OutboundCall` +```python +telephony_server = TelephonyServer( + base_url=BASE_URL, + config_manager=config_manager, + inbound_call_configs=[], + events_manager=EventsManager(), + logger=logger, +) + +app.include_router(telephony_server.get_router()) +``` \ No newline at end of file diff --git a/docs/open-source/langchain-agent.mdx b/docs/open-source/langchain-agent.mdx index d2ceb2efb3..dbb1e79f5f 100644 --- a/docs/open-source/langchain-agent.mdx +++ b/docs/open-source/langchain-agent.mdx @@ -1,209 +1,136 @@ --- -title: "Langchain agent" -description: "Empower Langchain agents to interact with the real world via phone calls" +title: "Langchain Agent" +description: "Use Langchain to determine your agent's responses." --- -# Introduction +## Overview -This example shows how to use Vocode as a tool augmenting the abilities of a Langchain -agent. By providing it with access to Vocode, a [Langchain Agent](https://python.langchain.com/en/latest/modules/agents.html) -can now make autonomous phone calls and take action based on the outcome of the calls. +[Langchain](https://python.langchain.com/v0.2/docs/introduction/) offers tooling to create custom LLM pipelines for complex decision-making. +Through Langchain, you can manage your LLM and prompts, and combine them with advanced techniques like RAG and multi-stage prompting, and sub-chains. +The library also offers components for output parsing, complex document loading, and callbacks. -Our demo will walk through how to instruct the agent to lookup a phone number and make the -appropriate call. - -
- -
-
- -# How to run it - -## Requirements - -1. Install [Ngrok](https://ngrok.com/) -2. Install [Redis](https://redis.com/) -3. Install [Poetry](https://python-poetry.org/) - -## Run the example - -Note: `gpt-4` is required for this to work. `gpt-3.5-turbo` or older models are not smart enough to parse JSON responses in Langchain agents reliably out-of-the-box. - -To get started, clone the Vocode repo or copy the [Langchain agent app](https://github.com/vocodedev/vocode-python/tree/main/apps/langchain_agent) directory. - -```bash -git clone https://github.com/vocodedev/vocode-python.git -``` - -### Environment - -1. Copy the `.env.template` and fill in your API keys. You'll need: - -- [Deepgram](https://deepgram.com) (for speech transcription) -- [OpenAI](https://platform.openai.com) (for the underlying agent) -- [Azure](https://azure.microsoft.com/en-us/products/cognitive-services/text-to-speech/) (for speech synthesis) -- [Twilio](https://console.twilio.com/) (for telephony) - -2. Tunnel port 3000 to ngrok by running: - -``` -ngrok http 3000 -``` - -Fill in the `TELEPHONY_SERVER_BASE_URL` environment variable with your ngrok base URL: don't include `https://` so should be something like: - -``` -TELEPHONY_SERVER_BASE_URL=asdf1234.ngrok.app -``` - -3. Buy a phone number on Twilio or [verify your caller ID](https://support.twilio.com/hc/en-us/articles/223180048-Adding-a-Verified-Phone-Number-or-Caller-ID-with-Twilio) to use as the outbound phone number. - Set this phone number as the `OUTBOUND_CALLER_NUMBER` environment variable. Include `+` and the area code, so for a US phone number, it would look something like. - -``` -OUTBOUND_CALLER_NUMBER=+15555555555 -``` - -### Set up self-hosted telephony server - -Run the following setups from the `langchain_agent` directory. - -#### Running with Docker - -1. Build the telephony server Docker image +**Note:** Vocode does not support actions with Langchain agents.* +### Installation +Make sure to install the langchain optional dependencies by running ``` -docker build -t vocode-langchain-agent-telephony-app . +poetry install -E langchain -E langchain-extras ``` - -2. Run the service using `docker-compose` - -``` -docker-compose up -``` - -#### Running with Python - -1. (optional) Set up a Python environment: we recommend `virtualenv` - -``` -python3 -m venv venv -source venv/bin/activate -``` - -2. Install requirements - -```bash -poetry install -``` - -3. Run an instance of Redis at http://localhost:6379. With Docker, this can be done with: - +or ``` -docker run -dp 6379:6379 -it redis/redis-stack:latest +poetry install -E all ``` -4. Run the `TelephonyServer`: - -```bash -uvicorn telephony_app:app --reload --port 3000 -``` - -### Set up the Langchain agent - -With the self-hosted telephony server running: - -1. Update the phone numbers in the contact book in `tools/contacts.py` +## Default Chain +Vocode Core's Langchain agent defaults to using the `init_chat_model()` method described [here](https://python.langchain.com/v0.2/docs/how_to/chat_models_universal_init/). +This implementation allows users to create a Langchain agent using a variety of [different model providers](https://api.python.langchain.com/en/latest/chat_models/langchain.chat_models.base.init_chat_model.html) +by passing in the relevant `model` and `provider` params into the `LangchainAgentConfig`. For example, if I want to use an OpenAI agent, I would pass in an agent config like: ```python -CONTACTS = [{"name": "Kian", "phone": "+123456789"}] +from vocode.streaming.models.agent import LangchainAgentConfig + +agent_config = LangchainAgentConfig( + ... + model_name = "gpt-4o" + provider = "openai" + ... +) ``` -2. Run `main.py` +**Note:** Vocode Core includes the OpenAI, Anthropic, and Google VertexAI Langchain packages when you install the langchain extras in Poetry. If you want to use other LLM providers +like AWS Bedrock, Cohere, Mistral, etc, you will need to manually install their Langchain integration packages. -```bash -poetry install -poetry run python main.py -``` +## Using Custom Chains +Our Langchain Agent is designed to make it easy to plug in your own custom Langchain chains. You can either: +1. Manually pass in a chain to the Langchain Agent +2. Subclass the Langchain Agent and build custom processing to create a chain based off a `LangchainAgentConfig` -# Code explanation -The Langchain agent is implemented in `main.py`. It uses the Langchain library to initialize an agent that can have a conversation. +### Manually pass in a chain +The `LangchainAgent` constructor has a `chain` parameter where you can directly pass your chain. So, to use this in a conversation, you can create a custom `AgentFactory` that builds +your chain when initializing the langchain agent. -## Langchain Agent -`main.py` instantiates the langchain agent and relevant tools. It sets an objective, initializes a Langchain agent, and runs the conversation. +For example, we will design a factory which makes a custom chain querying Anthropic Claude Opus to make a poem at each agent turn: ```python -agent = initialize_agent( - tools=[get_all_contacts, call_phone_number, word_of_the_day], - llm=llm, - agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, - verbose=verbose, - memory=memory, -) +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.models.agent import LangchainAgentConfig +from vocode.streaming.agent.langchain_agent import LangchainAgent +from langchain_anthropic import ChatAnthropic +from langchain_core.prompts import ChatPromptTemplate + +class PoemAgentFactory(AbstractAgentFactory): + def create_agent( + self, agent_config: AgentConfig, logger: Optional[logging.Logger] = None + ) -> BaseAgent: + if isinstance(agent_config, LangchainAgentConfig): + prompt_template = ChatPromptTemplate.from_template("Make a random poem") + model = ChatAnthropic(model='claude-3-opus-20240229') + chain = prompt_template | model + return LangchainAgent( + agent_config = agent_config, + chain = chain, + ) + else: + raise Exception("Invalid agent config") ``` -## Langchain tools +### Creating custom chains from `LangchainAgentConfig` +In some scenarios, you may want to create a complex chain from a config, where you can have different models and providers. For these cases, we recommend creating a subclass of the `LangchainAgent` +and overwriting the `self.create_chain()` method. This method is called when a `LangchainAgent` is initialized without a `chain` manually passed into the constructor. +Within this method, you can directly access the agent config at `self.agent_config` and build your own chain using its fields. -### Tool to get all contacts -```python -@tool("get_all_contacts") -def get_all_contacts(placeholder: str) -> List[dict]: - """Get contacts.""" - return CONTACTS -``` +For example below, we will design agent that builds a custom chain to query a Gemini LLM to generate a poem on a topic. +The topic and LLM setup (provider and model name) will all be passed in via the config, allowing for strong customization. +As a further example of this customizability, we will confirm the LLM provider is set to Google GenAI and raise an error otherwise. -### Tool to call phone number -`tools/vocode.py` makes use of the `OutboundCall` class to initiate a phone call ```python -@tool("call phone number") -def call_phone_number(input: str) -> str: - """calls a phone number as a bot and returns a transcript of the conversation. - the input to this tool is a pipe separated list of a phone number, a prompt, and the first thing the bot should say. - The prompt should instruct the bot with what to do on the call and be in the 3rd person, - like 'the assistant is performing this task' instead of 'perform this task'. - - should only use this tool once it has found an adequate phone number to call. - - for example, `+15555555555|the assistant is explaining the meaning of life|i'm going to tell you the meaning of life` will call +15555555555, say 'i'm going to tell you the meaning of life', and instruct the assistant to tell the human what the meaning of life is. - """ - phone_number, prompt, initial_message = input.split("|", 2) - call = OutboundCall( - base_url=os.environ["TELEPHONY_SERVER_BASE_URL"], - to_phone=phone_number, - from_phone=os.environ["OUTBOUND_CALLER_NUMBER"], - config_manager=RedisConfigManager(), - agent_config=ChatGPTAgentConfig( - prompt_preamble=prompt, - initial_message=BaseMessage(text=initial_message), - ), - logger=logging.Logger("call_phone_number"), - ) - LOOP.run_until_complete(call.start()) - while True: - maybe_transcript = get_transcript(call.conversation_id) - if maybe_transcript: - delete_transcript(call.conversation_id) - return maybe_transcript +from vocode.streaming.agent.abstract_factory import AbstractAgentFactory +from vocode.streaming.models.agent import LangchainAgentConfig +from vocode.streaming.agent.langchain_agent import LangchainAgent +from langchain_google_genai import ChatGoogleGenerativeAI +from langchain_core.prompts import ChatPromptTemplate + +class PoemLangchainAgentConfig(LangchainAgentConfig): + poem_topic: str + +class PoemLangchainAgent(LangchainAgent): + def create_chain(self): + if self.agent_config.provider != "google_genai": + raise Exception("PoemLangchainAgent only supports Google Generative AI models") + + prompt_template = ChatPromptTemplate.from_template(f"Make a random poem about {self.agent_config.poem_topic}") + model = ChatGoogleGenerativeAI( + model=self.agent_config.model_name, + temperature=self.agent_config.temperature, + max_output_tokens=self.agent_config.max_tokens + ) + chain = prompt_template | model + return chain + + +class MyAgentFactory(AbstractAgentFactory): + def create_agent( + self, agent_config: AgentConfig, logger: Optional[logging.Logger] = None + ) -> BaseAgent: + if isinstance(agent_config, PoemLangchainAgentConfig): + return PoemLangchainAgent( + agent_config=agent_config + ) + elif isinstance(agent_config, LangchainAgentConfig): + return LangchainAgent( + agent_config=agent_config, + ) else: - time.sleep(1) + raise Exception("Invalid agent config") ``` -## TelephonyServer -`telephony_app.py` instantiates a `TelephonyServer` object to manage the phone call initiated by `OutboundCall` +Then, we can use the following agent config in conversations to use make poems about Vocode! ```python -telephony_server = TelephonyServer( - base_url=BASE_URL, - config_manager=config_manager, - inbound_call_configs=[], - events_manager=EventsManager(), - logger=logger, -) +from vocode.streaming.models.agent import LangchainAgentConfig -app.include_router(telephony_server.get_router()) +agent_config = LangchainAgentConfig( + ... + model_name = "Vocode" + provider = "poem" + ... +) ``` \ No newline at end of file diff --git a/vocode/streaming/agent/langchain_agent.py b/vocode/streaming/agent/langchain_agent.py index 9daa426caa..77045cb5e7 100644 --- a/vocode/streaming/agent/langchain_agent.py +++ b/vocode/streaming/agent/langchain_agent.py @@ -37,10 +37,13 @@ def __init__( self.chain = chain if chain else self.create_chain() def create_chain(self): - model = init_chat_model(model = self.agent_config.model_name, model_provider=self.agent_config.provider, temperature=self.agent_config.temperature, max_tokens=self.agent_config.max_tokens) - messages_for_prompt_template = [ - ("placeholder", "{chat_history}") - ] + model = init_chat_model( + model=self.agent_config.model_name, + model_provider=self.agent_config.provider, + temperature=self.agent_config.temperature, + max_tokens=self.agent_config.max_tokens, + ) + messages_for_prompt_template = [("placeholder", "{chat_history}")] if self.agent_config.prompt_preamble: messages_for_prompt_template.insert(0, ("system", self.agent_config.prompt_preamble)) prompt_template = ChatPromptTemplate.from_messages(messages_for_prompt_template) @@ -55,7 +58,9 @@ async def token_generator( if isinstance(chunk.content, str): yield chunk.content else: - raise ValueError(f"Received unexpected message type {type(chunk)} from Langchain. Expected str.") + raise ValueError( + f"Received unexpected message type {type(chunk)} from Langchain. Expected str." + ) def format_langchain_messages_from_transcript(self) -> list[tuple]: if not self.transcript: @@ -64,14 +69,19 @@ def format_langchain_messages_from_transcript(self) -> list[tuple]: for event_log in self.transcript.event_logs: if isinstance(event_log, Message): messages.append( - ("ai" if event_log.sender == Sender.BOT else "human", event_log.to_string(include_sender=False)) + ( + "ai" if event_log.sender == Sender.BOT else "human", + event_log.to_string(include_sender=False), + ) ) else: - raise ValueError(f"Invalid event log type {type(event_log)}. Langchain currently only supports human and bot messages") - + raise ValueError( + f"Invalid event log type {type(event_log)}. Langchain currently only supports human and bot messages" + ) + if self.agent_config.provider == "anthropic": messages = merge_bot_messages_for_langchain(messages) - + return messages async def generate_response( @@ -91,7 +101,9 @@ async def generate_response( ttft_span = sentry_create_span( sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.TIME_TO_FIRST_TOKEN ) - stream = self.chain.astream({"chat_history": self.format_langchain_messages_from_transcript()}) + stream = self.chain.astream( + {"chat_history": self.format_langchain_messages_from_transcript()} + ) except Exception as e: logger.error( f"Error while hitting Langchain", From 696f4d1f02745c1610d68ffa72961028d922d80c Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 19 Jun 2024 09:29:42 -0700 Subject: [PATCH 087/148] rename langchain to LangChain in docs (#566) * rename langchain to LangChain in docs * fix ref --- docs/open-source/langchain-agent.mdx | 43 +++++++++++++++++----------- docs/vectordb.mdx | 2 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/docs/open-source/langchain-agent.mdx b/docs/open-source/langchain-agent.mdx index dbb1e79f5f..142df30280 100644 --- a/docs/open-source/langchain-agent.mdx +++ b/docs/open-source/langchain-agent.mdx @@ -1,29 +1,34 @@ --- -title: "Langchain Agent" -description: "Use Langchain to determine your agent's responses." +title: "LangChain Agent" +description: "Use LangChain to determine your agent's responses." --- ## Overview -[Langchain](https://python.langchain.com/v0.2/docs/introduction/) offers tooling to create custom LLM pipelines for complex decision-making. -Through Langchain, you can manage your LLM and prompts, and combine them with advanced techniques like RAG and multi-stage prompting, and sub-chains. +[LangChain](https://python.langchain.com/v0.2/docs/introduction/) offers tooling to create custom LLM pipelines for complex decision-making. +Through LangChain, you can manage your LLM and prompts, and combine them with advanced techniques like RAG and multi-stage prompting, and sub-chains. The library also offers components for output parsing, complex document loading, and callbacks. -**Note:** Vocode does not support actions with Langchain agents.* +**Note:** Vocode does not support actions with LangChain agents.\* ### Installation + Make sure to install the langchain optional dependencies by running + ``` poetry install -E langchain -E langchain-extras ``` + or + ``` poetry install -E all ``` ## Default Chain -Vocode Core's Langchain agent defaults to using the `init_chat_model()` method described [here](https://python.langchain.com/v0.2/docs/how_to/chat_models_universal_init/). -This implementation allows users to create a Langchain agent using a variety of [different model providers](https://api.python.langchain.com/en/latest/chat_models/langchain.chat_models.base.init_chat_model.html) + +Vocode Core's LangChain agent defaults to using the `init_chat_model()` method described [here](https://python.langchain.com/v0.2/docs/how_to/chat_models_universal_init/). +This implementation allows users to create a LangChain agent using a variety of [different model providers](https://api.python.langchain.com/en/latest/chat_models/langchain.chat_models.base.init_chat_model.html) by passing in the relevant `model` and `provider` params into the `LangchainAgentConfig`. For example, if I want to use an OpenAI agent, I would pass in an agent config like: ```python @@ -37,19 +42,23 @@ agent_config = LangchainAgentConfig( ) ``` -**Note:** Vocode Core includes the OpenAI, Anthropic, and Google VertexAI Langchain packages when you install the langchain extras in Poetry. If you want to use other LLM providers -like AWS Bedrock, Cohere, Mistral, etc, you will need to manually install their Langchain integration packages. +**Note:** Vocode Core includes the OpenAI, Anthropic, and Google VertexAI LangChain packages when you install the langchain extras in Poetry. If you want to use other LLM providers +like AWS Bedrock, Cohere, Mistral, etc, you will need to manually install their LangChain integration packages. ## Using Custom Chains -Our Langchain Agent is designed to make it easy to plug in your own custom Langchain chains. You can either: -1. Manually pass in a chain to the Langchain Agent -2. Subclass the Langchain Agent and build custom processing to create a chain based off a `LangchainAgentConfig` + +Our `LangchainAgent` is designed to make it easy to plug in your own custom LangChain chains. You can either: + +1. Manually pass in a chain to the `LangchainAgent` +2. Subclass the `LangchainAgent` and build custom processing to create a chain based off a `LangchainAgentConfig` ### Manually pass in a chain + The `LangchainAgent` constructor has a `chain` parameter where you can directly pass your chain. So, to use this in a conversation, you can create a custom `AgentFactory` that builds your chain when initializing the langchain agent. For example, we will design a factory which makes a custom chain querying Anthropic Claude Opus to make a poem at each agent turn: + ```python from vocode.streaming.agent.abstract_factory import AbstractAgentFactory from vocode.streaming.models.agent import LangchainAgentConfig @@ -74,11 +83,12 @@ class PoemAgentFactory(AbstractAgentFactory): ``` ### Creating custom chains from `LangchainAgentConfig` + In some scenarios, you may want to create a complex chain from a config, where you can have different models and providers. For these cases, we recommend creating a subclass of the `LangchainAgent` and overwriting the `self.create_chain()` method. This method is called when a `LangchainAgent` is initialized without a `chain` manually passed into the constructor. Within this method, you can directly access the agent config at `self.agent_config` and build your own chain using its fields. -For example below, we will design agent that builds a custom chain to query a Gemini LLM to generate a poem on a topic. +For example below, we will design agent that builds a custom chain to query a Gemini LLM to generate a poem on a topic. The topic and LLM setup (provider and model name) will all be passed in via the config, allowing for strong customization. As a further example of this customizability, we will confirm the LLM provider is set to Google GenAI and raise an error otherwise. @@ -96,10 +106,10 @@ class PoemLangchainAgent(LangchainAgent): def create_chain(self): if self.agent_config.provider != "google_genai": raise Exception("PoemLangchainAgent only supports Google Generative AI models") - + prompt_template = ChatPromptTemplate.from_template(f"Make a random poem about {self.agent_config.poem_topic}") model = ChatGoogleGenerativeAI( - model=self.agent_config.model_name, + model=self.agent_config.model_name, temperature=self.agent_config.temperature, max_output_tokens=self.agent_config.max_tokens ) @@ -124,6 +134,7 @@ class MyAgentFactory(AbstractAgentFactory): ``` Then, we can use the following agent config in conversations to use make poems about Vocode! + ```python from vocode.streaming.models.agent import LangchainAgentConfig @@ -133,4 +144,4 @@ agent_config = LangchainAgentConfig( provider = "poem" ... ) -``` \ No newline at end of file +``` diff --git a/docs/vectordb.mdx b/docs/vectordb.mdx index 69d27072e4..382a8e3c94 100644 --- a/docs/vectordb.mdx +++ b/docs/vectordb.mdx @@ -13,7 +13,7 @@ Each time the bot receives a message, it can query for the most similar embeddin be shown to the agent to guide its responses. Currently, we support [Pinecone](https://www.pinecone.io/). Under the hood, we use an approach similar -to Langchain to store the documents in Pinecone. Each vector in Pinecone must have two pieces of metadata +to LangChain to store the documents in Pinecone. Each vector in Pinecone must have two pieces of metadata to be compatible with Vocode: - `text`: The text that will be shown to the agent. From 2a29830699c3b21116fb49baab0e0bb12e5d17f5 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 19 Jun 2024 18:22:19 -0700 Subject: [PATCH 088/148] fix import ref for loguru (#567) --- docs/open-source/sentry.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/open-source/sentry.mdx b/docs/open-source/sentry.mdx index 605a66b5d7..abf01a3755 100644 --- a/docs/open-source/sentry.mdx +++ b/docs/open-source/sentry.mdx @@ -26,7 +26,7 @@ Here's how you can configure the Sentry SDK: import os import sentry_sdk from sentry_sdk.integrations.asyncio import AsyncioIntegration -from sentry_sdk.integrations.logging import LoguruIntegration +from sentry_sdk.integrations.loguru import LoguruIntegration sentry_sdk.init( dsn=os.getenv("SENTRY_DSN"), From b74c85bdcf33bb141ec4680b1245b10158e76062 Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Thu, 20 Jun 2024 11:39:12 -0700 Subject: [PATCH 089/148] reorganize docs into groups (#568) --- docs/mint.json | 70 +++++++++++++++++------- docs/open-source/agents-with-actions.mdx | 2 +- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index 1271ee8c0f..b8a53d90be 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -47,14 +47,6 @@ } }, "navigation": [ - { - "group": "Getting Started", - "pages": [ - "welcome", - "hosted-quickstart", - "open-source-quickstarts" - ] - }, { "group": "Vocode 101", "pages": [ @@ -64,26 +56,66 @@ ] }, { - "group": "Guides", + "group": "Getting Started", "pages": [ "open-source/python-quickstart", + "open-source/react-quickstart", "open-source/telephony", + "open-source/turn-based-conversation" + ] + }, + { + "group": "Agents", + "pages": [ "open-source/create-your-own-agent", "open-source/agent-factory", + "open-source/langchain-agent" + ] + }, + { + "group": "Synthesizers (Voice)", + "pages": [ + "open-source/using-synthesizers" + ] + }, + { + "group": "Transcribers (Speech-to-Text)", + "pages": [ + "open-source/using-transcribers" + ] + }, + { + "group": "Actions", + "pages": [ "open-source/agents-with-actions", "open-source/action-phrase-triggers", - "open-source/external-action", + "open-source/external-action" + ] + }, + { + "group": "Conversation Tuning", + "pages": [ "open-source/conversation-mechanics", - "open-source/events-manager", - "open-source/using-synthesizers", - "open-source/using-transcribers", - "open-source/react-quickstart", - "open-source/playground", - "open-source/sentry", + "open-source/language-support" + ] + }, + { + "group": "Monitoring", + "pages": [ "open-source/logging-with-loguru", - "open-source/turn-based-conversation", - "open-source/language-support", - "open-source/langchain-agent" + "open-source/sentry" + ] + }, + { + "group": "Testing", + "pages": [ + "open-source/playground" + ] + }, + { + "group": "Advanced Functionality", + "pages": [ + "open-source/events-manager" ] }, { diff --git a/docs/open-source/agents-with-actions.mdx b/docs/open-source/agents-with-actions.mdx index 9bd04bbdef..2d0b9ffde5 100644 --- a/docs/open-source/agents-with-actions.mdx +++ b/docs/open-source/agents-with-actions.mdx @@ -1,5 +1,5 @@ --- -title: 'Agents with Actions' +title: 'Adding Actions to Agents' description: 'Empower agents to take actions during conversations.' --- From 7c354bb3bc0c68178c1acc30b77238fde9966c80 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 21 Jun 2024 10:30:57 -0700 Subject: [PATCH 090/148] add back getting started section (#574) --- docs/mint.json | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index b8a53d90be..36e5f60e54 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -47,6 +47,10 @@ } }, "navigation": [ + { + "group": "Getting Started", + "pages": ["welcome", "hosted-quickstart", "open-source-quickstarts"] + }, { "group": "Vocode 101", "pages": [ @@ -74,15 +78,11 @@ }, { "group": "Synthesizers (Voice)", - "pages": [ - "open-source/using-synthesizers" - ] + "pages": ["open-source/using-synthesizers"] }, { "group": "Transcribers (Speech-to-Text)", - "pages": [ - "open-source/using-transcribers" - ] + "pages": ["open-source/using-transcribers"] }, { "group": "Actions", @@ -101,22 +101,15 @@ }, { "group": "Monitoring", - "pages": [ - "open-source/logging-with-loguru", - "open-source/sentry" - ] + "pages": ["open-source/logging-with-loguru", "open-source/sentry"] }, { "group": "Testing", - "pages": [ - "open-source/playground" - ] + "pages": ["open-source/playground"] }, { "group": "Advanced Functionality", - "pages": [ - "open-source/events-manager" - ] + "pages": ["open-source/events-manager"] }, { "group": "Legacy (0.0.111) Guides", @@ -147,9 +140,7 @@ }, { "group": "Usage", - "pages": [ - "api-reference/usage/get-usage" - ] + "pages": ["api-reference/usage/get-usage"] }, { "group": "Actions", @@ -263,4 +254,4 @@ "twitter": "https://twitter.com/vocodehq", "website": "https://www.vocode.dev/" } -} \ No newline at end of file +} From 00a138af8f4b6674943cdc4c602dfe52f46d666d Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Fri, 21 Jun 2024 11:25:28 -0700 Subject: [PATCH 091/148] update signature validation for hosted docs (#575) --- docs/external-actions.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/external-actions.mdx b/docs/external-actions.mdx index 2131b3455a..740331f2f8 100644 --- a/docs/external-actions.mdx +++ b/docs/external-actions.mdx @@ -165,7 +165,7 @@ Asynchronous function to check if the request signature is encoded correctly. """ signature_secret_as_bytes = base64.b64decode(signature_secret) decoded_digest = base64.b64decode(request_signature_value) - calculated_digest = hmac.new(signature_secret_as_bytes, payload, hashlib.sha256).digest() + calculated_digest = hmac.new(signature_secret_as_bytes, json.dumps(payload).encode("utf-8"), hashlib.sha256).digest() assert hmac.compare_digest(decoded_digest, calculated_digest) is True ```` From 068fead8452008d9edef1c4985c5fdec78c81e0b Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 24 Jun 2024 17:06:06 -0700 Subject: [PATCH 092/148] remove runtime error on twilio 401 (#580) --- vocode/streaming/telephony/client/twilio_client.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vocode/streaming/telephony/client/twilio_client.py b/vocode/streaming/telephony/client/twilio_client.py index 254318cf9e..97e8a9f7d5 100644 --- a/vocode/streaming/telephony/client/twilio_client.py +++ b/vocode/streaming/telephony/client/twilio_client.py @@ -14,6 +14,10 @@ class TwilioBadRequestException(ValueError): pass +class TwilioException(ValueError): + pass + + class TwilioClient(AbstractTelephonyClient): def __init__( self, @@ -64,10 +68,11 @@ async def create_call( ) raise TwilioBadRequestException( "Telephony provider rejected call; this is usually due to a bad/malformed number. " - "If this persists, and you're sure that the number is well-formed, " - "please contact us." ) - raise RuntimeError(f"Failed to create call: {response.status} {response.reason}") + else: + raise TwilioException( + f"Twilio failed to create call: {response.status} {response.reason}" + ) response = await response.json() return response["sid"] From 5b5a91faf700574bbd96d46653f7e8aa87f521e1 Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Mon, 24 Jun 2024 17:11:15 -0700 Subject: [PATCH 093/148] separate parameters for urlencode (#579) --- vocode/streaming/transcriber/deepgram_transcriber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index 7af17237a9..eef281d58c 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -166,7 +166,7 @@ def get_deepgram_url(self): 1000, ) # Deepgram recommends using at least 1000ms since the tick period is ~1s url_params.update(extra_params) - return f"{self.ws_url}/v1/listen?{urlencode(url_params)}" + return f"{self.ws_url}/v1/listen?{urlencode(url_params, doseq=True)}" async def _run_loop(self): restarts = 0 From e1574423c945e1e376c276c75c8f1fe55274e2a7 Mon Sep 17 00:00:00 2001 From: Dante Noguez Date: Tue, 25 Jun 2024 14:00:52 -0600 Subject: [PATCH 094/148] add groq agent (#558) --- poetry.lock | 22 +- pyproject.toml | 1 + vocode/streaming/agent/default_factory.py | 6 +- vocode/streaming/agent/groq_agent.py | 241 ++++++++++++++++++++++ vocode/streaming/models/agent.py | 20 +- 5 files changed, 286 insertions(+), 4 deletions(-) create mode 100644 vocode/streaming/agent/groq_agent.py diff --git a/poetry.lock b/poetry.lock index 763cdcb8c7..cedf830a0c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1391,6 +1391,25 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "groq" +version = "0.9.0" +description = "The official Python library for the groq API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "groq-0.9.0-py3-none-any.whl", hash = "sha256:d0e46f4ad645504672bb09c8100af3ced3a7db0d5119dc13e4aca535fc455874"}, + {file = "groq-0.9.0.tar.gz", hash = "sha256:130ed5e35d3acfaab46b9e7a078eeaebf91052f4a9d71f86f87fb319b5fec332"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +typing-extensions = ">=4.7,<5" + [[package]] name = "grpc-google-iam-v1" version = "0.13.0" @@ -3099,7 +3118,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4659,4 +4677,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "4597df1fca08478e2300adee246255ea9852721e74d05871a8b3f854d5f9a85f" +content-hash = "28eaab28f7b9e4592e6ad78a2c2b555341c80e97da245009a7a0f5cdea92ec86" diff --git a/pyproject.toml b/pyproject.toml index e3a01f1d83..60c0c5a692 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ anthropic = "^0.28.0" azure-cognitiveservices-speech = "^1.38.0" elevenlabs = "^1.2.2" fastapi = "^0.111.0" +groq = "^0.9.0" janus = "^1.0.0" jinja2 = "^3.1.4" jsonschema = "^4.22.0" diff --git a/vocode/streaming/agent/default_factory.py b/vocode/streaming/agent/default_factory.py index 7a05c842af..eaa65ee4c5 100644 --- a/vocode/streaming/agent/default_factory.py +++ b/vocode/streaming/agent/default_factory.py @@ -3,6 +3,7 @@ from vocode.streaming.agent.base_agent import BaseAgent from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.agent.echo_agent import EchoAgent +from vocode.streaming.agent.groq_agent import GroqAgent from vocode.streaming.agent.restful_user_implemented_agent import RESTfulUserImplementedAgent from vocode.streaming.models.agent import ( AgentConfig, @@ -10,6 +11,7 @@ ChatGPTAgentConfig, EchoAgentConfig, RESTfulUserImplementedAgentConfig, + GroqAgentConfig ) @@ -23,4 +25,6 @@ def create_agent(self, agent_config: AgentConfig) -> BaseAgent: return RESTfulUserImplementedAgent(agent_config=agent_config) elif isinstance(agent_config, AnthropicAgentConfig): return AnthropicAgent(agent_config=agent_config) - raise Exception("Invalid agent config", agent_config.type) + elif isinstance(agent_config, GroqAgentConfig): + return GroqAgent(agent_config=agent_config) + raise Exception("Invalid agent config", agent_config.type) \ No newline at end of file diff --git a/vocode/streaming/agent/groq_agent.py b/vocode/streaming/agent/groq_agent.py new file mode 100644 index 0000000000..b748f2207d --- /dev/null +++ b/vocode/streaming/agent/groq_agent.py @@ -0,0 +1,241 @@ +import os +import random +from typing import Any, AsyncGenerator, Dict, List, Optional, TypeVar, Union + +import sentry_sdk +from loguru import logger +from groq import AsyncGroq + +from vocode import sentry_span_tags +from vocode.streaming.action.abstract_factory import AbstractActionFactory +from vocode.streaming.action.default_factory import DefaultActionFactory +from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent, StreamedResponse +from vocode.streaming.agent.openai_utils import ( + vector_db_result_to_openai_chat_message, + openai_get_tokens, + get_openai_chat_messages_from_transcript, + merge_event_logs +) +from vocode.streaming.models.transcript import ( + EventLog, + Message, + Transcript, +) +from vocode.streaming.agent.streaming_utils import collate_response_async, stream_response_async +from vocode.streaming.models.actions import FunctionCallActionTrigger +from vocode.streaming.models.agent import GroqAgentConfig +from vocode.streaming.models.events import Sender +from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken +from vocode.streaming.models.transcript import Message +from vocode.streaming.vector_db.factory import VectorDBFactory +from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span + + +class GroqAgent(RespondAgent[GroqAgentConfig]): + groq_client: AsyncGroq + + def __init__( + self, + agent_config: GroqAgentConfig, + action_factory: AbstractActionFactory = DefaultActionFactory(), + vector_db_factory=VectorDBFactory(), + **kwargs, + ): + super().__init__( + agent_config=agent_config, + action_factory=action_factory, + **kwargs, + ) + self.groq_client = AsyncGroq(api_key=os.environ.get("GROQ_API_KEY")) + + if not self.groq_client.api_key: + raise ValueError("GROQ_API_KEY must be set in environment or passed in") + + if self.agent_config.vector_db_config: + self.vector_db = vector_db_factory.create_vector_db(self.agent_config.vector_db_config) + + def get_functions(self): + assert self.agent_config.actions + if not self.action_factory: + return None + return [ + self.action_factory.create_action(action_config).get_openai_function() + for action_config in self.agent_config.actions + if isinstance(action_config.action_trigger, FunctionCallActionTrigger) + ] + + def format_groq_chat_messages_from_transcript( + self, + transcript: Transcript, + prompt_preamble: str, + ) -> List[dict]: + # merge consecutive bot messages + merged_event_logs: List[EventLog] = merge_event_logs(event_logs=transcript.event_logs) + + chat_messages: List[Dict[str, Optional[Any]]] + chat_messages = get_openai_chat_messages_from_transcript( + merged_event_logs=merged_event_logs, + prompt_preamble=prompt_preamble, + ) + + return chat_messages + + def get_chat_parameters(self, messages: Optional[List] = None, use_functions: bool = True): + assert self.transcript is not None + + messages = messages or self.format_groq_chat_messages_from_transcript( + self.transcript, + self.agent_config.prompt_preamble, + ) + + parameters: Dict[str, Any] = { + "messages": messages, + "max_tokens": self.agent_config.max_tokens, + "temperature": self.agent_config.temperature, + "model": self.agent_config.model_name, + } + + if use_functions and self.functions: + parameters["functions"] = self.functions + + return parameters + + async def _create_groq_stream(self, chat_parameters: Dict[str, Any]) -> AsyncGenerator: + try: + stream = await self.groq_client.chat.completions.create(**chat_parameters) + except Exception as e: + logger.error( + f"Error while hitting Groq with chat_parameters: {chat_parameters}", + exc_info=True, + ) + raise e + return stream + + def should_backchannel(self, human_input: str) -> bool: + return ( + not self.is_first_response() + and not human_input.strip().endswith("?") + and random.random() < self.agent_config.backchannel_probability + ) + + def choose_backchannel(self) -> Optional[BotBackchannel]: + backchannel = None + if self.transcript is not None: + last_bot_message: Optional[Message] = None + for event_log in self.transcript.event_logs[::-1]: + if isinstance(event_log, Message) and event_log.sender == Sender.BOT: + last_bot_message = event_log + break + if last_bot_message and last_bot_message.text.strip().endswith("?"): + return BotBackchannel(text=self.post_question_bot_backchannel_randomizer()) + return backchannel + + async def generate_response( + self, + human_input: str, + conversation_id: str, + is_interrupt: bool = False, + bot_was_in_medias_res: bool = False, + ) -> AsyncGenerator[GeneratedResponse, None]: + assert self.transcript is not None + + chat_parameters = {} + if self.agent_config.vector_db_config: + try: + docs_with_scores = await self.vector_db.similarity_search_with_score( + self.transcript.get_last_user_message()[1] + ) + docs_with_scores_str = "\n\n".join( + [ + "Document: " + + doc[0].metadata["source"] + + f" (Confidence: {doc[1]})\n" + + doc[0].lc_kwargs["page_content"].replace(r"\n", "\n") + for doc in docs_with_scores + ] + ) + vector_db_result = ( + f"Found {len(docs_with_scores)} similar documents:\n{docs_with_scores_str}" + ) + messages = self.format_groq_chat_messages_from_transcript( + self.transcript, + self.agent_config.prompt_preamble, + ) + messages.insert(-1, vector_db_result_to_openai_chat_message(vector_db_result)) + chat_parameters = self.get_chat_parameters(messages) + except Exception as e: + logger.error(f"Error while hitting vector db: {e}", exc_info=True) + chat_parameters = self.get_chat_parameters() + else: + chat_parameters = self.get_chat_parameters() + chat_parameters["stream"] = True + + groq_chat_messages: List = chat_parameters.get("messages", []) + + backchannelled = "false" + backchannel: Optional[BotBackchannel] = None + if ( + self.agent_config.use_backchannels + and not bot_was_in_medias_res + and self.should_backchannel(human_input) + ): + backchannel = self.choose_backchannel() + elif self.agent_config.first_response_filler_message and self.is_first_response(): + backchannel = BotBackchannel(text=self.agent_config.first_response_filler_message) + + if backchannel is not None: + # The LLM needs the backchannel context manually - otherwise we're in a race condition + # between sending the response and generating Groq's response + groq_chat_messages.append({"role": "assistant", "content": backchannel.text}) + yield GeneratedResponse( + message=backchannel, + is_interruptible=True, + ) + backchannelled = "true" + + span_tags = sentry_span_tags.value + if span_tags: + span_tags["prior_backchannel"] = backchannelled + sentry_span_tags.set(span_tags) + + first_sentence_total_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.LLM_FIRST_SENTENCE_TOTAL + ) + + ttft_span = sentry_create_span( + sentry_callable=sentry_sdk.start_span, op=CustomSentrySpans.TIME_TO_FIRST_TOKEN + ) + + stream = await self._create_groq_stream(chat_parameters) + + response_generator = collate_response_async + using_input_streaming_synthesizer = ( + self.conversation_state_manager.using_input_streaming_synthesizer() + ) + if using_input_streaming_synthesizer: + response_generator = stream_response_async + async for message in response_generator( + conversation_id=conversation_id, + gen=openai_get_tokens( + stream, + ), + get_functions=True, + sentry_span=ttft_span, + ): + if first_sentence_total_span: + first_sentence_total_span.finish() + + ResponseClass = ( + StreamedResponse if using_input_streaming_synthesizer else GeneratedResponse + ) + MessageType = LLMToken if using_input_streaming_synthesizer else BaseMessage + if isinstance(message, str): + yield ResponseClass( + message=MessageType(text=message), + is_interruptible=True, + ) + else: + yield ResponseClass( + message=message, + is_interruptible=True, + ) \ No newline at end of file diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index 26e5165f1b..f3e907ea3e 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -30,6 +30,11 @@ ANTHROPIC_CLAUDE_3_HAIKU_MODEL_NAME = "claude-3-haiku-20240307" ANTHROPIC_CLAUDE_3_SONNET_MODEL_NAME = "claude-3-sonnet-20240229" ANTHROPIC_CLAUDE_3_OPUS_MODEL_NAME = "claude-3-opus-20240229" +GROQ_DEFAULT_MODEL_NAME = "llama3-70b-8192" +GROQ_LLAMA3_8B_MODEL_NAME = "llama3-8b-8192" +GROQ_LLAMA3_70B_MODEL_NAME = "llama3-70b-8192" +GROQ_MIXTRAL_8X7B_MODEL_NAME = "mixtral-8x7b-32768" +GROQ_GEMMA_7B_MODEL_NAME = "gemma-7b-it" InterruptSensitivity = Literal["low", "high"] @@ -44,6 +49,7 @@ class AgentType(str, Enum): ECHO = "agent_echo" GPT4ALL = "agent_gpt4all" LLAMACPP = "agent_llamacpp" + GROQ = "agent_groq" INFORMATION_RETRIEVAL = "agent_information_retrieval" RESTFUL_USER_IMPLEMENTED = "agent_restful_user_implemented" WEBSOCKET_USER_IMPLEMENTED = "agent_websocket_user_implemented" @@ -145,6 +151,18 @@ class ChatVertexAIAgentConfig(AgentConfig, type=AgentType.CHAT_VERTEX_AI.value): model_name: str = CHAT_VERTEX_AI_DEFAULT_MODEL_NAME generate_responses: bool = False # Google Vertex AI doesn't support streaming +class GroqAgentConfig(AgentConfig, type=AgentType.GROQ.value): # type: ignore + groq_api_key: Optional[str] = None + prompt_preamble: str + model_name: str = GROQ_DEFAULT_MODEL_NAME + temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE + max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS + vector_db_config: Optional[VectorDBConfig] = None + # TODO: the below fields should moved up to AgentConfig, and their logic should live in BaseAgent + use_backchannels: bool = False + backchannel_probability: float = 0.7 + first_response_filler_message: Optional[str] = None + class InformationRetrievalAgentConfig( AgentConfig, type=AgentType.INFORMATION_RETRIEVAL.value # type: ignore @@ -198,4 +216,4 @@ class RESTfulAgentText(RESTfulAgentOutput, type=RESTfulAgentOutputType.TEXT): # class RESTfulAgentEnd(RESTfulAgentOutput, type=RESTfulAgentOutputType.END): # type: ignore - pass + pass \ No newline at end of file From fae3ff243cc1680a278eee994ed58c278d2998ed Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 26 Jun 2024 15:20:48 -0700 Subject: [PATCH 095/148] fix up logging when sentry does not sample every transaction (#581) --- vocode/utils/sentry_utils.py | 68 +++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/vocode/utils/sentry_utils.py b/vocode/utils/sentry_utils.py index 5514a2c0d3..85df74e6d6 100644 --- a/vocode/utils/sentry_utils.py +++ b/vocode/utils/sentry_utils.py @@ -51,6 +51,18 @@ def is_present(cls, value): return False +class TransactionNotSampled(Exception): + pass + + +class NoMatchingSpan(Exception): + pass + + +class MissingTransaction(Exception): + pass + + class SentryConfiguredContextManager: """ A context manager that only executes a function if Sentry is configured. @@ -162,44 +174,44 @@ def set_tags(span: Span) -> Span: @sentry_configured -def get_span_by_op(op_value): +def get_span_by_op(op_value) -> Span: transaction: Transaction = sentry_sdk.Hub.current.scope.transaction or sentry_transaction.value - if transaction is not None and transaction._span_recorder is not None: - # Probably not great accessing an internal variable but transaction spans aren't - # exposed publicly so it is what it is. - span_matches = [ - span - for span in transaction._span_recorder.spans - if span.op == op_value and span.timestamp is None - ] - if span_matches: - most_recent_span = max( - span_matches, key=lambda span: span.start_timestamp, default=None - ) - if most_recent_span is not None: - return set_tags(most_recent_span) - else: - # If no span with the matching op was found - logger.warning(f"No span found with op '{op_value}'.") - return None - else: - if transaction and transaction._span_recorder is None: - logger.warning(f"Transaction Span Recorder Missing -- {transaction}") - else: - logger.warning("No active transaction found.") - return None + if transaction is None: + raise MissingTransaction("No transaction found.") + elif not transaction.sampled: + raise TransactionNotSampled("Transaction is not sampled.") + elif not transaction._span_recorder: + raise MissingTransaction("No span recorder found.") + # Probably not great accessing an internal variable but transaction spans aren't + # exposed publicly so it is what it is. + span_matches = [ + span + for span in transaction._span_recorder.spans + if span.op == op_value and span.timestamp is None + ] + if span_matches: + most_recent_span = max(span_matches, key=lambda span: span.start_timestamp, default=None) + if most_recent_span is not None: + return set_tags(most_recent_span) + raise NoMatchingSpan(f"No span found with op '{op_value}'.") @sentry_configured def complete_span_by_op(op_value): try: span = get_span_by_op(op_value) + except TransactionNotSampled as e: + logger.debug(f"Transaction not sampled") + return None + except NoMatchingSpan: + logger.error(f"No matching span found for op '{op_value}'") + return None + except MissingTransaction as e: + logger.error(f"Missing top level transaction: {e}") + return except Exception as e: logger.error(f"Error getting span by op '{op_value}': {e}") return None - if span is None: - logger.warning(f"No span found with op '{op_value}'.") - return None span.finish() From 8f19e47ac5e51348140f8084503b7c3cd4956a83 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 26 Jun 2024 15:23:10 -0700 Subject: [PATCH 096/148] chores (#583) --- .github/workflows/test.yml | 2 +- Makefile | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 609b85d673..84f6eed24d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, vocode-core-0.1.0] jobs: build: diff --git a/Makefile b/Makefile index c7dcc8ccfc..3c8d26f713 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,6 @@ lint lint_diff: typecheck: poetry run mypy -p vocode poetry run mypy -p quickstarts - poetry run mypy -p apps poetry run mypy -p playground typecheck_diff: From b52d11c79e692bbfb3d91bdc2d26b0fad7f2dc27 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 26 Jun 2024 15:31:45 -0700 Subject: [PATCH 097/148] removes groq from default factory (#584) --- vocode/streaming/agent/default_factory.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/vocode/streaming/agent/default_factory.py b/vocode/streaming/agent/default_factory.py index eaa65ee4c5..7a05c842af 100644 --- a/vocode/streaming/agent/default_factory.py +++ b/vocode/streaming/agent/default_factory.py @@ -3,7 +3,6 @@ from vocode.streaming.agent.base_agent import BaseAgent from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.agent.echo_agent import EchoAgent -from vocode.streaming.agent.groq_agent import GroqAgent from vocode.streaming.agent.restful_user_implemented_agent import RESTfulUserImplementedAgent from vocode.streaming.models.agent import ( AgentConfig, @@ -11,7 +10,6 @@ ChatGPTAgentConfig, EchoAgentConfig, RESTfulUserImplementedAgentConfig, - GroqAgentConfig ) @@ -25,6 +23,4 @@ def create_agent(self, agent_config: AgentConfig) -> BaseAgent: return RESTfulUserImplementedAgent(agent_config=agent_config) elif isinstance(agent_config, AnthropicAgentConfig): return AnthropicAgent(agent_config=agent_config) - elif isinstance(agent_config, GroqAgentConfig): - return GroqAgent(agent_config=agent_config) - raise Exception("Invalid agent config", agent_config.type) \ No newline at end of file + raise Exception("Invalid agent config", agent_config.type) From 486eceef0d87e674a17ffa11097c01257336b34b Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 26 Jun 2024 15:57:32 -0700 Subject: [PATCH 098/148] make groq optional (#585) --- poetry.lock | 9 +++++---- pyproject.toml | 7 +++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index cedf830a0c..28a3e98faa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1395,7 +1395,7 @@ test = ["objgraph", "psutil"] name = "groq" version = "0.9.0" description = "The official Python library for the groq API" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "groq-0.9.0-py3-none-any.whl", hash = "sha256:d0e46f4ad645504672bb09c8100af3ced3a7db0d5119dc13e4aca535fc455874"}, @@ -3118,6 +3118,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -4667,7 +4668,7 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke 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)"] [extras] -all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "pvkoala", "twilio", "vonage"] +all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "groq", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "pvkoala", "twilio", "vonage"] langchain = ["langchain", "langchain-community"] langchain-extras = ["langchain-anthropic", "langchain-google-vertexai", "langchain-openai"] synthesizers = ["cartesia", "google-cloud-texttospeech", "pvkoala"] @@ -4677,4 +4678,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "28eaab28f7b9e4592e6ad78a2c2b555341c80e97da245009a7a0f5cdea92ec86" +content-hash = "e56040c6bd76616232f8ef2b371771ee098c6a12fd57228c0b0ab2a0d24e3e58" diff --git a/pyproject.toml b/pyproject.toml index 60c0c5a692..3466af1b0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,6 @@ anthropic = "^0.28.0" azure-cognitiveservices-speech = "^1.38.0" elevenlabs = "^1.2.2" fastapi = "^0.111.0" -groq = "^0.9.0" janus = "^1.0.0" jinja2 = "^3.1.4" jsonschema = "^4.22.0" @@ -38,6 +37,9 @@ uvicorn = "^0.30.0" websockets = "^12.0" nltk = "^3.8.1" +# LLM Providers +groq = { version = "^0.9.0", optional = true } + # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } pvkoala = { version = "^2.0.1", optional = true } @@ -101,7 +103,8 @@ all = [ "langchain-openai", "langchain-anthropic", "langchain-google-vertexai", - "cartesia" + "cartesia", + "groq" ] [tool.mypy] From 28ead9f643bde02466a28344f5ac2ea09a4d03cf Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 27 Jun 2024 09:58:46 -0700 Subject: [PATCH 099/148] switch no matching span to logger.warning (#588) --- vocode/utils/sentry_utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vocode/utils/sentry_utils.py b/vocode/utils/sentry_utils.py index 85df74e6d6..23c1f17baf 100644 --- a/vocode/utils/sentry_utils.py +++ b/vocode/utils/sentry_utils.py @@ -204,11 +204,12 @@ def complete_span_by_op(op_value): logger.debug(f"Transaction not sampled") return None except NoMatchingSpan: - logger.error(f"No matching span found for op '{op_value}'") + # TODO: Fix sentry running out of span depth + logger.warning(f"No matching span found for op '{op_value}'") return None except MissingTransaction as e: logger.error(f"Missing top level transaction: {e}") - return + return None except Exception as e: logger.error(f"Error getting span by op '{op_value}': {e}") return None From f1d688b708abd6bc5fe6337c5863f5296c5cbac7 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 27 Jun 2024 12:03:54 -0700 Subject: [PATCH 100/148] [DOW-118] set up code linting and tests (#589) * adds github workflow * run black * run isort * adds precommit * adds vscode settings --- .github/workflows/test.yml | 74 +++++++++++++----- .pre-commit-config.yaml | 52 ++++++++++--- .vscode/extensions.json | 8 ++ .vscode/settings.json | 16 ++++ apps/langchain_agent/call_transcript_utils.py | 12 +-- apps/langchain_agent/main.py | 17 ++--- apps/langchain_agent/telephony_app.py | 15 ++-- apps/langchain_agent/tools/contacts.py | 1 + apps/langchain_agent/tools/vocode.py | 17 +++-- apps/langchain_agent/tools/word_of_the_day.py | 3 +- apps/telegram_bot/main.py | 75 ++++++------------- apps/voice_rag/main.py | 22 ++---- pyproject.toml | 2 - tests/streaming/action/test_dtmf.py | 2 +- .../streaming/action/test_end_conversation.py | 2 +- .../streaming/action/test_external_actions.py | 2 +- tests/streaming/action/test_record_email.py | 2 +- tests/streaming/action/test_transfer_call.py | 2 +- .../streaming/test_streaming_conversation.py | 2 +- vocode/streaming/action/transfer_call.py | 6 +- vocode/streaming/agent/anthropic_utils.py | 3 +- vocode/streaming/agent/groq_agent.py | 21 ++---- vocode/streaming/agent/langchain_agent.py | 5 +- vocode/streaming/models/agent.py | 11 ++- vocode/streaming/models/synthesizer.py | 5 +- vocode/streaming/models/transcriber.py | 5 +- vocode/streaming/models/websocket.py | 3 +- .../output_device/file_output_device.py | 3 +- .../streaming/output_device/speaker_output.py | 3 +- .../synthesizer/cartesia_synthesizer.py | 30 +++----- .../streaming/synthesizer/default_factory.py | 1 + .../telephony/server/router/calls.py | 4 +- 32 files changed, 234 insertions(+), 192 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 84f6eed24d..7793ca8d4a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,51 +6,87 @@ on: pull_request: branches: [main, vocode-core-0.1.0] +env: + poetry-version: "1.8.3" + jobs: - build: + lint: strategy: fail-fast: false matrix: python-version: - "3.10" - "3.11" - poetry-version: - - "1.7.1" runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Install ffmpeg + run: | + sudo apt-get update + sudo apt-get install -y ffmpeg + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} + - name: Set up Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: ${{ env.poetry-version }} + + - name: Install dependencies + run: poetry install -E all + + - name: Run mypy + run: | + poetry run mypy -p vocode + poetry run mypy -p quickstarts + poetry run mypy -p playground + + - name: Run black + if: success() || failure() + run: poetry run black --check . + + - name: Run isort + shell: bash + if: success() || failure() + run: poetry run isort --check . + + pytest: + strategy: + fail-fast: false + matrix: + python-version: + - "3.10" + - "3.11" + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Install ffmpeg run: | sudo apt-get update sudo apt-get install -y ffmpeg - - name: Install poetry ${{ matrix.poetry-version }} - run: | - python -m ensurepip - python -m pip install --upgrade pip - python -m pip install poetry==${{ matrix.poetry-version }} + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} - - name: View poetry --help - run: poetry --help + - name: Set up Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: ${{ env.poetry-version }} - name: Install dependencies - shell: bash - run: python -m poetry install -E all - - - name: Lint with mypy - run: | - python -m poetry run mypy -p vocode - python -m poetry run mypy -p quickstarts - python -m poetry run mypy -p playground + run: poetry install -E all - name: Test with pytest run: | - python -m poetry run python -m pytest -v tests + poetry run pytest -v tests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7b36c0a0bd..ca2336177e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,41 @@ +default_language_version: + python: python3.10 + repos: - - repo: https://github.com/psf/black - rev: 24.4.2 - hooks: - - id: black - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.8.0 - hooks: - - id: mypy - args: [--ignore-missing-imports, ./] - language: system - pass_filenames: false - stages: [pre-push] +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-ast + - id: trailing-whitespace + - id: check-toml + - id: end-of-file-fixer + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks + - id: detect-private-key + - id: mixed-line-ending + args: + - --fix=lf + +- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks + rev: v2.13.0 + hooks: + - id: pretty-format-yaml + args: + - --autofix + - --preserve-quotes + - --indent=2 + +- repo: https://github.com/pycqa/isort + rev: 5.13.2 + hooks: + - id: isort + args: + - --settings-path=./pyproject.toml + +- repo: https://github.com/psf/black-pre-commit-mirror + rev: 24.4.2 + hooks: + - id: black + args: + - --config=./pyproject.toml diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..9301ecc725 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "ms-python.black-formatter", + "ms-python.isort", + "ms-python.python", + "ms-python.vscode-pylance" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..5353050c8e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + } + }, + "black-formatter.args": ["--config", "./pyproject.toml"], + "isort.args": ["--settings-path", "./pyproject.toml"], + "rewrap.autoWrap.enabled": true, + "rewrap.wrappingColumn": 100, + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "isort.check": true +} diff --git a/apps/langchain_agent/call_transcript_utils.py b/apps/langchain_agent/call_transcript_utils.py index ce0764cf1a..cfbb0d4c76 100644 --- a/apps/langchain_agent/call_transcript_utils.py +++ b/apps/langchain_agent/call_transcript_utils.py @@ -5,17 +5,13 @@ def add_transcript(conversation_id: str, transcript: str) -> None: - transcript_path = os.path.join( - CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id) - ) + transcript_path = os.path.join(CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id)) with open(transcript_path, "a") as f: f.write(transcript) def get_transcript(conversation_id: str) -> Optional[str]: - transcript_path = os.path.join( - CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id) - ) + transcript_path = os.path.join(CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id)) if os.path.exists(transcript_path): with open(transcript_path, "r") as f: return f.read() @@ -23,9 +19,7 @@ def get_transcript(conversation_id: str) -> Optional[str]: def delete_transcript(conversation_id: str) -> bool: - transcript_path = os.path.join( - CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id) - ) + transcript_path = os.path.join(CALL_TRANSCRIPTS_DIR, "{}.txt".format(conversation_id)) if os.path.exists(transcript_path): os.remove(transcript_path) return True diff --git a/apps/langchain_agent/main.py b/apps/langchain_agent/main.py index ea76ced6c4..e51e0d0d56 100644 --- a/apps/langchain_agent/main.py +++ b/apps/langchain_agent/main.py @@ -1,32 +1,27 @@ import os import sys import typing -from dotenv import load_dotenv +from dotenv import load_dotenv +from langchain.memory import ConversationBufferMemory +from stdout_filterer import RedactPhoneNumbers from tools.contacts import get_all_contacts from tools.vocode import call_phone_number from tools.word_of_the_day import word_of_the_day + from vocode.turn_based.synthesizer.azure_synthesizer import AzureSynthesizer from vocode.turn_based.synthesizer.gtts_synthesizer import GTTSSynthesizer -from langchain.memory import ConversationBufferMemory - - -from stdout_filterer import RedactPhoneNumbers load_dotenv() +from langchain.agents import AgentType, initialize_agent from langchain.chat_models import ChatOpenAI -from langchain.agents import initialize_agent -from langchain.agents import AgentType if __name__ == "__main__": # Redirect stdout to our custom class sys.stdout = typing.cast(typing.TextIO, RedactPhoneNumbers(sys.stdout)) - OBJECTIVE = ( - input("Objective: ") - or "Find a random person in my contacts and tell them a joke" - ) + OBJECTIVE = input("Objective: ") or "Find a random person in my contacts and tell them a joke" llm = ChatOpenAI(temperature=0, model_name="gpt-4") # type: ignore memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True) # Logging of LLMChains diff --git a/apps/langchain_agent/telephony_app.py b/apps/langchain_agent/telephony_app.py index 3dc6edcfb0..3c4a5a15f5 100644 --- a/apps/langchain_agent/telephony_app.py +++ b/apps/langchain_agent/telephony_app.py @@ -1,19 +1,16 @@ import logging import os import typing + +from call_transcript_utils import add_transcript +from dotenv import load_dotenv from fastapi import FastAPI + from vocode.streaming.models.events import Event, EventType from vocode.streaming.models.transcript import TranscriptCompleteEvent -from vocode.streaming.utils import events_manager - -from vocode.streaming.telephony.config_manager.redis_config_manager import ( - RedisConfigManager, -) +from vocode.streaming.telephony.config_manager.redis_config_manager import RedisConfigManager from vocode.streaming.telephony.server.base import TelephonyServer - -from call_transcript_utils import add_transcript - -from dotenv import load_dotenv +from vocode.streaming.utils import events_manager load_dotenv() diff --git a/apps/langchain_agent/tools/contacts.py b/apps/langchain_agent/tools/contacts.py index 5c36970dc4..06fe25bfd6 100644 --- a/apps/langchain_agent/tools/contacts.py +++ b/apps/langchain_agent/tools/contacts.py @@ -1,4 +1,5 @@ from typing import List + from langchain.agents import tool CONTACTS = [{"name": "Ajay", "phone": "+15555555555"}] diff --git a/apps/langchain_agent/tools/vocode.py b/apps/langchain_agent/tools/vocode.py index 480dda581e..2dedd2ae93 100644 --- a/apps/langchain_agent/tools/vocode.py +++ b/apps/langchain_agent/tools/vocode.py @@ -1,24 +1,25 @@ -import logging import asyncio +import logging import os -from langchain.agents import tool + +from call_transcript_utils import delete_transcript, get_transcript from dotenv import load_dotenv +from langchain.agents import tool from vocode.streaming.models.message import BaseMessage -from call_transcript_utils import delete_transcript, get_transcript load_dotenv() -from vocode.streaming.telephony.conversation.outbound_call import OutboundCall -from vocode.streaming.telephony.config_manager.redis_config_manager import ( - RedisConfigManager, -) -from vocode.streaming.models.agent import ChatGPTAgentConfig import time +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.telephony.config_manager.redis_config_manager import RedisConfigManager +from vocode.streaming.telephony.conversation.outbound_call import OutboundCall + LOOP = asyncio.new_event_loop() asyncio.set_event_loop(LOOP) + @tool("call phone number") def call_phone_number(input: str) -> str: """calls a phone number as a bot and returns a transcript of the conversation. diff --git a/apps/langchain_agent/tools/word_of_the_day.py b/apps/langchain_agent/tools/word_of_the_day.py index a7979633cb..4e394f00ea 100644 --- a/apps/langchain_agent/tools/word_of_the_day.py +++ b/apps/langchain_agent/tools/word_of_the_day.py @@ -1,6 +1,7 @@ from typing import List -from langchain.agents import tool + import requests +from langchain.agents import tool WORDNIK_URL_WITH_KEY = "https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key=d52b63b6880f17811310d0fbd3b0d3a8ef163a248f58dc831" diff --git a/apps/telegram_bot/main.py b/apps/telegram_bot/main.py index 673c417dcf..eee626a0aa 100644 --- a/apps/telegram_bot/main.py +++ b/apps/telegram_bot/main.py @@ -1,34 +1,29 @@ +import inspect import io +import logging import os import pickle -import logging -import inspect from collections import defaultdict +from typing import Dict, List, Optional, Tuple, Type, Union + +from dotenv import load_dotenv from pydantic.v1 import BaseModel -from typing import Tuple, Union, Optional, Dict, Type, List from pydub import AudioSegment from telegram import Update -from telegram.ext import ( - ApplicationBuilder, - ContextTypes, - CommandHandler, - MessageHandler, - filters, -) -from vocode.turn_based.transcriber import WhisperTranscriber, BaseTranscriber -from vocode.turn_based.agent import ChatGPTAgent, BaseAgent +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes, MessageHandler, filters + +from vocode.turn_based.agent import BaseAgent, ChatGPTAgent from vocode.turn_based.synthesizer import ( + AzureSynthesizer, + BaseSynthesizer, CoquiSynthesizer, - StreamElementsSynthesizer, + CoquiTTSSynthesizer, ElevenLabsSynthesizer, PlayHtSynthesizer, - AzureSynthesizer, - CoquiTTSSynthesizer, RimeSynthesizer, - BaseSynthesizer, + StreamElementsSynthesizer, ) - -from dotenv import load_dotenv +from vocode.turn_based.transcriber import BaseTranscriber, WhisperTranscriber load_dotenv() @@ -70,9 +65,7 @@ supported_classes ), "supported_classes must match the keys of voice_attr_of!" -assert ( - type(SYNTH) in voice_attr_of.keys() -), "Synthesizer class must be one of the supported ones!" +assert type(SYNTH) in voice_attr_of.keys(), "Synthesizer class must be one of the supported ones!" # Check voice_attr_of is correct by asserting all classes have their corresponding value as a parameter in the init function for key, value in voice_attr_of.items(): assert value in inspect.signature(key.__init__).parameters @@ -93,9 +86,7 @@ class Voice(BaseModel): class Chat(BaseModel): voices: List[Voice] = DEFAULT_VOICES # List of available voices for the chat current_voice: Voice = DEFAULT_VOICES[0] # Current voice for the chat - current_conversation: Optional[ - bytes - ] = None # Current conversation as a pickled object + current_conversation: Optional[bytes] = None # Current conversation as a pickled object class VocodeBotResponder: @@ -149,9 +140,7 @@ async def get_response( voice_description = user.current_voice.description # If we have a Coqui voice prompt, use that. Otherwise, set ID as synthesizer expects. - if voice_description is not None and isinstance( - self.synthesizer, CoquiSynthesizer - ): + if voice_description is not None and isinstance(self.synthesizer, CoquiSynthesizer): self.synthesizer.voice_prompt = voice_description elif voice_id is not None: setattr(self.synthesizer, voice_attr_of[type(self.synthesizer)], voice_id) @@ -172,9 +161,7 @@ async def handle_telegram_start( start_text = """ I'm a voice chatbot, send a voice message to me and I'll send one back!" Use /help to see available commands. """ - await context.bot.send_message( - chat_id=update.effective_chat.id, text=start_text - ) + await context.bot.send_message(chat_id=update.effective_chat.id, text=start_text) async def handle_telegram_message( self, update: Update, context: ContextTypes.DEFAULT_TYPE @@ -183,9 +170,7 @@ async def handle_telegram_message( chat_id = update.effective_chat.id # Accept text or voice messages if update.message and update.message.voice: - user_telegram_voice = await context.bot.get_file( - update.message.voice.file_id - ) + user_telegram_voice = await context.bot.get_file(update.message.voice.file_id) bytes = await user_telegram_voice.download_as_bytearray() # convert audio bytes to numpy array input = AudioSegment.from_file( @@ -206,9 +191,7 @@ async def handle_telegram_message( agent_response, synth_response = await self.get_response(int(chat_id), input) out_voice = io.BytesIO() synth_response.export(out_f=out_voice, format="ogg", codec="libopus") # type: ignore - await context.bot.send_message( - chat_id=update.effective_chat.id, text=agent_response - ) + await context.bot.send_message(chat_id=update.effective_chat.id, text=agent_response) await context.bot.send_voice(chat_id=str(chat_id), voice=out_voice) async def handle_telegram_select_voice( @@ -235,9 +218,7 @@ async def handle_telegram_select_voice( self.db[chat_id].current_voice = user_voices[new_voice_id] # Reset conversation self.db[chat_id].current_conversation = None - await context.bot.send_message( - chat_id=chat_id, text="Voice changed successfully!" - ) + await context.bot.send_message(chat_id=chat_id, text="Voice changed successfully!") async def handle_telegram_create_voice( self, update: Update, context: ContextTypes.DEFAULT_TYPE @@ -266,9 +247,7 @@ async def handle_telegram_create_voice( # Reset conversation self.db[chat_id].current_conversation = None - await context.bot.send_message( - chat_id=chat_id, text="Voice changed successfully!" - ) + await context.bot.send_message(chat_id=chat_id, text="Voice changed successfully!") async def handle_telegram_list_voices( self, update: Update, context: ContextTypes.DEFAULT_TYPE @@ -287,9 +266,7 @@ async def handle_telegram_list_voices( chat_id=chat_id, text=f"Available voices:\n{voices_formatted}" ) - async def handle_telegram_who( - self, update: Update, context: ContextTypes.DEFAULT_TYPE - ) -> None: + async def handle_telegram_who(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: assert update.effective_chat, "Chat must be defined!" chat_id = update.effective_chat.id current_voice = self.db[chat_id].current_voice @@ -334,15 +311,11 @@ async def handle_telegram_unknown_cmd( voco = VocodeBotResponder(transcriber, SYSTEM_PROMPT, SYNTH) application = ApplicationBuilder().token(os.environ["TELEGRAM_BOT_KEY"]).build() application.add_handler(CommandHandler("start", voco.handle_telegram_start)) - application.add_handler( - MessageHandler(~filters.COMMAND, voco.handle_telegram_message) - ) + application.add_handler(MessageHandler(~filters.COMMAND, voco.handle_telegram_message)) application.add_handler(CommandHandler("create", voco.handle_telegram_create_voice)) application.add_handler(CommandHandler("voice", voco.handle_telegram_select_voice)) application.add_handler(CommandHandler("list", voco.handle_telegram_list_voices)) application.add_handler(CommandHandler("who", voco.handle_telegram_who)) application.add_handler(CommandHandler("help", voco.handle_telegram_help)) - application.add_handler( - MessageHandler(filters.COMMAND, voco.handle_telegram_unknown_cmd) - ) + application.add_handler(MessageHandler(filters.COMMAND, voco.handle_telegram_unknown_cmd)) application.run_polling() diff --git a/apps/voice_rag/main.py b/apps/voice_rag/main.py index 3460df8913..0c3b04deb3 100644 --- a/apps/voice_rag/main.py +++ b/apps/voice_rag/main.py @@ -1,25 +1,19 @@ -import os import logging -from fastapi import FastAPI +import os -from vocode.streaming.models.agent import ChatGPTAgentConfig -from vocode.streaming.models.synthesizer import AzureSynthesizerConfig -from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from dotenv import load_dotenv +from fastapi import FastAPI from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent from vocode.streaming.client_backend.conversation import ConversationRouter +from vocode.streaming.models.agent import ChatGPTAgentConfig from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, TimeEndpointingConfig +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber from vocode.streaming.vector_db.factory import VectorDBFactory from vocode.streaming.vector_db.pinecone import PineconeConfig -from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber - - -from vocode.streaming.models.transcriber import ( - DeepgramTranscriberConfig, - TimeEndpointingConfig, -) - -from dotenv import load_dotenv load_dotenv() diff --git a/pyproject.toml b/pyproject.toml index 3466af1b0f..2110da3b70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,8 +122,6 @@ ENVIRONMENT = "test" AZURE_OPENAI_API_BASE_EAST_US = "https://api.openai.com" AZURE_OPENAI_API_KEY_EAST_US = "test" -[tool.coverage.run] -omit = ["tests/*"] [tool.black] line-length = 100 diff --git a/tests/streaming/action/test_dtmf.py b/tests/streaming/action/test_dtmf.py index 1f7097086a..24050c0525 100644 --- a/tests/streaming/action/test_dtmf.py +++ b/tests/streaming/action/test_dtmf.py @@ -1,7 +1,7 @@ import pytest from aioresponses import aioresponses -from tests.fakedata.id import generate_uuid +from tests.fakedata.id import generate_uuid from vocode.streaming.action.dtmf import ( DTMFParameters, DTMFVocodeActionConfig, diff --git a/tests/streaming/action/test_end_conversation.py b/tests/streaming/action/test_end_conversation.py index 44cfb5109d..312c72285b 100644 --- a/tests/streaming/action/test_end_conversation.py +++ b/tests/streaming/action/test_end_conversation.py @@ -6,8 +6,8 @@ import pytest from pydantic.v1 import BaseModel from pytest_mock import MockerFixture -from tests.fakedata.id import generate_uuid +from tests.fakedata.id import generate_uuid from vocode.streaming.action.end_conversation import ( EndConversation, EndConversationParameters, diff --git a/tests/streaming/action/test_external_actions.py b/tests/streaming/action/test_external_actions.py index 53eb3a4775..315f670d9f 100644 --- a/tests/streaming/action/test_external_actions.py +++ b/tests/streaming/action/test_external_actions.py @@ -3,8 +3,8 @@ import os import pytest -from tests.fakedata.id import generate_uuid +from tests.fakedata.id import generate_uuid from vocode.streaming.action.execute_external_action import ( ExecuteExternalAction, ExecuteExternalActionParameters, diff --git a/tests/streaming/action/test_record_email.py b/tests/streaming/action/test_record_email.py index 1b66dc156c..7864dd37ff 100644 --- a/tests/streaming/action/test_record_email.py +++ b/tests/streaming/action/test_record_email.py @@ -1,6 +1,6 @@ import pytest -from tests.fakedata.id import generate_uuid +from tests.fakedata.id import generate_uuid from vocode.streaming.action.record_email import ( RecordEmail, RecordEmailParameters, diff --git a/tests/streaming/action/test_transfer_call.py b/tests/streaming/action/test_transfer_call.py index afa3f932f0..f4111d877e 100644 --- a/tests/streaming/action/test_transfer_call.py +++ b/tests/streaming/action/test_transfer_call.py @@ -6,8 +6,8 @@ import pytest from aioresponses import aioresponses from pytest_mock import MockerFixture -from tests.fakedata.id import generate_uuid +from tests.fakedata.id import generate_uuid from vocode.streaming.action.transfer_call import ( TransferCallEmptyParameters, TransferCallVocodeActionConfig, diff --git a/tests/streaming/test_streaming_conversation.py b/tests/streaming/test_streaming_conversation.py index e38b6efadc..4299438376 100644 --- a/tests/streaming/test_streaming_conversation.py +++ b/tests/streaming/test_streaming_conversation.py @@ -5,12 +5,12 @@ import pytest from pydantic.v1 import BaseModel from pytest_mock import MockerFixture + from tests.fakedata.conversation import ( DEFAULT_CHAT_GPT_AGENT_CONFIG, create_fake_agent, create_fake_streaming_conversation, ) - from vocode.streaming.models.actions import ActionInput from vocode.streaming.models.agent import InterruptSensitivity from vocode.streaming.models.events import Sender diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index 48500ae97f..397dd7a4ef 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -1,4 +1,4 @@ -from typing import Literal, Type, Optional, Union, get_args +from typing import Literal, Optional, Type, Union, get_args from loguru import logger from pydantic.v1 import BaseModel, Field @@ -33,7 +33,9 @@ class TransferCallResponse(BaseModel): class TransferCallVocodeActionConfig(VocodeActionConfig, type="action_transfer_call"): # type: ignore - phone_number: Optional[str] = Field(None, description="The phone number to transfer the call to") + phone_number: Optional[str] = Field( + None, description="The phone number to transfer the call to" + ) def get_phone_number(self, input: ActionInput) -> str: if isinstance(input.params, TransferCallRequiredParameters): diff --git a/vocode/streaming/agent/anthropic_utils.py b/vocode/streaming/agent/anthropic_utils.py index 54cefa972c..78d992d24f 100644 --- a/vocode/streaming/agent/anthropic_utils.py +++ b/vocode/streaming/agent/anthropic_utils.py @@ -28,6 +28,7 @@ def format_anthropic_chat_messages_from_transcript( ] # TODO: reliably count tokens of Anthropic messages so that we don't exceed the context window + def merge_bot_messages_for_langchain(messages: list[tuple]) -> list[tuple]: merged_messages: list[tuple] = [] for role, message in messages: @@ -35,4 +36,4 @@ def merge_bot_messages_for_langchain(messages: list[tuple]) -> list[tuple]: merged_messages[-1] = ("ai", merged_messages[-1][1] + message) else: merged_messages.append((role, message)) - return merged_messages \ No newline at end of file + return merged_messages diff --git a/vocode/streaming/agent/groq_agent.py b/vocode/streaming/agent/groq_agent.py index b748f2207d..bd4a170396 100644 --- a/vocode/streaming/agent/groq_agent.py +++ b/vocode/streaming/agent/groq_agent.py @@ -3,30 +3,25 @@ from typing import Any, AsyncGenerator, Dict, List, Optional, TypeVar, Union import sentry_sdk -from loguru import logger from groq import AsyncGroq +from loguru import logger from vocode import sentry_span_tags from vocode.streaming.action.abstract_factory import AbstractActionFactory from vocode.streaming.action.default_factory import DefaultActionFactory from vocode.streaming.agent.base_agent import GeneratedResponse, RespondAgent, StreamedResponse from vocode.streaming.agent.openai_utils import ( - vector_db_result_to_openai_chat_message, - openai_get_tokens, get_openai_chat_messages_from_transcript, - merge_event_logs -) -from vocode.streaming.models.transcript import ( - EventLog, - Message, - Transcript, + merge_event_logs, + openai_get_tokens, + vector_db_result_to_openai_chat_message, ) from vocode.streaming.agent.streaming_utils import collate_response_async, stream_response_async from vocode.streaming.models.actions import FunctionCallActionTrigger from vocode.streaming.models.agent import GroqAgentConfig from vocode.streaming.models.events import Sender from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken -from vocode.streaming.models.transcript import Message +from vocode.streaming.models.transcript import EventLog, Message, Transcript from vocode.streaming.vector_db.factory import VectorDBFactory from vocode.utils.sentry_utils import CustomSentrySpans, sentry_create_span @@ -63,7 +58,7 @@ def get_functions(self): for action_config in self.agent_config.actions if isinstance(action_config.action_trigger, FunctionCallActionTrigger) ] - + def format_groq_chat_messages_from_transcript( self, transcript: Transcript, @@ -99,7 +94,7 @@ def get_chat_parameters(self, messages: Optional[List] = None, use_functions: bo parameters["functions"] = self.functions return parameters - + async def _create_groq_stream(self, chat_parameters: Dict[str, Any]) -> AsyncGenerator: try: stream = await self.groq_client.chat.completions.create(**chat_parameters) @@ -238,4 +233,4 @@ async def generate_response( yield ResponseClass( message=message, is_interruptible=True, - ) \ No newline at end of file + ) diff --git a/vocode/streaming/agent/langchain_agent.py b/vocode/streaming/agent/langchain_agent.py index 77045cb5e7..9e41ea03e8 100644 --- a/vocode/streaming/agent/langchain_agent.py +++ b/vocode/streaming/agent/langchain_agent.py @@ -1,12 +1,11 @@ from typing import AsyncGenerator, AsyncIterator, Optional import sentry_sdk -from loguru import logger - +from langchain.chat_models import init_chat_model from langchain_core.messages.base import BaseMessage as LangchainBaseMessage from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables.base import Runnable -from langchain.chat_models import init_chat_model +from loguru import logger from vocode.streaming.action.abstract_factory import AbstractActionFactory from vocode.streaming.action.default_factory import DefaultActionFactory diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index f3e907ea3e..b023e1e234 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -3,11 +3,12 @@ from pydantic.v1 import validator -from .model import BaseModel, TypedModel -from .vector_db import VectorDBConfig from vocode.streaming.models.actions import ActionConfig from vocode.streaming.models.message import BaseMessage +from .model import BaseModel, TypedModel +from .vector_db import VectorDBConfig + FILLER_AUDIO_DEFAULT_SILENCE_THRESHOLD_SECONDS = 0.5 LLM_AGENT_DEFAULT_TEMPERATURE = 1.0 LLM_AGENT_DEFAULT_MAX_TOKENS = 256 @@ -137,7 +138,8 @@ class AnthropicAgentConfig(AgentConfig, type=AgentType.ANTHROPIC.value): # type model_name: str = CHAT_ANTHROPIC_DEFAULT_MODEL_NAME max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE - + + class LangchainAgentConfig(AgentConfig, type=AgentType.LANGCHAIN.value): # type: ignore prompt_preamble: str model_name: str @@ -151,6 +153,7 @@ class ChatVertexAIAgentConfig(AgentConfig, type=AgentType.CHAT_VERTEX_AI.value): model_name: str = CHAT_VERTEX_AI_DEFAULT_MODEL_NAME generate_responses: bool = False # Google Vertex AI doesn't support streaming + class GroqAgentConfig(AgentConfig, type=AgentType.GROQ.value): # type: ignore groq_api_key: Optional[str] = None prompt_preamble: str @@ -216,4 +219,4 @@ class RESTfulAgentText(RESTfulAgentOutput, type=RESTfulAgentOutputType.TEXT): # class RESTfulAgentEnd(RESTfulAgentOutput, type=RESTfulAgentOutputType.END): # type: ignore - pass \ No newline at end of file + pass diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index f1c8c01cbd..eb1032d6c3 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -3,12 +3,13 @@ from pydantic.v1 import validator -from .audio import AudioEncoding, SamplingRate -from .model import BaseModel, TypedModel from vocode.streaming.models.client_backend import OutputAudioConfig from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE +from .audio import AudioEncoding, SamplingRate +from .model import BaseModel, TypedModel + class SynthesizerType(str, Enum): BASE = "synthesizer_base" diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index 857e5b6c01..b67cbd79c0 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -3,8 +3,6 @@ from pydantic.v1 import validator -from .audio import AudioEncoding -from .model import TypedModel from vocode.streaming.input_device.base_input_device import BaseInputDevice from vocode.streaming.models.client_backend import InputAudioConfig from vocode.streaming.models.model import BaseModel @@ -14,6 +12,9 @@ DEFAULT_SAMPLING_RATE, ) +from .audio import AudioEncoding +from .model import TypedModel + AZURE_DEFAULT_LANGUAGE = "en-US" DEEPGRAM_API_WS_URL = "wss://api.deepgram.com" diff --git a/vocode/streaming/models/websocket.py b/vocode/streaming/models/websocket.py index ab1f8e42b2..0629ea19a4 100644 --- a/vocode/streaming/models/websocket.py +++ b/vocode/streaming/models/websocket.py @@ -2,13 +2,14 @@ from enum import Enum from typing import Optional +from vocode.streaming.models.client_backend import InputAudioConfig, OutputAudioConfig + from .agent import AgentConfig from .events import Sender from .model import TypedModel from .synthesizer import SynthesizerConfig from .transcriber import TranscriberConfig from .transcript import TranscriptEvent -from vocode.streaming.models.client_backend import InputAudioConfig, OutputAudioConfig class WebSocketMessageType(str, Enum): diff --git a/vocode/streaming/output_device/file_output_device.py b/vocode/streaming/output_device/file_output_device.py index d9ab22d8dd..65a548facd 100644 --- a/vocode/streaming/output_device/file_output_device.py +++ b/vocode/streaming/output_device/file_output_device.py @@ -4,10 +4,11 @@ import numpy as np -from .base_output_device import BaseOutputDevice from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.utils.worker import ThreadAsyncWorker +from .base_output_device import BaseOutputDevice + class FileWriterWorker(ThreadAsyncWorker): def __init__(self, input_queue: Queue, wave) -> None: diff --git a/vocode/streaming/output_device/speaker_output.py b/vocode/streaming/output_device/speaker_output.py index 34d8be0092..a9a30f82e5 100644 --- a/vocode/streaming/output_device/speaker_output.py +++ b/vocode/streaming/output_device/speaker_output.py @@ -4,9 +4,10 @@ import numpy as np import sounddevice as sd -from .base_output_device import BaseOutputDevice from vocode.streaming.models.audio import AudioEncoding +from .base_output_device import BaseOutputDevice + raise DeprecationWarning("Use BlockingSpeakerOutput instead") diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index 9e1392e6ad..84f779ca07 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -1,6 +1,6 @@ +import hashlib import io import wave -import hashlib from vocode import getenv from vocode.streaming.models.audio import AudioEncoding, SamplingRate @@ -21,16 +21,13 @@ def __init__( try: from cartesia.tts import AsyncCartesiaTTS except ImportError as e: - raise ImportError( - f"Missing required dependancies for CartesiaSynthesizer" - ) from e - + raise ImportError(f"Missing required dependancies for CartesiaSynthesizer") from e + self.cartesia_tts = AsyncCartesiaTTS - + self.api_key = synthesizer_config.api_key or getenv("CARTESIA_API_KEY") if not self.api_key: raise ValueError("Missing Cartesia API key") - if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: self.channel_width = 2 @@ -55,16 +52,13 @@ def __init__( self.output_format = "pcm_16000" self.sampling_rate = 16000 else: - raise ValueError( - f"Unsupported audio encoding {synthesizer_config.audio_encoding}" - ) + raise ValueError(f"Unsupported audio encoding {synthesizer_config.audio_encoding}") self.num_channels = 1 self.model_id = synthesizer_config.model_id self.voice_id = synthesizer_config.voice_id self.client = self.cartesia_tts(api_key=self.api_key) self.voice_embedding = self.client.get_voice_embedding(voice_id=self.voice_id) - async def create_speech_uncached( self, @@ -78,17 +72,17 @@ async def create_speech_uncached( voice=self.voice_embedding, stream=True, model_id=self.model_id, - data_rtype='bytes', - output_format=self.output_format + data_rtype="bytes", + output_format=self.output_format, ) audio_file = io.BytesIO() - with wave.open(audio_file, 'wb') as wav_file: + with wave.open(audio_file, "wb") as wav_file: wav_file.setnchannels(self.num_channels) wav_file.setsampwidth(self.channel_width) wav_file.setframerate(self.sampling_rate) async for chunk in generator: - wav_file.writeframes(chunk['audio']) + wav_file.writeframes(chunk["audio"]) audio_file.seek(0) result = self.create_synthesis_result_from_wav( @@ -99,7 +93,7 @@ async def create_speech_uncached( ) return result - + @classmethod def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): hashed_api_key = hashlib.sha256(f"{synthesizer_config.api_key}".encode("utf-8")).hexdigest() @@ -109,6 +103,6 @@ def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): hashed_api_key, str(synthesizer_config.voice_id), str(synthesizer_config.model_id), - synthesizer_config.audio_encoding + synthesizer_config.audio_encoding, ) - ) \ No newline at end of file + ) diff --git a/vocode/streaming/synthesizer/default_factory.py b/vocode/streaming/synthesizer/default_factory.py index 16574d4e5a..f7ba75685b 100644 --- a/vocode/streaming/synthesizer/default_factory.py +++ b/vocode/streaming/synthesizer/default_factory.py @@ -1,4 +1,5 @@ from typing import Type + from vocode.streaming.models.synthesizer import ( AzureSynthesizerConfig, CartesiaSynthesizerConfig, diff --git a/vocode/streaming/telephony/server/router/calls.py b/vocode/streaming/telephony/server/router/calls.py index 525096945e..5db6af8b0d 100644 --- a/vocode/streaming/telephony/server/router/calls.py +++ b/vocode/streaming/telephony/server/router/calls.py @@ -1,9 +1,10 @@ from typing import Optional +import sentry_sdk from fastapi import APIRouter, HTTPException, WebSocket from loguru import logger -import sentry_sdk +from vocode import sentry_transaction from vocode.streaming.agent.abstract_factory import AbstractAgentFactory from vocode.streaming.agent.default_factory import DefaultAgentFactory from vocode.streaming.models.telephony import BaseCallConfig, TwilioCallConfig, VonageCallConfig @@ -23,7 +24,6 @@ from vocode.streaming.transcriber.default_factory import DefaultTranscriberFactory from vocode.streaming.utils.base_router import BaseRouter from vocode.streaming.utils.events_manager import EventsManager -from vocode import sentry_transaction class CallsRouter(BaseRouter): From c640bc6b7a481b8854835c54087f1d6abbe967e9 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 27 Jun 2024 12:13:03 -0700 Subject: [PATCH 101/148] adds pre-commit guidelines (#590) --- contributing.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/contributing.md b/contributing.md index 69cd6a98c7..a6e0cccb36 100644 --- a/contributing.md +++ b/contributing.md @@ -10,6 +10,12 @@ To install requirements: ```bash poetry install +``` + +Install [`pre-commit`](https://pre-commit.com/) to run linting before pushing, e.g. with Homebrew: + +```bash +brew install pre-commit poetry run pre-commit install ``` From 50318ca438994e12d6dccf94ce9010bb634aa09f Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 3 Jul 2024 08:33:54 -0700 Subject: [PATCH 102/148] creates docker image, updates telephony app deps (#601) --- apps/telephony_app/Dockerfile | 9 +- apps/telephony_app/poetry.lock | 137 +++++++++++++++++++++++++++++- apps/telephony_app/pyproject.toml | 2 + docker/Dockerfile | 8 ++ 4 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 docker/Dockerfile diff --git a/apps/telephony_app/Dockerfile b/apps/telephony_app/Dockerfile index 4223fb77a3..ae57750598 100644 --- a/apps/telephony_app/Dockerfile +++ b/apps/telephony_app/Dockerfile @@ -1,11 +1,4 @@ -FROM python:3.10-bullseye - -# get portaudio and ffmpeg -RUN apt-get update \ - && apt-get install libportaudio2 libportaudiocpp0 portaudio19-dev libasound-dev libsndfile1-dev -y -RUN apt-get -y update -RUN apt-get -y upgrade -RUN apt-get install -y ffmpeg +FROM vocodedev/vocode:latest WORKDIR /code COPY ./pyproject.toml /code/pyproject.toml diff --git a/apps/telephony_app/poetry.lock b/apps/telephony_app/poetry.lock index cd4f85aef8..7208b52ff7 100644 --- a/apps/telephony_app/poetry.lock +++ b/apps/telephony_app/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -412,6 +412,60 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "cryptography" +version = "42.0.8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, + {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, + {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, + {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, + {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, + {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, + {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, + {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, + {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, + {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, + {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, + {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, + {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, + {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "deprecated" version = "1.2.14" @@ -1767,6 +1821,26 @@ grpcio = ">=1.58.0,<2.0.0" protobuf = ">=4.24.3,<5.0.0" requests = ">=2.31.0,<3.0.0" +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + [[package]] name = "pyngrok" version = "7.1.6" @@ -1813,6 +1887,17 @@ 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 = "pyyaml" version = "6.0.1" @@ -2689,6 +2774,54 @@ synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16. telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] +[[package]] +name = "vonage" +version = "3.16.0" +description = "Vonage Server SDK for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, + {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, +] + +[package.dependencies] +Deprecated = "*" +pydantic = ">=2.5.2" +pytz = ">=2018.5" +requests = ">=2.4.2" +vonage-jwt = ">=1.1.0" + +[[package]] +name = "vonage-jwt" +version = "1.1.1" +description = "Tooling for working with JWTs for Vonage APIs in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage_jwt-1.1.1-py3-none-any.whl", hash = "sha256:4b751571e013deeab9f13b68f9e1478d8aa7f0a91f0cb7f6d793fa7b859859df"}, + {file = "vonage_jwt-1.1.1.tar.gz", hash = "sha256:15f4b1cd8fa5909390a4074a909053ae823df0557b1edb9b675d0a013295dc10"}, +] + +[package.dependencies] +pyjwt = {version = ">=1.6.4", extras = ["crypto"]} +vonage-utils = ">=1.1.2" + +[[package]] +name = "vonage-utils" +version = "1.1.2" +description = "Utils package containing objects for use with Vonage APIs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "vonage_utils-1.1.2-py3-none-any.whl", hash = "sha256:a815a8be8f5fdba558d090d0f81b469a2eb0ded4cccbfe4e27dc9276e84c4b7e"}, + {file = "vonage_utils-1.1.2.tar.gz", hash = "sha256:a86c1eafe62e6f82d18dda6fd4dc78c898dea81888b83f18ea75105365307daf"}, +] + +[package.dependencies] +pydantic = ">=2.7.1" +typing-extensions = ">=4.9.0" + [[package]] name = "watchfiles" version = "0.22.0" @@ -3071,4 +3204,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "8afcf31d9adf4f896c839a2e1f2a1f9cd7a538cacc09899f6a5f1e4cea239945" +content-hash = "a283dd73bcbfd3bb9ee561e88d9fd49ac7e4e40e8bad221ccc8486b0e15452b0" diff --git a/apps/telephony_app/pyproject.toml b/apps/telephony_app/pyproject.toml index e6b1c0d477..b32eef8a9a 100644 --- a/apps/telephony_app/pyproject.toml +++ b/apps/telephony_app/pyproject.toml @@ -4,6 +4,7 @@ version = "0.1.0" description = "" authors = ["Your Name "] readme = "README.md" +package-mode = false [tool.poetry.dependencies] python = ">=3.10,<3.12" @@ -11,6 +12,7 @@ pyngrok = "^7.1.6" python-dotenv = "^1.0.1" azure-cognitiveservices-speech = "^1.38.0" vocode = "0.1.113" +vonage = "^3.16.0" [build-system] diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000..6dc2563d61 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,8 @@ +FROM python:3.11-bullseye + +# get portaudio and ffmpeg +RUN apt-get update \ + && apt-get install -y libportaudio2 libportaudiocpp0 portaudio19-dev libasound-dev libsndfile1-dev ffmpeg \ + && apt-get clean + +RUN pip install vocode From 60d21879d76e21a85bd25f9e607f3322eb3d3c45 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 3 Jul 2024 10:55:05 -0700 Subject: [PATCH 103/148] [DOW-105] refactor interruptions into the output device (#586) * [DOW-105] refactor interruptions into the output device (#562) * initial refactor works * remove notion of UtteranceAudioChunk and put all of the state in the callback * move per_chunk_allowance_seconds into output device * onboard onto vonage * rename to abstract output device and onboard other output devices * initial work to onboard twilio output device * twilio conversation works * some cleanup with better comments * unset poetry.lock * move abstract play method into ratelimitoutputdevice + dispatch to thread in fileoutputdevice * rename back to AsyncWorker * comments * work through a bit of mypy * asyncio.gather is g2g: * create interrupt lock * remove todo * remove last todo * remove log for interrupts * fmt * fix mypy * fix mypy * isort * creates first test and adds scaffolding * adds two other send_speech_to_output tests * make send_speech_to_output more efficient * adds tests for rate limit interruptions output device * makes some variables private and also makes the chunk id coming back from the mark match the incoming audio chunk * adds twilio output device tests * make typing better for output devices * fix mypy * resolve PR comments * resolve PR comments --- .../streaming/synthesizer/synthesize.py | 10 +- tests/fakedata/conversation.py | 54 ++++- ..._rate_limit_interruptions_output_device.py | 68 ++++++ .../test_twilio_output_device.py | 139 ++++++++++++ .../streaming/test_streaming_conversation.py | 125 ++++++++++- vocode/helpers.py | 2 +- .../streaming/client_backend/conversation.py | 2 +- vocode/streaming/models/synthesizer.py | 4 +- .../output_device/abstract_output_device.py | 26 +++ vocode/streaming/output_device/audio_chunk.py | 28 +++ .../output_device/base_output_device.py | 16 -- .../output_device/blocking_speaker_output.py | 57 +++-- .../output_device/file_output_device.py | 43 +--- .../rate_limit_interruptions_output_device.py | 70 ++++++ .../streaming/output_device/speaker_output.py | 4 +- .../output_device/twilio_output_device.py | 121 ++++++++--- .../output_device/vonage_output_device.py | 36 ++-- .../output_device/websocket_output_device.py | 27 +-- vocode/streaming/streaming_conversation.py | 199 ++++++++++-------- .../synthesizer/azure_synthesizer.py | 4 +- .../streaming/synthesizer/base_synthesizer.py | 26 ++- .../eleven_labs_websocket_synthesizer.py | 4 +- .../synthesizer/polly_synthesizer.py | 6 +- .../abstract_phone_conversation.py | 2 - .../conversation/mark_message_queue.py | 46 ---- .../conversation/twilio_phone_conversation.py | 150 +------------ .../conversation/vonage_phone_conversation.py | 2 - .../streaming/transcriber/base_transcriber.py | 9 +- vocode/streaming/utils/__init__.py | 9 + vocode/streaming/utils/worker.py | 4 +- ...ut_device.py => abstract_output_device.py} | 8 +- .../output_device/speaker_output.py | 4 +- vocode/turn_based/turn_based_conversation.py | 4 +- 33 files changed, 848 insertions(+), 461 deletions(-) create mode 100644 tests/streaming/output_device/test_rate_limit_interruptions_output_device.py create mode 100644 tests/streaming/output_device/test_twilio_output_device.py create mode 100644 vocode/streaming/output_device/abstract_output_device.py create mode 100644 vocode/streaming/output_device/audio_chunk.py delete mode 100644 vocode/streaming/output_device/base_output_device.py create mode 100644 vocode/streaming/output_device/rate_limit_interruptions_output_device.py delete mode 100644 vocode/streaming/telephony/conversation/mark_message_queue.py rename vocode/turn_based/output_device/{base_output_device.py => abstract_output_device.py} (54%) diff --git a/playground/streaming/synthesizer/synthesize.py b/playground/streaming/synthesizer/synthesize.py index 086169772f..c9431620af 100644 --- a/playground/streaming/synthesizer/synthesize.py +++ b/playground/streaming/synthesizer/synthesize.py @@ -2,11 +2,13 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import AzureSynthesizerConfig -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import AudioChunk from vocode.streaming.output_device.blocking_speaker_output import BlockingSpeakerOutput from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer from vocode.streaming.utils import get_chunk_size_per_second +from vocode.streaming.utils.worker import InterruptibleEvent if __name__ == "__main__": import asyncio @@ -19,7 +21,7 @@ async def speak( synthesizer: BaseSynthesizer, - output_device: BaseOutputDevice, + output_device: AbstractOutputDevice, message: BaseMessage, ): message_sent = message.text @@ -38,7 +40,9 @@ async def speak( try: start_time = time.time() speech_length_seconds = seconds_per_chunk * (len(chunk_result.chunk) / chunk_size) - output_device.consume_nonblocking(chunk_result.chunk) + output_device.consume_nonblocking( + InterruptibleEvent(payload=AudioChunk(data=chunk_result.chunk)) + ) end_time = time.time() await asyncio.sleep( max( diff --git a/tests/fakedata/conversation.py b/tests/fakedata/conversation.py index 25344a006b..69e407d33a 100644 --- a/tests/fakedata/conversation.py +++ b/tests/fakedata/conversation.py @@ -1,3 +1,5 @@ +import asyncio +import time from typing import Optional from pytest_mock import MockerFixture @@ -8,7 +10,8 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import PlayHtSynthesizerConfig, SynthesizerConfig from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, TranscriberConfig -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import ChunkState from vocode.streaming.streaming_conversation import StreamingConversation from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer from vocode.streaming.telephony.constants import DEFAULT_CHUNK_SIZE, DEFAULT_SAMPLING_RATE @@ -36,8 +39,53 @@ ) -class DummyOutputDevice(BaseOutputDevice): - def consume_nonblocking(self, chunk: bytes): +class DummyOutputDevice(AbstractOutputDevice): + + def __init__( + self, + sampling_rate: int, + audio_encoding: AudioEncoding, + wait_for_interrupt: bool = False, + chunks_before_interrupt: int = 1, + ): + super().__init__(sampling_rate, audio_encoding) + self.wait_for_interrupt = wait_for_interrupt + self.chunks_before_interrupt = chunks_before_interrupt + self.interrupt_event = asyncio.Event() + + async def process(self, item): + self.interruptible_event = item + audio_chunk = item.payload + + if item.is_interrupted(): + audio_chunk.on_interrupt() + audio_chunk.state = ChunkState.INTERRUPTED + else: + audio_chunk.on_play() + audio_chunk.state = ChunkState.PLAYED + self.interruptible_event.is_interruptible = False + + async def _run_loop(self): + chunk_counter = 0 + while True: + try: + item = await self.input_queue.get() + except asyncio.CancelledError: + return + if self.wait_for_interrupt and chunk_counter == self.chunks_before_interrupt: + await self.interrupt_event.wait() + await self.process(item) + chunk_counter += 1 + + def flush(self): + while True: + try: + item = self.input_queue.get_nowait() + except asyncio.QueueEmpty: + break + self.process(item) + + def interrupt(self): pass diff --git a/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py b/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py new file mode 100644 index 0000000000..44c6679ab1 --- /dev/null +++ b/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py @@ -0,0 +1,68 @@ +import asyncio + +import pytest + +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState +from vocode.streaming.output_device.rate_limit_interruptions_output_device import ( + RateLimitInterruptionsOutputDevice, +) +from vocode.streaming.utils.worker import InterruptibleEvent + + +class DummyRateLimitInterruptionsOutputDevice(RateLimitInterruptionsOutputDevice): + async def play(self, chunk: bytes): + pass + + +@pytest.mark.asyncio +async def test_calls_callbacks(): + output_device = DummyRateLimitInterruptionsOutputDevice( + sampling_rate=16000, audio_encoding=AudioEncoding.LINEAR16 + ) + + played_event = asyncio.Event() + interrupted_event = asyncio.Event() + uninterruptible_played_event = asyncio.Event() + + def on_play(): + played_event.set() + + def on_interrupt(): + interrupted_event.set() + + def uninterruptible_on_play(): + uninterruptible_played_event.set() + + played_audio_chunk = AudioChunk(data=b"") + played_audio_chunk.on_play = on_play + + interrupted_audio_chunk = AudioChunk(data=b"") + interrupted_audio_chunk.on_interrupt = on_interrupt + + uninterruptible_audio_chunk = AudioChunk(data=b"") + uninterruptible_audio_chunk.on_play = uninterruptible_on_play + + interruptible_event = InterruptibleEvent(payload=interrupted_audio_chunk, is_interruptible=True) + interruptible_event.interruption_event.set() + + uninterruptible_event = InterruptibleEvent( + payload=uninterruptible_audio_chunk, is_interruptible=False + ) + uninterruptible_event.interruption_event.set() + + output_device.consume_nonblocking(InterruptibleEvent(payload=played_audio_chunk)) + output_device.consume_nonblocking(interruptible_event) + output_device.consume_nonblocking(uninterruptible_event) + output_device.start() + + await played_event.wait() + assert played_audio_chunk.state == ChunkState.PLAYED + + await interrupted_event.wait() + assert interrupted_audio_chunk.state == ChunkState.INTERRUPTED + + await uninterruptible_played_event.wait() + assert uninterruptible_audio_chunk.state == ChunkState.PLAYED + + output_device.terminate() diff --git a/tests/streaming/output_device/test_twilio_output_device.py b/tests/streaming/output_device/test_twilio_output_device.py new file mode 100644 index 0000000000..a2c4ca3e52 --- /dev/null +++ b/tests/streaming/output_device/test_twilio_output_device.py @@ -0,0 +1,139 @@ +import asyncio +import base64 +import json + +import pytest +from pytest_mock import MockerFixture + +from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState +from vocode.streaming.output_device.twilio_output_device import ( + ChunkFinishedMarkMessage, + TwilioOutputDevice, +) +from vocode.streaming.utils.worker import InterruptibleEvent + + +@pytest.fixture +def mock_ws(mocker: MockerFixture): + return mocker.AsyncMock() + + +@pytest.fixture +def mock_stream_sid(): + return "stream_sid" + + +@pytest.fixture +def twilio_output_device(mock_ws, mock_stream_sid): + return TwilioOutputDevice(ws=mock_ws, stream_sid=mock_stream_sid) + + +@pytest.mark.asyncio +async def test_calls_play_callbacks(twilio_output_device: TwilioOutputDevice): + played_event = asyncio.Event() + + def on_play(): + played_event.set() + + audio_chunk = AudioChunk(data=b"") + audio_chunk.on_play = on_play + + twilio_output_device.consume_nonblocking(InterruptibleEvent(payload=audio_chunk)) + twilio_output_device.start() + twilio_output_device.enqueue_mark_message( + ChunkFinishedMarkMessage(chunk_id=str(audio_chunk.chunk_id)) + ) + + await played_event.wait() + assert audio_chunk.state == ChunkState.PLAYED + + media_message = json.loads(twilio_output_device.ws.send_text.call_args_list[0][0][0]) + assert media_message["streamSid"] == twilio_output_device.stream_sid + assert media_message["media"] == {"payload": base64.b64encode(audio_chunk.data).decode("utf-8")} + + mark_message = json.loads(twilio_output_device.ws.send_text.call_args_list[1][0][0]) + assert mark_message["streamSid"] == twilio_output_device.stream_sid + assert mark_message["mark"]["name"] == str(audio_chunk.chunk_id) + + twilio_output_device.terminate() + + +@pytest.mark.asyncio +async def test_calls_interrupt_callbacks(twilio_output_device: TwilioOutputDevice): + interrupted_event = asyncio.Event() + + def on_interrupt(): + interrupted_event.set() + + audio_chunk = AudioChunk(data=b"") + audio_chunk.on_interrupt = on_interrupt + + interruptible_event = InterruptibleEvent(payload=audio_chunk, is_interruptible=True) + + twilio_output_device.consume_nonblocking(interruptible_event) + # we start the twilio events task and the mark messages task manually to test this particular case + + # step 1: media is sent into the websocket + send_twilio_messages_task = asyncio.create_task(twilio_output_device._send_twilio_messages()) + + while not twilio_output_device._twilio_events_queue.empty(): + await asyncio.sleep(0.1) + + # step 2: we get an interrupt + interruptible_event.interrupt() + twilio_output_device.interrupt() + + # note: this means that the time between the events being interrupted and the clear message being sent, chunks + # will be marked interrupted - this is OK since the clear message is sent almost instantaneously once queued + # this is required because it stops queueing new chunks to be sent to the WS immediately + + while not twilio_output_device._twilio_events_queue.empty(): + await asyncio.sleep(0.1) + + # step 3: we get a mark message for the interrupted audio chunk after the clear message + twilio_output_device.enqueue_mark_message( + ChunkFinishedMarkMessage(chunk_id=str(audio_chunk.chunk_id)) + ) + process_mark_messages_task = asyncio.create_task(twilio_output_device._process_mark_messages()) + + await interrupted_event.wait() + assert audio_chunk.state == ChunkState.INTERRUPTED + + media_message = json.loads(twilio_output_device.ws.send_text.call_args_list[0][0][0]) + assert media_message["streamSid"] == twilio_output_device.stream_sid + assert media_message["media"] == {"payload": base64.b64encode(audio_chunk.data).decode("utf-8")} + + mark_message = json.loads(twilio_output_device.ws.send_text.call_args_list[1][0][0]) + assert mark_message["streamSid"] == twilio_output_device.stream_sid + assert mark_message["mark"]["name"] == str(audio_chunk.chunk_id) + + clear_message = json.loads(twilio_output_device.ws.send_text.call_args_list[2][0][0]) + assert clear_message["streamSid"] == twilio_output_device.stream_sid + assert clear_message["event"] == "clear" + + send_twilio_messages_task.cancel() + process_mark_messages_task.cancel() + + +@pytest.mark.asyncio +async def test_interrupted_audio_chunks_are_not_sent_but_are_marked_interrupted( + twilio_output_device: TwilioOutputDevice, +): + interrupted_event = asyncio.Event() + + def on_interrupt(): + interrupted_event.set() + + audio_chunk = AudioChunk(data=b"") + audio_chunk.on_interrupt = on_interrupt + + interruptible_event = InterruptibleEvent(payload=audio_chunk, is_interruptible=True) + interruptible_event.interrupt() + + twilio_output_device.consume_nonblocking(interruptible_event) + twilio_output_device.start() + + await interrupted_event.wait() + assert audio_chunk.state == ChunkState.INTERRUPTED + + twilio_output_device.ws.send_text.assert_not_called() diff --git a/tests/streaming/test_streaming_conversation.py b/tests/streaming/test_streaming_conversation.py index 4299438376..1d4ef026d6 100644 --- a/tests/streaming/test_streaming_conversation.py +++ b/tests/streaming/test_streaming_conversation.py @@ -1,5 +1,6 @@ import asyncio -from typing import List +import threading +from typing import AsyncGenerator, List, Optional from unittest.mock import MagicMock import pytest @@ -16,6 +17,7 @@ from vocode.streaming.models.events import Sender from vocode.streaming.models.transcriber import Transcription from vocode.streaming.models.transcript import ActionStart, Message, Transcript +from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult from vocode.streaming.utils.worker import AsyncWorker @@ -451,3 +453,124 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun assert streaming_conversation.broadcast_interrupt.called streaming_conversation.transcriptions_worker.terminate() + + +def _create_dummy_synthesis_result( + message: str = "Hi there", + num_audio_chunks: int = 3, + chunk_generator_override: Optional[AsyncGenerator[SynthesisResult.ChunkResult, None]] = None, +): + async def chunk_generator(): + for i in range(num_audio_chunks): + yield SynthesisResult.ChunkResult(chunk=b"", is_last_chunk=i == num_audio_chunks - 1) + + def get_message_up_to(seconds: Optional[float]): + if seconds is None: + return message + return message[: len(message) // 2] + + return SynthesisResult( + chunk_generator=chunk_generator_override or chunk_generator(), + get_message_up_to=get_message_up_to, + ) + + +@pytest.mark.asyncio +async def test_send_speech_to_output_uninterrupted( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor(mocker) + synthesis_result = _create_dummy_synthesis_result() + stop_event = threading.Event() + transcript_message = Message( + text="", + sender=Sender.BOT, + ) + + streaming_conversation.output_device.start() + message_sent, cut_off = await streaming_conversation.send_speech_to_output( + message="Hi there", + synthesis_result=synthesis_result, + stop_event=stop_event, + seconds_per_chunk=0.1, + transcript_message=transcript_message, + ) + streaming_conversation.output_device.flush() + + assert message_sent == "Hi there" + assert not cut_off + assert transcript_message.text == "Hi there" + assert transcript_message.is_final + + +@pytest.mark.asyncio +async def test_send_speech_to_output_interrupted_before_all_chunks_sent( + mocker: MockerFixture, +): + streaming_conversation = await _mock_streaming_conversation_constructor(mocker) + synthesis_result = _create_dummy_synthesis_result() + stop_event = threading.Event() + transcript_message = Message( + text="", + sender=Sender.BOT, + ) + stop_event.set() + + streaming_conversation.output_device.start() + message_sent, cut_off = await streaming_conversation.send_speech_to_output( + message="Hi there", + synthesis_result=synthesis_result, + stop_event=stop_event, + seconds_per_chunk=0.1, + transcript_message=transcript_message, + ) + streaming_conversation.output_device.flush() + + assert message_sent != "Hi there" + assert cut_off + assert transcript_message.text != "Hi there" + assert not transcript_message.is_final + + +@pytest.mark.asyncio +async def test_send_speech_to_output_interrupted_during_playback( + mocker: MockerFixture, +): + finished_sending_chunks = asyncio.Event() + + async def chunk_generator(): + yield SynthesisResult.ChunkResult(chunk=b"", is_last_chunk=False) + yield SynthesisResult.ChunkResult(chunk=b"", is_last_chunk=False) + yield SynthesisResult.ChunkResult(chunk=b"", is_last_chunk=True) + finished_sending_chunks.set() + + streaming_conversation = await _mock_streaming_conversation_constructor(mocker) + synthesis_result = _create_dummy_synthesis_result(chunk_generator_override=chunk_generator()) + stop_event = threading.Event() + transcript_message = Message( + text="", + sender=Sender.BOT, + ) + + streaming_conversation.output_device.wait_for_interrupt = True + + streaming_conversation.output_device.start() + send_speech_to_output_task = asyncio.create_task( + streaming_conversation.send_speech_to_output( + message="Hi there", + synthesis_result=synthesis_result, + stop_event=stop_event, + seconds_per_chunk=0.1, + transcript_message=transcript_message, + ) + ) + await finished_sending_chunks.wait() + stop_event.set() + streaming_conversation.output_device.interrupt_event.set() + message_sent, cut_off = await send_speech_to_output_task + streaming_conversation.output_device.terminate() + + assert message_sent != "Hi there" + assert cut_off + assert transcript_message.text != "Hi there" + assert not transcript_message.is_final diff --git a/vocode/helpers.py b/vocode/helpers.py index 29727eb927..d05b06fe5c 100644 --- a/vocode/helpers.py +++ b/vocode/helpers.py @@ -33,7 +33,7 @@ def create_streaming_microphone_input_and_speaker_output( ): return _create_microphone_input_and_speaker_output( microphone_class=StreamingMicrophoneInput, - speaker_class=(BlockingStreamingSpeakerOutput), + speaker_class=BlockingStreamingSpeakerOutput, use_default_devices=use_default_devices, input_device_name=input_device_name, output_device_name=output_device_name, diff --git a/vocode/streaming/client_backend/conversation.py b/vocode/streaming/client_backend/conversation.py index 5970c475bc..31b34c82b5 100644 --- a/vocode/streaming/client_backend/conversation.py +++ b/vocode/streaming/client_backend/conversation.py @@ -116,7 +116,7 @@ def __init__( async def handle_event(self, event: Event): if event.type == EventType.TRANSCRIPT: transcript_event = typing.cast(TranscriptEvent, event) - self.output_device.consume_transcript(transcript_event) + await self.output_device.send_transcript(transcript_event) # logger.debug(event.dict()) def restart(self, output_device: WebsocketOutputDevice): diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index eb1032d6c3..13a7fe655c 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -4,7 +4,7 @@ from pydantic.v1 import validator from vocode.streaming.models.client_backend import OutputAudioConfig -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE from .audio import AudioEncoding, SamplingRate @@ -47,7 +47,7 @@ class Config: arbitrary_types_allowed = True @classmethod - def from_output_device(cls, output_device: BaseOutputDevice, **kwargs): + def from_output_device(cls, output_device: AbstractOutputDevice, **kwargs): return cls( sampling_rate=output_device.sampling_rate, audio_encoding=output_device.audio_encoding, diff --git a/vocode/streaming/output_device/abstract_output_device.py b/vocode/streaming/output_device/abstract_output_device.py new file mode 100644 index 0000000000..985077f638 --- /dev/null +++ b/vocode/streaming/output_device/abstract_output_device.py @@ -0,0 +1,26 @@ +import asyncio +from abc import abstractmethod + +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.output_device.audio_chunk import AudioChunk +from vocode.streaming.utils.worker import AsyncWorker, InterruptibleEvent + + +class AbstractOutputDevice(AsyncWorker[InterruptibleEvent[AudioChunk]]): + """Output devices are workers that are responsible for playing back audio. + + As part of processing: + - it must call AudioChunk.on_play() when the chunk is played back and set AudioChunk.state = ChunkState.PLAYED + - it must call AudioChunk.on_interrupt() when the chunk is interrupted and set AudioChunk.state = ChunkState.INTERRUPTED + - if the interruptible event marker is set, then it must also mark the chunk as interrupted + """ + + def __init__(self, sampling_rate: int, audio_encoding: AudioEncoding): + super().__init__(input_queue=asyncio.Queue()) + self.sampling_rate = sampling_rate + self.audio_encoding = audio_encoding + + @abstractmethod + def interrupt(self): + """Must interrupt the currently playing audio""" + pass diff --git a/vocode/streaming/output_device/audio_chunk.py b/vocode/streaming/output_device/audio_chunk.py new file mode 100644 index 0000000000..df669d19ba --- /dev/null +++ b/vocode/streaming/output_device/audio_chunk.py @@ -0,0 +1,28 @@ +import uuid +from dataclasses import dataclass, field +from enum import Enum +from uuid import UUID + + +class ChunkState(int, Enum): + UNPLAYED = 0 + PLAYED = 1 + INTERRUPTED = 2 + + +@dataclass +class AudioChunk: + data: bytes + state: ChunkState = ChunkState.UNPLAYED + chunk_id: UUID = field(default_factory=uuid.uuid4) + + @staticmethod + def on_play(): + pass + + @staticmethod + def on_interrupt(): + pass + + def __hash__(self) -> int: + return hash(self.chunk_id) diff --git a/vocode/streaming/output_device/base_output_device.py b/vocode/streaming/output_device/base_output_device.py deleted file mode 100644 index 2ce90d5c2f..0000000000 --- a/vocode/streaming/output_device/base_output_device.py +++ /dev/null @@ -1,16 +0,0 @@ -from vocode.streaming.models.audio import AudioEncoding - - -class BaseOutputDevice: - def __init__(self, sampling_rate: int, audio_encoding: AudioEncoding): - self.sampling_rate = sampling_rate - self.audio_encoding = audio_encoding - - def start(self): - pass - - def consume_nonblocking(self, chunk: bytes): - raise NotImplemented - - def terminate(self): - pass diff --git a/vocode/streaming/output_device/blocking_speaker_output.py b/vocode/streaming/output_device/blocking_speaker_output.py index 99fdcd5593..d273cb9e0b 100644 --- a/vocode/streaming/output_device/blocking_speaker_output.py +++ b/vocode/streaming/output_device/blocking_speaker_output.py @@ -6,26 +6,21 @@ import sounddevice as sd from vocode.streaming.models.audio import AudioEncoding -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.rate_limit_interruptions_output_device import ( + RateLimitInterruptionsOutputDevice, +) from vocode.streaming.utils.worker import ThreadAsyncWorker +DEFAULT_SAMPLING_RATE = 44100 -class BlockingSpeakerOutput(BaseOutputDevice, ThreadAsyncWorker): - DEFAULT_SAMPLING_RATE = 44100 - def __init__( - self, - device_info: dict, - sampling_rate: Optional[int] = None, - audio_encoding: AudioEncoding = AudioEncoding.LINEAR16, - ): +class _PlaybackWorker(ThreadAsyncWorker[bytes]): + + def __init__(self, *, device_info: dict, sampling_rate: int): + self.sampling_rate = sampling_rate self.device_info = device_info - sampling_rate = sampling_rate or int( - self.device_info.get("default_samplerate", self.DEFAULT_SAMPLING_RATE) - ) self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() - BaseOutputDevice.__init__(self, sampling_rate, audio_encoding) - ThreadAsyncWorker.__init__(self, self.input_queue) + super().__init__(self.input_queue) self.stream = sd.OutputStream( channels=1, samplerate=self.sampling_rate, @@ -36,9 +31,6 @@ def __init__( self.input_queue.put_nowait(self.sampling_rate * b"\x00") self.stream.start() - def start(self): - ThreadAsyncWorker.start(self) - def _run_loop(self): while not self._ended: try: @@ -47,14 +39,37 @@ def _run_loop(self): except queue.Empty: continue - def consume_nonblocking(self, chunk): - ThreadAsyncWorker.consume_nonblocking(self, chunk) - def terminate(self): self._ended = True - ThreadAsyncWorker.terminate(self) + super().terminate() self.stream.close() + +class BlockingSpeakerOutput(RateLimitInterruptionsOutputDevice): + + def __init__( + self, + device_info: dict, + sampling_rate: Optional[int] = None, + audio_encoding: AudioEncoding = AudioEncoding.LINEAR16, + ): + sampling_rate = sampling_rate or int( + device_info.get("default_samplerate", DEFAULT_SAMPLING_RATE) + ) + super().__init__(sampling_rate=sampling_rate, audio_encoding=audio_encoding) + self.playback_worker = _PlaybackWorker(device_info=device_info, sampling_rate=sampling_rate) + + async def play(self, chunk): + self.playback_worker.consume_nonblocking(chunk) + + def start(self) -> asyncio.Task: + self.playback_worker.start() + return super().start() + + def terminate(self): + self.playback_worker.terminate() + super().terminate() + @classmethod def from_default_device( cls, diff --git a/vocode/streaming/output_device/file_output_device.py b/vocode/streaming/output_device/file_output_device.py index 65a548facd..607fd5b3e1 100644 --- a/vocode/streaming/output_device/file_output_device.py +++ b/vocode/streaming/output_device/file_output_device.py @@ -1,34 +1,15 @@ import asyncio import wave -from asyncio import Queue import numpy as np from vocode.streaming.models.audio import AudioEncoding -from vocode.streaming.utils.worker import ThreadAsyncWorker +from vocode.streaming.output_device.rate_limit_interruptions_output_device import ( + RateLimitInterruptionsOutputDevice, +) -from .base_output_device import BaseOutputDevice - -class FileWriterWorker(ThreadAsyncWorker): - def __init__(self, input_queue: Queue, wave) -> None: - super().__init__(input_queue) - self.wav = wave - - def _run_loop(self): - while True: - try: - block = self.input_janus_queue.sync_q.get() - self.wav.writeframes(block) - except asyncio.CancelledError: - return - - def terminate(self): - super().terminate() - self.wav.close() - - -class FileOutputDevice(BaseOutputDevice): +class FileOutputDevice(RateLimitInterruptionsOutputDevice): DEFAULT_SAMPLING_RATE = 44100 def __init__( @@ -39,7 +20,6 @@ def __init__( ): super().__init__(sampling_rate, audio_encoding) self.blocksize = self.sampling_rate - self.queue: Queue[np.ndarray] = Queue() wav = wave.open(file_path, "wb") wav.setnchannels(1) # Mono channel @@ -47,16 +27,9 @@ def __init__( wav.setframerate(self.sampling_rate) self.wav = wav - self.thread_worker = FileWriterWorker(self.queue, wav) - self.thread_worker.start() - - def consume_nonblocking(self, chunk): - chunk_arr = np.frombuffer(chunk, dtype=np.int16) - for i in range(0, chunk_arr.shape[0], self.blocksize): - block = np.zeros(self.blocksize, dtype=np.int16) - size = min(self.blocksize, chunk_arr.shape[0] - i) - block[:size] = chunk_arr[i : i + size] - self.queue.put_nowait(block) + async def play(self, chunk: bytes): + await asyncio.to_thread(lambda: self.wav.writeframes(chunk)) def terminate(self): - self.thread_worker.terminate() + self.wav.close() + super().terminate() diff --git a/vocode/streaming/output_device/rate_limit_interruptions_output_device.py b/vocode/streaming/output_device/rate_limit_interruptions_output_device.py new file mode 100644 index 0000000000..98493b9d8c --- /dev/null +++ b/vocode/streaming/output_device/rate_limit_interruptions_output_device.py @@ -0,0 +1,70 @@ +import asyncio +import time +from abc import abstractmethod + +from vocode.streaming.constants import PER_CHUNK_ALLOWANCE_SECONDS +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import ChunkState +from vocode.streaming.utils import get_chunk_size_per_second + + +class RateLimitInterruptionsOutputDevice(AbstractOutputDevice): + """Output device that works by rate limiting the chunks sent to the output. For interrupts to work properly, + the next chunk of audio can only be sent after the last chunk is played, so we send + a chunk of x seconds only after x seconds have passed since the last chunk was sent.""" + + def __init__( + self, + sampling_rate: int, + audio_encoding: AudioEncoding, + per_chunk_allowance_seconds: float = PER_CHUNK_ALLOWANCE_SECONDS, + ): + super().__init__(sampling_rate, audio_encoding) + self.per_chunk_allowance_seconds = per_chunk_allowance_seconds + + async def _run_loop(self): + while True: + start_time = time.time() + try: + item = await self.input_queue.get() + except asyncio.CancelledError: + return + + self.interruptible_event = item + audio_chunk = item.payload + + if item.is_interrupted(): + audio_chunk.on_interrupt() + audio_chunk.state = ChunkState.INTERRUPTED + continue + + speech_length_seconds = (len(audio_chunk.data)) / get_chunk_size_per_second( + self.audio_encoding, + self.sampling_rate, + ) + await self.play(audio_chunk.data) + audio_chunk.on_play() + audio_chunk.state = ChunkState.PLAYED + end_time = time.time() + await asyncio.sleep( + max( + speech_length_seconds + - (end_time - start_time) + - self.per_chunk_allowance_seconds, + 0, + ), + ) + self.interruptible_event.is_interruptible = False + + @abstractmethod + async def play(self, chunk: bytes): + """Sends an audio chunk to immediate playback""" + pass + + def interrupt(self): + """ + For conversations that use rate-limiting playback as above, + no custom logic is needed on interrupt, because to end synthesis, all we need to do is stop sending chunks. + """ + pass diff --git a/vocode/streaming/output_device/speaker_output.py b/vocode/streaming/output_device/speaker_output.py index a9a30f82e5..c416c814ef 100644 --- a/vocode/streaming/output_device/speaker_output.py +++ b/vocode/streaming/output_device/speaker_output.py @@ -6,12 +6,12 @@ from vocode.streaming.models.audio import AudioEncoding -from .base_output_device import BaseOutputDevice +from .abstract_output_device import AbstractOutputDevice raise DeprecationWarning("Use BlockingSpeakerOutput instead") -class SpeakerOutput(BaseOutputDevice): +class SpeakerOutput(AbstractOutputDevice): DEFAULT_SAMPLING_RATE = 44100 def __init__( diff --git a/vocode/streaming/output_device/twilio_output_device.py b/vocode/streaming/output_device/twilio_output_device.py index 565ec65f1e..74e0e9c077 100644 --- a/vocode/streaming/output_device/twilio_output_device.py +++ b/vocode/streaming/output_device/twilio_output_device.py @@ -3,66 +3,125 @@ import asyncio import base64 import json -from typing import Optional +import uuid +from typing import Optional, Union from fastapi import WebSocket from fastapi.websockets import WebSocketState +from loguru import logger +from pydantic import BaseModel -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.worker import InterruptibleEvent -class TwilioOutputDevice(BaseOutputDevice): +class ChunkFinishedMarkMessage(BaseModel): + chunk_id: str + + +MarkMessage = Union[ChunkFinishedMarkMessage] # space for more mark messages + + +class TwilioOutputDevice(AbstractOutputDevice): def __init__(self, ws: Optional[WebSocket] = None, stream_sid: Optional[str] = None): super().__init__(sampling_rate=DEFAULT_SAMPLING_RATE, audio_encoding=DEFAULT_AUDIO_ENCODING) self.ws = ws self.stream_sid = stream_sid self.active = True - self.queue: asyncio.Queue[str] = asyncio.Queue() - self.process_task = asyncio_create_task_with_done_error_log(self.process()) - async def process(self): - while self.active: - message = await self.queue.get() + self._twilio_events_queue: asyncio.Queue[str] = asyncio.Queue() + self._mark_message_queue: asyncio.Queue[MarkMessage] = asyncio.Queue() + self._unprocessed_audio_chunks_queue: asyncio.Queue[InterruptibleEvent[AudioChunk]] = ( + asyncio.Queue() + ) + + def consume_nonblocking(self, item: InterruptibleEvent[AudioChunk]): + if not item.is_interrupted(): + self._send_audio_chunk_and_mark( + chunk=item.payload.data, chunk_id=str(item.payload.chunk_id) + ) + self._unprocessed_audio_chunks_queue.put_nowait(item) + else: + audio_chunk = item.payload + audio_chunk.on_interrupt() + audio_chunk.state = ChunkState.INTERRUPTED + + def interrupt(self): + self._send_clear_message() + + def enqueue_mark_message(self, mark_message: MarkMessage): + self._mark_message_queue.put_nowait(mark_message) + + async def _send_twilio_messages(self): + while True: + try: + twilio_event = await self._twilio_events_queue.get() + except asyncio.CancelledError: + return if self.ws.application_state == WebSocketState.DISCONNECTED: break - await self.ws.send_text(message) + await self.ws.send_text(twilio_event) + + async def _process_mark_messages(self): + while True: + try: + # mark messages are tagged with the chunk ID that is attached to the audio chunk + # but they are guaranteed to come in the same order as the audio chunks, and we + # don't need to build resiliency there + mark_message = await self._mark_message_queue.get() + item = await self._unprocessed_audio_chunks_queue.get() + except asyncio.CancelledError: + return + + self.interruptible_event = item + audio_chunk = item.payload + + if mark_message.chunk_id != str(audio_chunk.chunk_id): + logger.error( + f"Received a mark message out of order with chunk ID {mark_message.chunk_id}" + ) + + if item.is_interrupted(): + audio_chunk.on_interrupt() + audio_chunk.state = ChunkState.INTERRUPTED + continue - def consume_nonblocking(self, chunk: bytes): - twilio_message = { + audio_chunk.on_play() + audio_chunk.state = ChunkState.PLAYED + + self.interruptible_event.is_interruptible = False + + async def _run_loop(self): + send_twilio_messages_task = asyncio_create_task_with_done_error_log( + self._send_twilio_messages() + ) + process_mark_messages_task = asyncio_create_task_with_done_error_log( + self._process_mark_messages() + ) + await asyncio.gather(send_twilio_messages_task, process_mark_messages_task) + + def _send_audio_chunk_and_mark(self, chunk: bytes, chunk_id: str): + media_message = { "event": "media", "streamSid": self.stream_sid, "media": {"payload": base64.b64encode(chunk).decode("utf-8")}, } - self.queue.put_nowait(json.dumps(twilio_message)) - - def send_chunk_finished_mark(self, utterance_id, chunk_idx): - mark_message = { - "event": "mark", - "streamSid": self.stream_sid, - "mark": { - "name": f"chunk-{utterance_id}-{chunk_idx}", - }, - } - self.queue.put_nowait(json.dumps(mark_message)) - - def send_utterance_finished_mark(self, utterance_id): + self._twilio_events_queue.put_nowait(json.dumps(media_message)) mark_message = { "event": "mark", "streamSid": self.stream_sid, "mark": { - "name": f"utterance-{utterance_id}", + "name": chunk_id, }, } - self.queue.put_nowait(json.dumps(mark_message)) + self._twilio_events_queue.put_nowait(json.dumps(mark_message)) - def send_clear_message(self): + def _send_clear_message(self): clear_message = { "event": "clear", "streamSid": self.stream_sid, } - self.queue.put_nowait(json.dumps(clear_message)) - - def terminate(self): - self.process_task.cancel() + self._twilio_events_queue.put_nowait(json.dumps(clear_message)) diff --git a/vocode/streaming/output_device/vonage_output_device.py b/vocode/streaming/output_device/vonage_output_device.py index 76aef2b125..53234e67c9 100644 --- a/vocode/streaming/output_device/vonage_output_device.py +++ b/vocode/streaming/output_device/vonage_output_device.py @@ -1,21 +1,21 @@ -import asyncio from typing import Optional from fastapi import WebSocket from fastapi.websockets import WebSocketState -from vocode.streaming.output_device.base_output_device import BaseOutputDevice from vocode.streaming.output_device.blocking_speaker_output import BlockingSpeakerOutput +from vocode.streaming.output_device.rate_limit_interruptions_output_device import ( + RateLimitInterruptionsOutputDevice, +) from vocode.streaming.telephony.constants import ( PCM_SILENCE_BYTE, VONAGE_AUDIO_ENCODING, VONAGE_CHUNK_SIZE, VONAGE_SAMPLING_RATE, ) -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log -class VonageOutputDevice(BaseOutputDevice): +class VonageOutputDevice(RateLimitInterruptionsOutputDevice): def __init__( self, ws: Optional[WebSocket] = None, @@ -23,30 +23,18 @@ def __init__( ): super().__init__(sampling_rate=VONAGE_SAMPLING_RATE, audio_encoding=VONAGE_AUDIO_ENCODING) self.ws = ws - self.active = True - self.queue: asyncio.Queue[bytes] = asyncio.Queue() - self.process_task = asyncio_create_task_with_done_error_log(self.process()) self.output_to_speaker = output_to_speaker if output_to_speaker: self.output_speaker = BlockingSpeakerOutput.from_default_device( sampling_rate=VONAGE_SAMPLING_RATE, blocksize=VONAGE_CHUNK_SIZE // 2 ) - async def process(self): - while self.active: - chunk = await self.queue.get() - if self.ws.application_state == WebSocketState.DISCONNECTED: - break - if self.output_to_speaker: - self.output_speaker.consume_nonblocking(chunk) - for i in range(0, len(chunk), VONAGE_CHUNK_SIZE): - subchunk = chunk[i : i + VONAGE_CHUNK_SIZE] - if len(subchunk) % 2 == 1: - subchunk += PCM_SILENCE_BYTE # pad with silence, Vonage goes crazy otherwise + async def play(self, chunk: bytes): + if self.output_to_speaker: + self.output_speaker.consume_nonblocking(chunk) + for i in range(0, len(chunk), VONAGE_CHUNK_SIZE): + subchunk = chunk[i : i + VONAGE_CHUNK_SIZE] + if len(subchunk) % 2 == 1: + subchunk += PCM_SILENCE_BYTE # pad with silence, Vonage goes crazy otherwise + if self.ws and self.ws.application_state != WebSocketState.DISCONNECTED: await self.ws.send_bytes(subchunk) - - def consume_nonblocking(self, chunk: bytes): - self.queue.put_nowait(chunk) - - def terminate(self): - self.process_task.cancel() diff --git a/vocode/streaming/output_device/websocket_output_device.py b/vocode/streaming/output_device/websocket_output_device.py index ca0133c145..9b5ce1de4b 100644 --- a/vocode/streaming/output_device/websocket_output_device.py +++ b/vocode/streaming/output_device/websocket_output_device.py @@ -7,11 +7,12 @@ from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcript import TranscriptEvent from vocode.streaming.models.websocket import AudioMessage, TranscriptMessage -from vocode.streaming.output_device.base_output_device import BaseOutputDevice -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.output_device.rate_limit_interruptions_output_device import ( + RateLimitInterruptionsOutputDevice, +) -class WebsocketOutputDevice(BaseOutputDevice): +class WebsocketOutputDevice(RateLimitInterruptionsOutputDevice): def __init__(self, ws: WebSocket, sampling_rate: int, audio_encoding: AudioEncoding): super().__init__(sampling_rate, audio_encoding) self.ws = ws @@ -20,25 +21,15 @@ def __init__(self, ws: WebSocket, sampling_rate: int, audio_encoding: AudioEncod def start(self): self.active = True - self.process_task = asyncio_create_task_with_done_error_log(self.process()) + return super().start() def mark_closed(self): self.active = False - async def process(self): - while self.active: - message = await self.queue.get() - await self.ws.send_text(message) + async def play(self, chunk: bytes): + await self.ws.send_text(AudioMessage.from_bytes(chunk).json()) - def consume_nonblocking(self, chunk: bytes): - if self.active: - audio_message = AudioMessage.from_bytes(chunk) - self.queue.put_nowait(audio_message.json()) - - def consume_transcript(self, event: TranscriptEvent): + async def send_transcript(self, event: TranscriptEvent): if self.active: transcript_message = TranscriptMessage.from_event(event) - self.queue.put_nowait(transcript_message.json()) - - def terminate(self): - self.process_task.cancel() + await self.ws.send_text(transcript_message.json()) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index aadf6bfa6c..bdb563230f 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -9,7 +9,6 @@ import typing from typing import ( Any, - AsyncGenerator, Awaitable, Callable, Generic, @@ -39,7 +38,6 @@ from vocode.streaming.constants import ( ALLOWED_IDLE_TIME, CHECK_HUMAN_PRESENT_MESSAGE_CHOICES, - PER_CHUNK_ALLOWANCE_SECONDS, TEXT_TO_SPEECH_CHUNK_SIZE_SECONDS, ) from vocode.streaming.models.actions import EndOfTurn @@ -48,7 +46,8 @@ from vocode.streaming.models.message import BaseMessage, BotBackchannel, LLMToken, SilenceMessage from vocode.streaming.models.transcriber import TranscriberConfig, Transcription from vocode.streaming.models.transcript import Message, Transcript, TranscriptCompleteEvent -from vocode.streaming.output_device.base_output_device import BaseOutputDevice +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState from vocode.streaming.synthesizer.base_synthesizer import ( BaseSynthesizer, FillerAudio, @@ -57,7 +56,11 @@ from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer from vocode.streaming.transcriber.base_transcriber import BaseTranscriber from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber -from vocode.streaming.utils import create_conversation_id, get_chunk_size_per_second +from vocode.streaming.utils import ( + create_conversation_id, + enumerate_async_iter, + get_chunk_size_per_second, +) from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log from vocode.streaming.utils.events_manager import EventsManager from vocode.streaming.utils.speed_manager import SpeedManager @@ -102,7 +105,7 @@ LOW_INTERRUPT_SENSITIVITY_BACKCHANNEL_UTTERANCE_LENGTH_THRESHOLD = 3 -OutputDeviceType = TypeVar("OutputDeviceType", bound=BaseOutputDevice) +OutputDeviceType = TypeVar("OutputDeviceType", bound=AbstractOutputDevice) class StreamingConversation(Generic[OutputDeviceType]): @@ -136,7 +139,7 @@ def create_interruptible_agent_response_event( self.conversation.interruptible_events.put_nowait(interruptible_event) return interruptible_event - class TranscriptionsWorker(AsyncQueueWorker): + class TranscriptionsWorker(AsyncQueueWorker[Transcription]): """Processes all transcriptions: sends an interrupt if needed and sends final transcriptions to the output queue""" @@ -267,7 +270,7 @@ async def process(self, transcription: Transcription): ) if not self.conversation.is_human_speaking: self.conversation.current_transcription_is_interrupt = ( - self.conversation.broadcast_interrupt() + await self.conversation.broadcast_interrupt() ) self.has_associated_unignored_utterance = not transcription.is_final if self.conversation.current_transcription_is_interrupt: @@ -590,7 +593,6 @@ def __init__( synthesizer: BaseSynthesizer, speed_coefficient: float = 1.0, conversation_id: Optional[str] = None, - per_chunk_allowance_seconds: float = PER_CHUNK_ALLOWANCE_SECONDS, events_manager: Optional[EventsManager] = None, ): self.id = conversation_id or create_conversation_id() @@ -655,7 +657,6 @@ def __init__( self.events_manager = events_manager or EventsManager() self.events_task: Optional[asyncio.Task] = None - self.per_chunk_allowance_seconds = per_chunk_allowance_seconds self.transcript = Transcript() self.transcript.attach_events_manager(self.events_manager) @@ -678,6 +679,8 @@ def __init__( self.agent.get_agent_config().allowed_idle_time_seconds or ALLOWED_IDLE_TIME ) + self.interrupt_lock = asyncio.Lock() + def create_state_manager(self) -> ConversationStateManager: return ConversationStateManager(conversation=self) @@ -806,28 +809,30 @@ def warmup_synthesizer(self): def mark_last_action_timestamp(self): self.last_action_timestamp = time.time() - def broadcast_interrupt(self): + async def broadcast_interrupt(self): """Stops all inflight events and cancels all workers that are sending output Returns true if any events were interrupted - which is used as a flag for the agent (is_interrupt) """ - num_interrupts = 0 - while True: - try: - interruptible_event = self.interruptible_events.get_nowait() - if not interruptible_event.is_interrupted(): - if interruptible_event.interrupt(): - logger.debug( - f"Interrupting event {type(interruptible_event.payload)} {interruptible_event.payload}", - ) - num_interrupts += 1 - except queue.Empty: - break - self.agent.cancel_current_task() - self.agent_responses_worker.cancel_current_task() - if self.actions_worker: - self.actions_worker.cancel_current_task() - return num_interrupts > 0 + async with self.interrupt_lock: + num_interrupts = 0 + while True: + try: + interruptible_event = self.interruptible_events.get_nowait() + if not interruptible_event.is_interrupted(): + if interruptible_event.interrupt(): + logger.debug( + f"Interrupting event {type(interruptible_event.payload)} {interruptible_event.payload}", + ) + num_interrupts += 1 + except queue.Empty: + break + self.output_device.interrupt() + self.agent.cancel_current_task() + self.agent_responses_worker.cancel_current_task() + if self.actions_worker: + self.actions_worker.cancel_current_task() + return num_interrupts > 0 def is_interrupt(self, transcription: Transcription): return transcription.confidence >= ( @@ -880,83 +885,105 @@ async def send_speech_to_output( - If the stop_event is set, the output is stopped - Sets started_event when the first chunk is sent - Importantly, we rate limit the chunks sent to the output. For interrupts to work properly, - the next chunk of audio can only be sent after the last chunk is played, so we send - a chunk of x seconds only after x seconds have passed since the last chunk was sent. - Returns the message that was sent up to, and a flag if the message was cut off """ + seconds_spoken = 0.0 - async def get_chunks( - output_queue: asyncio.Queue[Optional[SynthesisResult.ChunkResult]], - chunk_generator: AsyncGenerator[SynthesisResult.ChunkResult, None], + def create_on_play_callback( + chunk_idx: int, + processed_event: asyncio.Event, ): - try: - async for chunk_result in chunk_generator: - await output_queue.put(chunk_result) - except asyncio.CancelledError: - pass - finally: - await output_queue.put(None) # sentinel + def _on_play(): + if chunk_idx == 0: + if started_event: + started_event.set() + if first_chunk_span: + self._track_first_chunk(first_chunk_span, synthesis_result) + + nonlocal seconds_spoken + + self.mark_last_action_timestamp() + + seconds_spoken += seconds_per_chunk + if transcript_message: + transcript_message.text = synthesis_result.get_message_up_to(seconds_spoken) + + processed_event.set() + + return _on_play + + def create_on_interrupt_callback( + processed_event: asyncio.Event, + ): + def _on_interrupt(): + processed_event.set() + + return _on_interrupt if self.transcriber.get_transcriber_config().mute_during_speech: logger.debug("Muting transcriber") self.transcriber.mute() - message_sent = message - cut_off = False - chunk_size = self._get_synthesizer_chunk_size(seconds_per_chunk) - chunk_idx = 0 - seconds_spoken = 0.0 logger.debug(f"Start sending speech {message} to output") first_chunk_span = self._maybe_create_first_chunk_span(synthesis_result, message) - chunk_queue: asyncio.Queue[Optional[SynthesisResult.ChunkResult]] = asyncio.Queue() - get_chunks_task = asyncio_create_task_with_done_error_log( - get_chunks(chunk_queue, synthesis_result.chunk_generator), - ) - first = True - while True: - chunk_result = await chunk_queue.get() - if chunk_result is None: - break - if first and first_chunk_span: - self._track_first_chunk(first_chunk_span, synthesis_result) - first = False - start_time = time.time() - speech_length_seconds = seconds_per_chunk * (len(chunk_result.chunk) / chunk_size) - seconds_spoken = chunk_idx * seconds_per_chunk + audio_chunks: List[AudioChunk] = [] + processed_events: List[asyncio.Event] = [] + interrupted_before_all_chunks_sent = False + async for chunk_idx, chunk_result in enumerate_async_iter(synthesis_result.chunk_generator): if stop_event.is_set(): - logger.debug( - "Interrupted, stopping text to speech after {} chunks".format(chunk_idx), - ) - message_sent = synthesis_result.get_message_up_to(seconds_spoken) - cut_off = True + logger.debug("Interrupted before all chunks were sent") + interrupted_before_all_chunks_sent = True break - if chunk_idx == 0: - if started_event: - started_event.set() - self.output_device.consume_nonblocking(chunk_result.chunk) - end_time = time.time() - await asyncio.sleep( - max( - speech_length_seconds - - (end_time - start_time) - - self.per_chunk_allowance_seconds, - 0, - ), + processed_event = asyncio.Event() + audio_chunk = AudioChunk( + data=chunk_result.chunk, ) - self.mark_last_action_timestamp() - chunk_idx += 1 - seconds_spoken += seconds_per_chunk - if transcript_message: - transcript_message.text = synthesis_result.get_message_up_to(seconds_spoken) - get_chunks_task.cancel() + # register callbacks + setattr(audio_chunk, "on_play", create_on_play_callback(chunk_idx, processed_event)) + setattr( + audio_chunk, + "on_interrupt", + create_on_interrupt_callback(processed_event), + ) + # Prevents the case where we send a chunk after the output device has been interrupted + async with self.interrupt_lock: + self.output_device.consume_nonblocking( + InterruptibleEvent( + payload=audio_chunk, + is_interruptible=True, + interruption_event=stop_event, + ), + ) + audio_chunks.append(audio_chunk) + processed_events.append(processed_event) + + logger.debug("Finished sending chunks to the output device") + + if processed_events: + await processed_events[-1].wait() + + maybe_first_interrupted_audio_chunk = next( + ( + audio_chunk + for audio_chunk in audio_chunks + if audio_chunk.state == ChunkState.INTERRUPTED + ), + None, + ) + cut_off = ( + interrupted_before_all_chunks_sent or maybe_first_interrupted_audio_chunk is not None + ) + if ( + transcript_message and not cut_off + ): # if the audio was not cut off, we can set the transcript message to the full message + transcript_message.text = synthesis_result.get_message_up_to(None) + if self.transcriber.get_transcriber_config().mute_during_speech: logger.debug("Unmuting transcriber") self.transcriber.unmute() if transcript_message: - transcript_message.text = message_sent transcript_message.is_final = not cut_off + message_sent = transcript_message.text if transcript_message and cut_off else message if synthesis_result.synthesis_total_span: synthesis_result.synthesis_total_span.finish() return message_sent, cut_off @@ -966,7 +993,7 @@ def mark_terminated(self, bot_disconnect: bool = False): async def terminate(self): self.mark_terminated() - self.broadcast_interrupt() + await self.broadcast_interrupt() self.events_manager.publish_event( TranscriptCompleteEvent( conversation_id=self.id, diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index f2aaf2122c..eee831e296 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -218,9 +218,11 @@ def get_message_up_to( self, message: str, ssml: str, - seconds: float, + seconds: Optional[float], word_boundary_event_pool: WordBoundaryEventPool, ) -> str: + if seconds is None: + return message events = word_boundary_event_pool.get_events_sorted() for event in events: if event["audio_offset"] > seconds: diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index e3e86661fe..ea368cc15b 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -50,6 +50,13 @@ def encode_as_wav(chunk: bytes, synthesizer_config: SynthesizerConfig) -> bytes: class SynthesisResult: + """Holds audio bytes for an utterance and method to know how much of utterance was spoken + + @param chunk_generator - an async generator that that yields ChunkResult objects, which contain chunks of audio and a flag indicating if it is the last chunk + @param get_message_up_to - takes in the number of seconds spoken and returns the message up to that point + - *if seconds is None, then it should return the full messages* + """ + class ChunkResult: def __init__(self, chunk: bytes, is_last_chunk: bool): self.chunk = chunk @@ -58,7 +65,7 @@ def __init__(self, chunk: bytes, is_last_chunk: bool): def __init__( self, chunk_generator: AsyncGenerator[ChunkResult, None], - get_message_up_to: Callable[[float], str], + get_message_up_to: Callable[[Optional[float]], str], cached: bool = False, is_first: bool = False, synthesis_total_span: Optional[SentrySpan] = None, @@ -111,7 +118,7 @@ async def chunk_generator(chunk_transform=lambda x: x): ) else: output_generator = chunk_generator() - return SynthesisResult(output_generator, lambda seconds: self.message.text) + return SynthesisResult(output_generator, lambda _: self.message.text) class CachedAudio: @@ -150,12 +157,12 @@ async def chunk_generator(): if isinstance(self.message, BotBackchannel): - def get_message_up_to(seconds): + def get_message_up_to(seconds: Optional[float]): return self.message.text else: - def get_message_up_to(seconds): + def get_message_up_to(seconds: Optional[float]): return BaseSynthesizer.get_message_cutoff_from_total_response_length( self.synthesizer_config, self.message, seconds, len(self.audio_data) ) @@ -273,20 +280,27 @@ def ready_synthesizer(self, chunk_size: int): def get_message_cutoff_from_total_response_length( synthesizer_config: SynthesizerConfig, message: BaseMessage, - seconds: float, + seconds: Optional[float], size_of_output: int, ) -> str: estimated_output_seconds = size_of_output / synthesizer_config.sampling_rate if not message.text: return message.text + if seconds is None: + return message.text + estimated_output_seconds_per_char = estimated_output_seconds / len(message.text) return message.text[: int(seconds / estimated_output_seconds_per_char)] @staticmethod def get_message_cutoff_from_voice_speed( - message: BaseMessage, seconds: float, words_per_minute: int + message: BaseMessage, seconds: Optional[float], words_per_minute: int ) -> str: + + if seconds is None: + return message.text + words_per_second = words_per_minute / 60 estimated_words_spoken = math.floor(words_per_second * seconds) tokens = word_tokenize(message.text) diff --git a/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py index c4644ad6c4..d95271c41d 100644 --- a/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py @@ -329,11 +329,11 @@ def ready_synthesizer(self, chunk_size: int): self.establish_websocket_listeners(chunk_size) ) - def get_current_message_so_far(self, seconds: float) -> str: + def get_current_message_so_far(self, seconds: Optional[float]) -> str: seconds_idx = 0.0 buffer = "" for utterance, duration in self.current_turn_utterances_by_chunk: - if seconds_idx > seconds: + if seconds is not None and seconds_idx > seconds: return buffer buffer += utterance seconds_idx += duration diff --git a/vocode/streaming/synthesizer/polly_synthesizer.py b/vocode/streaming/synthesizer/polly_synthesizer.py index 4f36cd9057..72385e05ff 100644 --- a/vocode/streaming/synthesizer/polly_synthesizer.py +++ b/vocode/streaming/synthesizer/polly_synthesizer.py @@ -1,7 +1,7 @@ import asyncio import json from concurrent.futures import ThreadPoolExecutor -from typing import Any +from typing import Any, Optional import boto3 @@ -63,9 +63,11 @@ def get_speech_marks(self, message: str) -> Any: def get_message_up_to( self, message: str, - seconds: float, + seconds: Optional[float], word_events, ) -> str: + if seconds is None: + return message for event in word_events: # time field is in ms if event["time"] > seconds * 1000: diff --git a/vocode/streaming/telephony/conversation/abstract_phone_conversation.py b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py index 308919a403..1e3cf4c0ff 100644 --- a/vocode/streaming/telephony/conversation/abstract_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py @@ -49,7 +49,6 @@ def __init__( conversation_id: Optional[str] = None, events_manager: Optional[EventsManager] = None, speed_coefficient: float = 1.0, - per_chunk_allowance_seconds: float = 0.01, ): conversation_id = conversation_id or create_conversation_id() ctx_conversation_id.set(conversation_id) @@ -64,7 +63,6 @@ def __init__( agent_factory.create_agent(agent_config), synthesizer_factory.create_synthesizer(synthesizer_config), conversation_id=conversation_id, - per_chunk_allowance_seconds=per_chunk_allowance_seconds, events_manager=events_manager, speed_coefficient=speed_coefficient, ) diff --git a/vocode/streaming/telephony/conversation/mark_message_queue.py b/vocode/streaming/telephony/conversation/mark_message_queue.py deleted file mode 100644 index c4b17b9319..0000000000 --- a/vocode/streaming/telephony/conversation/mark_message_queue.py +++ /dev/null @@ -1,46 +0,0 @@ -import asyncio -from typing import Dict, Union - -from pydantic.v1 import BaseModel - - -class ChunkFinishedMarkMessage(BaseModel): - chunk_idx: int - - -class UtteranceFinishedMarkMessage(BaseModel): - pass - - -MarkMessage = Union[ChunkFinishedMarkMessage, UtteranceFinishedMarkMessage] - - -class MarkMessageQueue: - """A keyed asyncio.Queue for MarkMessage objects""" - - def __init__(self): - self.utterance_queues: Dict[str, asyncio.Queue[MarkMessage]] = {} - - def create_utterance_queue(self, utterance_id: str): - if utterance_id in self.utterance_queues: - raise ValueError(f"utterance_id {utterance_id} already exists") - self.utterance_queues[utterance_id] = asyncio.Queue() - - def put_nowait( - self, - utterance_id: str, - mark_message: MarkMessage, - ): - if utterance_id in self.utterance_queues: - self.utterance_queues[utterance_id].put_nowait(mark_message) - - async def get( - self, - utterance_id: str, - ) -> MarkMessage: - if utterance_id not in self.utterance_queues: - raise ValueError(f"utterance_id {utterance_id} not found") - return await self.utterance_queues[utterance_id].get() - - def delete_utterance_queue(self, utterance_id: str): - del self.utterance_queues[utterance_id] diff --git a/vocode/streaming/telephony/conversation/twilio_phone_conversation.py b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py index 6145d53b05..f3c833726d 100644 --- a/vocode/streaming/telephony/conversation/twilio_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py @@ -1,10 +1,8 @@ -import asyncio import base64 import json import os -import threading from enum import Enum -from typing import AsyncGenerator, Optional +from typing import Optional from fastapi import WebSocket from loguru import logger @@ -15,25 +13,17 @@ from vocode.streaming.models.synthesizer import SynthesizerConfig from vocode.streaming.models.telephony import PhoneCallDirection, TwilioConfig from vocode.streaming.models.transcriber import TranscriberConfig -from vocode.streaming.models.transcript import Message -from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice +from vocode.streaming.output_device.twilio_output_device import ( + ChunkFinishedMarkMessage, + TwilioOutputDevice, +) from vocode.streaming.synthesizer.abstract_factory import AbstractSynthesizerFactory -from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult -from vocode.streaming.synthesizer.input_streaming_synthesizer import InputStreamingSynthesizer from vocode.streaming.telephony.client.twilio_client import TwilioClient from vocode.streaming.telephony.config_manager.base_config_manager import BaseConfigManager from vocode.streaming.telephony.conversation.abstract_phone_conversation import ( AbstractPhoneConversation, ) -from vocode.streaming.telephony.conversation.mark_message_queue import ( - ChunkFinishedMarkMessage, - MarkMessage, - MarkMessageQueue, - UtteranceFinishedMarkMessage, -) from vocode.streaming.transcriber.abstract_factory import AbstractTranscriberFactory -from vocode.streaming.utils import create_utterance_id -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log from vocode.streaming.utils.events_manager import EventsManager from vocode.streaming.utils.state_manager import TwilioPhoneConversationStateManager @@ -83,7 +73,6 @@ def __init__( synthesizer_factory=synthesizer_factory, speed_coefficient=speed_coefficient, ) - self.mark_message_queue: MarkMessageQueue = MarkMessageQueue() self.config_manager = config_manager self.twilio_config = twilio_config or TwilioConfig( account_sid=os.environ["TWILIO_ACCOUNT_SID"], @@ -140,135 +129,10 @@ async def _handle_ws_message(self, message) -> Optional[TwilioPhoneConversationW chunk = base64.b64decode(media["payload"]) self.receive_audio(chunk) if data["event"] == "mark": - mark_name = data["mark"]["name"] - if mark_name.startswith("chunk-"): - utterance_id, chunk_idx = mark_name.split("-")[1:] - self.mark_message_queue.put_nowait( - utterance_id=utterance_id, - mark_message=ChunkFinishedMarkMessage(chunk_idx=int(chunk_idx)), - ) - elif mark_name.startswith("utterance"): - utterance_id = mark_name.split("-")[1] - self.mark_message_queue.put_nowait( - utterance_id=utterance_id, - mark_message=UtteranceFinishedMarkMessage(), - ) + chunk_id = data["mark"]["name"] + self.output_device.enqueue_mark_message(ChunkFinishedMarkMessage(chunk_id=chunk_id)) elif data["event"] == "stop": logger.debug(f"Media WS: Received event 'stop': {message}") logger.debug("Stopping...") return TwilioPhoneConversationWebsocketAction.CLOSE_WEBSOCKET return None - - async def _send_chunks( - self, - utterance_id: str, - chunk_generator: AsyncGenerator[SynthesisResult.ChunkResult, None], - clear_message_lock: asyncio.Lock, - stop_event: threading.Event, - ): - chunk_idx = 0 - try: - async for chunk_result in chunk_generator: - async with clear_message_lock: - if stop_event.is_set(): - break - self.output_device.consume_nonblocking(chunk_result.chunk) - self.output_device.send_chunk_finished_mark(utterance_id, chunk_idx) - chunk_idx += 1 - except asyncio.CancelledError: - pass - finally: - logger.debug("Finished sending all chunks to Twilio") - self.output_device.send_utterance_finished_mark(utterance_id) - - async def send_speech_to_output( - self, - message: str, - synthesis_result: SynthesisResult, - stop_event: threading.Event, - seconds_per_chunk: float, - transcript_message: Optional[Message] = None, - started_event: Optional[threading.Event] = None, - ): - """In contrast with send_speech_to_output in the base class, this function uses mark messages - to support interruption - we send all chunks to the output device, and then wait for mark messages[0] - that indicate that each chunk has been played. This means that we don't need to depends on asyncio.sleep - to support interruptions. - - Once we receive an interruption signal: - - we send a clear message to Twilio to stop playing all queued audio - - based on the number of mark messages we've received back, we know how many chunks were played and can indicate on the transcript - - [0] https://www.twilio.com/docs/voice/twiml/stream#websocket-messages-to-twilio - """ - - if self.transcriber.get_transcriber_config().mute_during_speech: - logger.debug("Muting transcriber") - self.transcriber.mute() - message_sent = message - cut_off = False - chunk_idx = 0 - seconds_spoken = 0.0 - logger.debug(f"Start sending speech {message} to output") - - utterance_id = create_utterance_id() - self.mark_message_queue.create_utterance_queue(utterance_id) - - first_chunk_span = self._maybe_create_first_chunk_span(synthesis_result, message) - - clear_message_lock = asyncio.Lock() - - asyncio_create_task_with_done_error_log( - self._send_chunks( - utterance_id, - synthesis_result.chunk_generator, - clear_message_lock, - stop_event, - ), - ) - mark_event: MarkMessage - first = True - while True: - mark_event = await self.mark_message_queue.get(utterance_id) - if isinstance(mark_event, UtteranceFinishedMarkMessage): - break - if first and first_chunk_span: - self._track_first_chunk(first_chunk_span, synthesis_result) - first = False - seconds_spoken = mark_event.chunk_idx * seconds_per_chunk - # Lock here so that we check the stop event and send the clear message atomically - # w.r.t. the _send_chunks task which also checks the stop event - # Otherwise, we could send the clear message while _send_chunks is in the middle of sending a chunk - # and the synthesis wouldn't be cleared - async with clear_message_lock: - if stop_event.is_set(): - self.output_device.send_clear_message() - logger.debug( - "Interrupted, stopping text to speech after {} chunks".format(chunk_idx) - ) - message_sent = synthesis_result.get_message_up_to(seconds_spoken) - cut_off = True - break - if chunk_idx == 0: - if started_event: - started_event.set() - self.mark_last_action_timestamp() - chunk_idx += 1 - seconds_spoken += seconds_per_chunk - if transcript_message: - transcript_message.text = synthesis_result.get_message_up_to(seconds_spoken) - self.mark_message_queue.delete_utterance_queue(utterance_id) - if self.transcriber.get_transcriber_config().mute_during_speech: - logger.debug("Unmuting transcriber") - self.transcriber.unmute() - if transcript_message: - # For input streaming synthesizers, we have to buffer the message as it is streamed in - # What is said is federated fully by synthesis_result.get_message_up_to - if isinstance(self.synthesizer, InputStreamingSynthesizer): - message_sent = transcript_message.text - else: - transcript_message.text = message_sent - transcript_message.is_final = not cut_off - if synthesis_result.synthesis_total_span: - synthesis_result.synthesis_total_span.finish() - return message_sent, cut_off diff --git a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py index 8af5399d55..38629f89e9 100644 --- a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py @@ -47,7 +47,6 @@ def __init__( events_manager: Optional[EventsManager] = None, output_to_speaker: bool = False, speed_coefficient: float = 1.0, - per_chunk_allowance_seconds: float = 0.01, noise_suppression: bool = False, ): self.speed_coefficient = speed_coefficient @@ -67,7 +66,6 @@ def __init__( transcriber_factory=transcriber_factory, agent_factory=agent_factory, synthesizer_factory=synthesizer_factory, - per_chunk_allowance_seconds=per_chunk_allowance_seconds, ) self.vonage_config = vonage_config self.telephony_client = VonageClient( diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index 4745b79a65..3e89d23d12 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -58,19 +58,18 @@ def terminate(self): pass -class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker): +class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker[bytes]): # type: ignore def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) AsyncWorker.__init__(self, self.input_queue, self.output_queue) - async def _run_loop(self): - raise NotImplementedError - def terminate(self): AsyncWorker.terminate(self) -class BaseThreadAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], ThreadAsyncWorker): +class BaseThreadAsyncTranscriber( # type: ignore + AbstractTranscriber[TranscriberConfigType], ThreadAsyncWorker[bytes] +): def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) ThreadAsyncWorker.__init__(self, self.input_queue, self.output_queue) diff --git a/vocode/streaming/utils/__init__.py b/vocode/streaming/utils/__init__.py index 6f2585e090..31dd24998c 100644 --- a/vocode/streaming/utils/__init__.py +++ b/vocode/streaming/utils/__init__.py @@ -135,3 +135,12 @@ async def generate_from_async_iter_with_lookahead( if buffer and stream_length <= lookahead: yield buffer return + + +async def enumerate_async_iter( + async_iter: AsyncIterator[AsyncIteratorGenericType], +) -> AsyncGenerator[Tuple[int, AsyncIteratorGenericType], None]: + i = 0 + async for item in async_iter: + yield i, item + i += 1 diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index 80021b580f..cdbff41ace 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -15,7 +15,7 @@ class AsyncWorker(Generic[WorkerInputType]): def __init__( self, - input_queue: asyncio.Queue, + input_queue: asyncio.Queue[WorkerInputType], output_queue: asyncio.Queue = asyncio.Queue(), ) -> None: self.worker_task: Optional[asyncio.Task] = None @@ -93,7 +93,7 @@ def terminate(self): return super().terminate() -class AsyncQueueWorker(AsyncWorker): +class AsyncQueueWorker(AsyncWorker[WorkerInputType]): async def _run_loop(self): while True: try: diff --git a/vocode/turn_based/output_device/base_output_device.py b/vocode/turn_based/output_device/abstract_output_device.py similarity index 54% rename from vocode/turn_based/output_device/base_output_device.py rename to vocode/turn_based/output_device/abstract_output_device.py index d54c0c7fd6..c2eb148f2e 100644 --- a/vocode/turn_based/output_device/base_output_device.py +++ b/vocode/turn_based/output_device/abstract_output_device.py @@ -1,9 +1,13 @@ +from abc import ABC, abstractmethod + from pydub import AudioSegment -class BaseOutputDevice: +class AbstractOutputDevice(ABC): + + @abstractmethod def send_audio(self, audio: AudioSegment) -> None: - raise NotImplementedError + pass def terminate(self): pass diff --git a/vocode/turn_based/output_device/speaker_output.py b/vocode/turn_based/output_device/speaker_output.py index a0b35dc4da..a3f748f9ed 100644 --- a/vocode/turn_based/output_device/speaker_output.py +++ b/vocode/turn_based/output_device/speaker_output.py @@ -4,10 +4,10 @@ import sounddevice as sd from pydub import AudioSegment -from vocode.turn_based.output_device.base_output_device import BaseOutputDevice +from vocode.turn_based.output_device.abstract_output_device import AbstractOutputDevice -class SpeakerOutput(BaseOutputDevice): +class SpeakerOutput(AbstractOutputDevice): DEFAULT_SAMPLING_RATE = 44100 def __init__( diff --git a/vocode/turn_based/turn_based_conversation.py b/vocode/turn_based/turn_based_conversation.py index faddb613b0..0eb9e506a8 100644 --- a/vocode/turn_based/turn_based_conversation.py +++ b/vocode/turn_based/turn_based_conversation.py @@ -2,7 +2,7 @@ from vocode.turn_based.agent.base_agent import BaseAgent from vocode.turn_based.input_device.base_input_device import BaseInputDevice -from vocode.turn_based.output_device.base_output_device import BaseOutputDevice +from vocode.turn_based.output_device.abstract_output_device import AbstractOutputDevice from vocode.turn_based.synthesizer.base_synthesizer import BaseSynthesizer from vocode.turn_based.transcriber.base_transcriber import BaseTranscriber @@ -14,7 +14,7 @@ def __init__( transcriber: BaseTranscriber, agent: BaseAgent, synthesizer: BaseSynthesizer, - output_device: BaseOutputDevice, + output_device: AbstractOutputDevice, ): self.input_device = input_device self.transcriber = transcriber From a39cf15c595d7a4091cba212ff69a5377bb679ea Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 3 Jul 2024 12:12:59 -0700 Subject: [PATCH 104/148] [DOW-101] LiveKit integration (#591) * checkpoint * livekit v0 * in progress changes * integrate with worker * fix import * update deps and remove unneeded files * integrate it properly into app * fix interrupts * make transcript publish work * a confounding fix * isort * constants, some cleanup --------- Co-authored-by: Kian --- apps/livekit/README.md | 3 + apps/livekit/app.py | 107 + apps/livekit/poetry.lock | 3176 +++++++++++++++++ apps/livekit/pyproject.toml | 19 + poetry.lock | 625 ++-- pyproject.toml | 5 +- vocode/streaming/livekit/constants.py | 5 + .../streaming/livekit/livekit_conversation.py | 68 + .../livekit/livekit_events_manager.py | 55 + vocode/streaming/models/transcriber.py | 10 + .../output_device/livekit_output_device.py | 69 + vocode/streaming/streaming_conversation.py | 11 +- .../conversation/twilio_phone_conversation.py | 2 +- .../conversation/vonage_phone_conversation.py | 2 +- 14 files changed, 3854 insertions(+), 303 deletions(-) create mode 100644 apps/livekit/README.md create mode 100644 apps/livekit/app.py create mode 100644 apps/livekit/poetry.lock create mode 100644 apps/livekit/pyproject.toml create mode 100644 vocode/streaming/livekit/constants.py create mode 100644 vocode/streaming/livekit/livekit_conversation.py create mode 100644 vocode/streaming/livekit/livekit_events_manager.py create mode 100644 vocode/streaming/output_device/livekit_output_device.py diff --git a/apps/livekit/README.md b/apps/livekit/README.md new file mode 100644 index 0000000000..eaed5defce --- /dev/null +++ b/apps/livekit/README.md @@ -0,0 +1,3 @@ +``` +poetry run python app.py dev +``` diff --git a/apps/livekit/app.py b/apps/livekit/app.py new file mode 100644 index 0000000000..6ae788f3f6 --- /dev/null +++ b/apps/livekit/app.py @@ -0,0 +1,107 @@ +import asyncio +import os + +from livekit.agents import JobContext, JobRequest, WorkerOptions, cli +from loguru import logger +from pydantic_settings import BaseSettings, SettingsConfigDict + +from vocode.logging import configure_pretty_logging +from vocode.streaming.action.end_conversation import EndConversationVocodeActionConfig +from vocode.streaming.agent.chat_gpt_agent import ChatGPTAgent +from vocode.streaming.livekit.livekit_conversation import LiveKitConversation +from vocode.streaming.models.actions import ( + PhraseBasedActionTrigger, + PhraseBasedActionTriggerConfig, + PhraseTrigger, +) +from vocode.streaming.models.agent import ChatGPTAgentConfig +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import AzureSynthesizerConfig +from vocode.streaming.models.transcriber import ( + DeepgramTranscriberConfig, + PunctuationEndpointingConfig, +) +from vocode.streaming.output_device.livekit_output_device import LiveKitOutputDevice +from vocode.streaming.synthesizer.azure_synthesizer import AzureSynthesizer +from vocode.streaming.transcriber.deepgram_transcriber import DeepgramTranscriber + + +class Settings(BaseSettings): + + livekit_api_key: str = "ENTER_YOUR_LIVE_KIT_API_KEY" + livekit_api_secret: str = "ENTER_YOUR_LIVE_KIT_API_SECRET" + livekit_ws_url: str = "ENTER_YOUR_LIVE_KIT_WS_URL" + + # This means a .env file can be used to overload these settings + # ex: "OPENAI_API_KEY=my_key" will set openai_api_key over the default above + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + extra="ignore", + ) + + +async def wait_for_termination(conversation: LiveKitConversation, ctx: JobContext): + await conversation.wait_for_termination() + await conversation.terminate() + await ctx.room.disconnect() + + +async def entrypoint(ctx: JobContext): + configure_pretty_logging() + output_device = LiveKitOutputDevice() + conversation = LiveKitConversation( + output_device=output_device, + transcriber=DeepgramTranscriber( + DeepgramTranscriberConfig.from_livekit_input_device( + endpointing_config=PunctuationEndpointingConfig(), + api_key=os.getenv("DEEPGRAM_API_KEY"), + ), + ), + agent=ChatGPTAgent( + ChatGPTAgentConfig( + openai_api_key=os.getenv("OPENAI_API_KEY"), + initial_message=BaseMessage(text="What up"), + prompt_preamble="""The AI is having a pleasant conversation about life""", + actions=[ + EndConversationVocodeActionConfig( + action_trigger=PhraseBasedActionTrigger( + config=PhraseBasedActionTriggerConfig( + phrase_triggers=[ + PhraseTrigger( + phrase="goodbye", + conditions=["phrase_condition_type_contains"], + ) + ] + ) + ) + ) + ], + ) + ), + synthesizer=AzureSynthesizer( + synthesizer_config=AzureSynthesizerConfig.from_output_device( + output_device=output_device, + voice_name="en-US-AriaNeural", + ) + ), + ) + await conversation.start_room(ctx.room) + asyncio.create_task(wait_for_termination(conversation, ctx)) + + +async def request_fnc(req: JobRequest) -> None: + logger.info("received request %s", req) + await req.accept(entrypoint) + + +if __name__ == "__main__": + settings = Settings() + cli.run_app( + WorkerOptions( + request_fnc, + api_key=settings.livekit_api_key, + api_secret=settings.livekit_api_secret, + ws_url=settings.livekit_ws_url, + ) + ) diff --git a/apps/livekit/poetry.lock b/apps/livekit/poetry.lock new file mode 100644 index 0000000000..dab30f5a85 --- /dev/null +++ b/apps/livekit/poetry.lock @@ -0,0 +1,3176 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anthropic" +version = "0.28.1" +description = "The official Python library for the anthropic API" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anthropic-0.28.1-py3-none-any.whl", hash = "sha256:c4773ae2b42951a6b747bed328b0d03fa412938c95c3a8b9dce70d69badb710b"}, + {file = "anthropic-0.28.1.tar.gz", hash = "sha256:e3a6d595bde241141bdc685edc393903ec95c7fa378013a71186cfb8f32b1793"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tokenizers = ">=0.13.0" +typing-extensions = ">=4.7,<5" + +[package.extras] +bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"] +vertex = ["google-auth (>=2,<3)"] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "azure-cognitiveservices-speech" +version = "1.38.0" +description = "Microsoft Cognitive Services Speech SDK for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:18dce915ab032711f687abb3297dd19176b9cbea562b322ee6fa7365ef4a5091"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9dd0800fbc4a8438c6dfd5747a658251914fe2d205a29e9b46158cadac6ab381"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:1c344e8a6faadb063cea451f0301e13b44d9724e1242337039bff601e81e6f86"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1e002595a749471efeac3a54c80097946570b76c13049760b97a4b881d9d24af"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win32.whl", hash = "sha256:16a530e6c646eb49ea0bc05cb45a9d28b99e4b67613f6c3a6c54e26e6bf65241"}, + {file = "azure_cognitiveservices_speech-1.38.0-py3-none-win_amd64.whl", hash = "sha256:1d38d8c056fb3f513a9ff27ab4e77fd08ca487f8788cc7a6df772c1ab2c97b54"}, +] + +[[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {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" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "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 = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "elevenlabs" +version = "1.3.1" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "elevenlabs-1.3.1-py3-none-any.whl", hash = "sha256:96cb48d3527393b0f56fb9c6a26ad6520e2999a4c1ac9ca2b525ab7a26ea7342"}, + {file = "elevenlabs-1.3.1.tar.gz", hash = "sha256:23df9b48960bc1d48b9fe13a5dad74144a83ce5ed83708dd7dcf6180f44ce697"}, +] + +[package.dependencies] +httpx = ">=0.21.2" +pydantic = ">=1.9.2" +requests = ">=2.20" +typing_extensions = ">=4.0.0" +websockets = ">=11.0" + +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "fastapi" +version = "0.111.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, + {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, +] + +[package.dependencies] +email_validator = ">=2.0.0" +fastapi-cli = ">=0.0.2" +httpx = ">=0.23.0" +jinja2 = ">=2.11.2" +orjson = ">=3.2.1" +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +python-multipart = ">=0.0.7" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" +ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" +uvicorn = {version = ">=0.12.0", extras = ["standard"]} + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-cli" +version = "0.0.4" +description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, + {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, +] + +[package.dependencies] +typer = ">=0.12.3" + +[package.extras] +standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] + +[[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" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.6.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, + {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +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 = "grpcio" +version = "1.64.1" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, + {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, + {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, + {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, + {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, + {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, + {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, + {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, + {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, + {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, + {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, + {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, + {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, + {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, + {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, + {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, + {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, + {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, + {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, + {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, + {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, + {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, + {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, + {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, + {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, + {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, + {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, + {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, + {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, + {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, + {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.1)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httptools" +version = "0.6.1" +description = "A collection of framework independent HTTP protocol utils." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, + {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, + {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, + {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, + {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, + {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, + {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, + {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, + {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, + {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, + {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, + {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, + {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3"}, + {file = "httptools-0.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97"}, + {file = "httptools-0.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4"}, + {file = "httptools-0.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf"}, + {file = "httptools-0.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, + {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, + {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, + {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, + {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, + {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.23.4" +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.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, + {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, +] + +[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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.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.3.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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "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" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.1.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["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)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "janus" +version = "1.0.0" +description = "Mixed sync-async queue to interoperate between asyncio tasks and classic threads" +optional = false +python-versions = ">=3.7" +files = [ + {file = "janus-1.0.0-py3-none-any.whl", hash = "sha256:2596ea5482711c1ee3ef2df6c290aaf370a13c55a007826e8f7c32d696d1d00a"}, + {file = "janus-1.0.0.tar.gz", hash = "sha256:df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612"}, +] + +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jiter" +version = "0.4.2" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, + {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, + {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, + {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, + {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, + {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, + {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, + {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, + {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, + {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, + {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, + {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, + {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, + {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, + {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, + {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, + {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, + {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, + {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, + {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, + {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, + {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, + {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, + {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, + {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, + {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, + {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "livekit" +version = "0.11.1" +description = "Python Real-time SDK for LiveKit" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "livekit-0.11.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:262ec6aa47a3bcd43cfebc6a288be476ce05a68a40bb034db70be40c084e07a6"}, + {file = "livekit-0.11.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a00d56152cf4151580c3f869b4854aeca4116be68d42857651ecb9cfd24f6ac3"}, + {file = "livekit-0.11.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:768b976087cbaae625a35c0bb9e1a3a8345a6d00b7407bda2c95a6acf2d31eb4"}, + {file = "livekit-0.11.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:8645382faa3acbd4cedb905e2708f88ff9b48b6a6b88d4d4baff9ead96526fd9"}, + {file = "livekit-0.11.1-py3-none-win_amd64.whl", hash = "sha256:4177dc0903fc2fa6ead987d2abd9d1adb65ea0297eaa8a818db9a55837f61206"}, + {file = "livekit-0.11.1.tar.gz", hash = "sha256:1e5a79262f90e8ffee180fc0600c2f6eb95eccc6d31f1e5e4a425fa429050b0b"}, +] + +[package.dependencies] +protobuf = ">=3" +types-protobuf = ">=3" + +[[package]] +name = "livekit-agents" +version = "0.7.2" +description = "LiveKit Python Agents" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "livekit_agents-0.7.2-py3-none-any.whl", hash = "sha256:3e5b435dac1cdb66726f13bd5d333da64709f037591b5b40b04e6392debe36b8"}, + {file = "livekit_agents-0.7.2.tar.gz", hash = "sha256:c273e0845546c0fc6f1691a5139801a2f900bf0b960fe88bde94486b19b69d43"}, +] + +[package.dependencies] +attrs = ">=23.0,<24.0" +click = ">=8.1,<9.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +livekit = ">=0.11,<1.0" +livekit-api = ">=0.4,<1.0" +livekit-protocol = ">=0.4,<1.0" +protobuf = ">=3" +psutil = ">=5.9,<6.0" +types-protobuf = ">=4,<5" +watchfiles = ">=0.22,<1.0" + +[package.extras] +codecs = ["av (>=11.0.0)"] +images = ["pillow (>=10.3.0,<10.4.0)"] + +[[package]] +name = "livekit-api" +version = "0.5.1" +description = "Python Server API for LiveKit" +optional = false +python-versions = ">=3.9.0" +files = [ + {file = "livekit_api-0.5.1-py3-none-any.whl", hash = "sha256:46f50c45e5ef57dca9e071a205d9fe82929c6196a6318b98f6f62bbacc84c76a"}, + {file = "livekit_api-0.5.1.tar.gz", hash = "sha256:7c5a8c0131b2880a091c19345a0e549be8a1448b63ba34611ff8bf63077ab0dd"}, +] + +[package.dependencies] +aiohttp = ">=3.9.0" +livekit-protocol = ">=0.5.1,<2" +protobuf = ">=3" +pyjwt = ">=2.0.0" +types-protobuf = ">=4,<5" + +[[package]] +name = "livekit-protocol" +version = "0.5.1" +description = "Python protocol stubs for LiveKit" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "livekit_protocol-0.5.1-py3-none-any.whl", hash = "sha256:91655cbceffc514ddd0d01cfa1c12acbce2e59020208ce6847d8804003ba98fd"}, + {file = "livekit_protocol-0.5.1.tar.gz", hash = "sha256:37e6cc798ed4e3746cd94ac42ce034c88cc99ab309f3c40a8bf1fc403a111598"}, +] + +[package.dependencies] +protobuf = ">=3" +types-protobuf = ">=4,<5" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[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" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[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 = "miniaudio" +version = "1.59" +description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" +optional = false +python-versions = "*" +files = [ + {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, + {file = "miniaudio-1.59-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba6f802376f49977e9698740411db46092ea005894ff86d805aeddde7e505c1e"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f24b44bd28ca631b830bc91bd910cb0209fba005401effa64cee9a8ba580992"}, + {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8980dda51e92ea750ca8bcfb1d2c198eca7e4c844ab857faac12e20245322aa6"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e21f56d51c627cef612d1a7bbc73fc7c5e03908f5ebc22c98494951ab8ccd3c8"}, + {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f6f1665ce8ed46caac48beec64c70e248a0b4e001590c698695cd22c1f634a0"}, + {file = "miniaudio-1.59-cp310-cp310-win32.whl", hash = "sha256:799b393adce56c8df1df16e7dc692a83125888df9ecf8ec0242c4905df6275ef"}, + {file = "miniaudio-1.59-cp310-cp310-win_amd64.whl", hash = "sha256:44c6b48f01d934784da282f7a17c40be9110ee6bc723f5f90916d2b2e729c9cc"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a9387e85e6a63d66a873f4208fbaba93179d11423da08dc83c78dd1b68ba504"}, + {file = "miniaudio-1.59-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12fbbe3934856ab54fa8889ab6ec6b62a97faa2f85a8830e286fe5a4e9584ca4"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4a9a1dc4352af4198f6ca0c20bac8b5b6a89d0d67e3535149ef08420a1ab3c9"}, + {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eb9eac3f23fd4c94925830fa9c172e98aebfb12cec1dbfa6a7693b9e4c1e555"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:52882c36126c3a97fcdd8d753e4b1b07934bba9d4d3c431aa7f4914849090cac"}, + {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6bb6deee6d5969292d22730d31ee85ed0edc2997ca79978db0cca269ab73761"}, + {file = "miniaudio-1.59-cp311-cp311-win32.whl", hash = "sha256:6afe7449d7d593ba3f8bd91085a392d0c6ca3be4c03b62af37cb46f6c0c0d9f4"}, + {file = "miniaudio-1.59-cp311-cp311-win_amd64.whl", hash = "sha256:a22832e449a31620317ae657f7fd20a42466e5768c48373f8f28c53f2b36f5cd"}, + {file = "miniaudio-1.59-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbfb3c853641c8bd835e0654f49fe0c09b4018b1ecc7e4c2436e02fbaf748c4b"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45ce3596c693053a578db725848a90ba0dfcc03d1d94124b9fddaa9e50a7533e"}, + {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d07228047352b655a82711704a635eee41eb3977ceaaf672ee17d64a3ba261b7"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:586f95f1d10f5d4f58b272c15c601c3ba13128bd34a839bce5bd28a839d5cf3c"}, + {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7644f19b1dc00bca3ec9e6066eb8879c0e638091955092a1d7085a38d7de6e0f"}, + {file = "miniaudio-1.59-cp37-cp37m-win32.whl", hash = "sha256:055fb3a2e00ddcce2a2809cd2a3d5e68234588a00c70533fa4b68f0178829dce"}, + {file = "miniaudio-1.59-cp37-cp37m-win_amd64.whl", hash = "sha256:e1acea13830a53c026e58d44856ba4951a26eb0d0a2fda2ce6dc7280b6f57f81"}, + {file = "miniaudio-1.59-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8b6f1d4a2551061721cc7b22fb0eb3839aad9137553e01b4dde1a31c91ca45"}, + {file = "miniaudio-1.59-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:011b2b8d5c57a485a6b86476e24c1c6be4a61ec8c33c456e3052929269857d0d"}, + {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b270e9e1df5ec05d03659febffaa704709d7c9cb0b3597cb0a993875d73be84"}, + {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab9d0468790109bafc88ce9d1c93454b2d384af0c14a6657620315115390c8d"}, + {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0f0ffa87bef0b3bf932eff60aec97ac90e2adf7373e9170969c6f98ba1c5635"}, + {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1a03e514b12ba5d93fe48470ddc6a7f4025cd8de5f604233fc899507e5a054c1"}, + {file = "miniaudio-1.59-cp38-cp38-win32.whl", hash = "sha256:19c6406342989a6774305cd214314028553cbb9fcbc5ed43ab17a7f6b43aa46b"}, + {file = "miniaudio-1.59-cp38-cp38-win_amd64.whl", hash = "sha256:239bd4ff17aa7eede52b30a2153a28fe0bf2891aa43617a10348dd90f20d727e"}, + {file = "miniaudio-1.59-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88930514e6a9a6258d3536638da5ceb3aaa1d6643122e0704db7fd08ff924368"}, + {file = "miniaudio-1.59-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6d195800a6162464731ba484580cdab3be5bcc47a366c8440be6015f16d059b1"}, + {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fcd4484eea26629eb9602ebcab0181f515881e736deccb235c2c0d99d7b4215"}, + {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa0ff716a9eb79799ed623f619ed6b0bc1669046cd1f2070de20d3dc6737a822"}, + {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:878623ffa77c366c76c4202d3095835943bd8f8f604bbdc1872030d646817e4a"}, + {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aca5d9e9774ddbad5c4a5c65dfb1e7fba9e4570092ba6891f439f7c849d21ed"}, + {file = "miniaudio-1.59-cp39-cp39-win32.whl", hash = "sha256:0e05f09d58ed32e7cdc1bad9342155b81e378ff2101242cf8a8f06cd56dae043"}, + {file = "miniaudio-1.59-cp39-cp39-win_amd64.whl", hash = "sha256:0e51899a148b393e84ee3a201a72c8fa4d19413f5b1b705ff5ae9f8eee956a7a"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:07de990f047e693681f15736be2e169e3f53064d1e6a7d0c37837297fa18929c"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03beea7dabeb2be1a0a4718458e0b85e3c23692563b0f8841164d71ef2c2eef"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c2cb1fdc92ace828bceabb602b4d2f52040a361632d71b810144656b8334738"}, + {file = "miniaudio-1.59-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5597384fa7dda1691adca46568ffaabcf39c0a224bf5b9548665a255b86a4f35"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d253c994a27062788f60a8fb1f8571320b72ddc44fd4128fdd85634cf38717a4"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb71fb5d5491335fc565c157a01a8c6907180e113c3c0d9a6c22e28458be5919"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21569111381b877d5445c917b00dfe038b434cb9dacaa4c548ca8c6b5e6d5b55"}, + {file = "miniaudio-1.59-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8686712f90189eaa6f9fc3eb503eb3487b09ca52417690fd14ac53306d55a125"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4674c49ee2489595f65a8cdc1c48a3e8bc0f577b1eb957d918a942b88480e5a8"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa69c55197215dabf85bc8f9f9d7128af08db402f12aea962e16bad1ac4dca8"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2668b03594612dacea4521483e38da56b51ce8a92d06106643f520ce092a82"}, + {file = "miniaudio-1.59-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6117c09da1944a59b7af3009d37c8eb6e0219174f5e00501b797687ddbe9c5a3"}, + {file = "miniaudio-1.59.tar.gz", hash = "sha256:2b68f496a8655497cde827c77aba3c3557f0f2bb7c38a6ecab34090ab4556277"}, +] + +[package.dependencies] +cffi = ">=1.12.0" + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "openai" +version = "1.35.3" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.35.3-py3-none-any.whl", hash = "sha256:7b26544cef80f125431c073ffab3811d2421fbb9e30d3bd5c2436aba00b042d5"}, + {file = "openai-1.35.3.tar.gz", hash = "sha256:d6177087f150b381d49499be782d764213fdf638d391b29ca692b84dd675a389"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +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.25.0" +description = "OpenTelemetry Python API" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, + {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, +] + +[package.dependencies] +deprecated = ">=1.2.6" +importlib-metadata = ">=6.0,<=7.1" + +[[package]] +name = "opentelemetry-sdk" +version = "1.25.0" +description = "OpenTelemetry Python SDK" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, + {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, +] + +[package.dependencies] +opentelemetry-api = "1.25.0" +opentelemetry-semantic-conventions = "0.46b0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.46b0" +description = "OpenTelemetry Semantic Conventions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, + {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, +] + +[package.dependencies] +opentelemetry-api = "1.25.0" + +[[package]] +name = "orjson" +version = "3.10.5" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, + {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, + {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, + {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, + {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, + {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, + {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, + {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, + {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, + {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, + {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, + {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, + {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, + {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, + {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, + {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, + {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, + {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, + {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, + {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, + {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, + {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, + {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, + {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, + {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, + {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "phonenumbers" +version = "8.13.39" +description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." +optional = false +python-versions = "*" +files = [ + {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, + {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, +] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.7.4" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, + {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.4" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.4" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, + {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, + {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, + {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, + {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, + {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, + {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, + {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, + {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, + {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, + {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, + {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, + {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, + {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, + {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, + {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, + {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, + {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, + {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, + {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, + {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, + {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, + {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, + {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, + {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, + {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, + {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, + {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, + {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, + {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.3.4" +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"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pydub" +version = "0.25.1" +description = "Manipulate audio with an simple and easy high level interface" +optional = false +python-versions = "*" +files = [ + {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, + {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, +] + +[[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 = "pyht" +version = "0.0.28" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pyht-0.0.28-py3-none-any.whl", hash = "sha256:ad8801acaa906eff5d6b39ce5ca76a08c154f705a2d0b2b6e841b219ef7875be"}, + {file = "pyht-0.0.28.tar.gz", hash = "sha256:00792e8c068fc905557525de9db0dbd7dcb651e15f05c6cc49490340b95a444a"}, +] + +[package.dependencies] +filelock = ">=3.12.4,<4.0.0" +grpcio = ">=1.58.0,<2.0.0" +protobuf = ">=4.24.3,<5.0.0" +requests = ">=2.31.0,<3.0.0" + +[[package]] +name = "pyjwt" +version = "2.8.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, + {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.9" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + +[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 = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "redis" +version = "5.0.6" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, + {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2024.5.15" +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"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "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 = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "sentry-sdk" +version = "2.6.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sentry_sdk-2.6.0-py2.py3-none-any.whl", hash = "sha256:422b91cb49378b97e7e8d0e8d5a1069df23689d45262b86f54988a7db264e874"}, + {file = "sentry_sdk-2.6.0.tar.gz", hash = "sha256:65cc07e9c6995c5e316109f138570b32da3bd7ff8d0d0ee4aaf2628c3dd8127d"}, +] + +[package.dependencies] +certifi = "*" +fastapi = {version = ">=0.79.0", optional = true, markers = "extra == \"fastapi\""} +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-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +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 (>=5)"] + +[[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 = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sounddevice" +version = "0.4.7" +description = "Play and Record Sound with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sounddevice-0.4.7-py3-none-any.whl", hash = "sha256:1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7"}, + {file = "sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a"}, + {file = "sounddevice-0.4.7-py3-none-win32.whl", hash = "sha256:1ec1df094c468a210113aa22c4f390d5b4d9c7a73e41a6cb6ecfec83db59b380"}, + {file = "sounddevice-0.4.7-py3-none-win_amd64.whl", hash = "sha256:0c8b3543da1496f282b66a7bc54b755577ba638b1af06c146d4ac7f39d86b548"}, + {file = "sounddevice-0.4.7.tar.gz", hash = "sha256:69b386818d50a2d518607d4b973442e8d524760c7cd6c8b8be03d8c98fc4bce7"}, +] + +[package.dependencies] +CFFI = ">=1.0" + +[package.extras] +numpy = ["NumPy"] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tokenizers" +version = "0.19.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"}, + {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"}, + {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"}, + {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"}, + {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"}, + {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, + {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, + {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, + {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, + {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, + {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"}, + {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"}, + {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"}, + {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"}, + {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"}, + {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"}, + {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"}, + {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"}, + {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"}, + {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"}, + {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"}, + {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"}, + {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"}, + {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"}, + {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"}, + {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"}, + {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"}, + {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"}, + {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"}, + {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"}, + {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"}, + {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"}, + {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"}, + {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"}, + {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"}, + {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, +] + +[package.dependencies] +huggingface-hub = ">=0.16.4,<1.0" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools-rust", "sphinx", "sphinx-rtd-theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] + +[[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +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 = "types-protobuf" +version = "4.25.0.20240417" +description = "Typing stubs for protobuf" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-protobuf-4.25.0.20240417.tar.gz", hash = "sha256:c34eff17b9b3a0adb6830622f0f302484e4c089f533a46e3f147568313544352"}, + {file = "types_protobuf-4.25.0.20240417-py3-none-any.whl", hash = "sha256:e9b613227c2127e3d4881d75d93c93b4d6fd97b5f6a099a0b654a05351c8685d"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "ujson" +version = "5.10.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, + {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, + {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, + {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, + {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, + {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, + {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, + {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, + {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, + {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, + {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, + {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, + {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, + {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, + {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, + {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, + {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, + {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, + {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, + {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, + {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, + {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, + {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, + {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, + {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, + {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, + {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, + {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, + {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, + {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, + {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, + {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, + {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, + {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, + {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.30.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, + {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.19.0" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, + {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, + {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, + {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, + {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, + {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, + {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, + {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, + {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, + {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd"}, + {file = "uvloop-0.19.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be"}, + {file = "uvloop-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d"}, + {file = "uvloop-0.19.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, + {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, + {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, + {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, + {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, +] + +[package.extras] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] + +[[package]] +name = "vocode" +version = "0.1.113" +description = "The all-in-one voice SDK" +optional = false +python-versions = ">=3.10,<4.0" +files = [] +develop = true + +[package.dependencies] +aiohttp = "^3.9.5" +anthropic = "^0.28.0" +azure-cognitiveservices-speech = "^1.38.0" +elevenlabs = "^1.2.2" +fastapi = "^0.111.0" +janus = "^1.0.0" +jinja2 = "^3.1.4" +jsonschema = "^4.22.0" +livekit-api = "^0.5.0" +loguru = "^0.7.2" +miniaudio = "^1.59.0" +nltk = "^3.8.1" +numpy = "^1.26.4" +openai = "^1.30.5" +opentelemetry-sdk = "^1.24.0" +phonenumbers = "^8.13.37" +pydantic = "^2.7.2" +pydantic-settings = "^2.3.0" +pydub = "^0.25.1" +pyht = "^0.0.28" +redis = "^5.0.4" +requests = "^2.32.3" +sentry-sdk = {version = "^2.3.1", extras = ["fastapi"]} +sounddevice = "^0.4.7" +tiktoken = "^0.7.0" +uvicorn = "^0.30.0" +websockets = "^12.0" + +[package.extras] +all = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-speech (>=2.26.0,<3.0.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "langchain (>=0.2.3,<0.3.0)", "langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-community (>=0.2.4,<0.3.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)", "livekit (>=0.11.1,<0.12.0)", "pvkoala (>=2.0.1,<3.0.0)", "twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +langchain = ["langchain (>=0.2.3,<0.3.0)", "langchain-community (>=0.2.4,<0.3.0)"] +langchain-extras = ["langchain-anthropic (>=0.1.15,<0.2.0)", "langchain-google-vertexai (>=1.0.5,<2.0.0)", "langchain-openai (>=0.1.8,<0.2.0)"] +synthesizers = ["cartesia (>=0.1.1,<0.2.0)", "google-cloud-texttospeech (>=2.16.3,<3.0.0)", "pvkoala (>=2.0.1,<3.0.0)"] +telephony = ["twilio (>=9.1.0,<10.0.0)", "vonage (>=3.14.0,<4.0.0)"] +transcribers = ["google-cloud-speech (>=2.26.0,<3.0.0)"] + +[package.source] +type = "directory" +url = "../.." + +[[package]] +name = "watchfiles" +version = "0.22.0" +description = "Simple, modern and high performance file watching and code reload in python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, + {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, + {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, + {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, + {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, + {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, + {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, + {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, + {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, + {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, + {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, + {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, + {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, + {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, + {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, + {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, + {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, + {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, + {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, + {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, + {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, + {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, + {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, + {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, + {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, + {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, + {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, + {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, + {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, + {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, + {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, + {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[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 = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +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.11" +content-hash = "c171c0e6df0154a167d177a217e9850f7ed13c8ffb36877702fb702aa700b7d4" diff --git a/apps/livekit/pyproject.toml b/apps/livekit/pyproject.toml new file mode 100644 index 0000000000..ab8f3bac46 --- /dev/null +++ b/apps/livekit/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "livekit_app" +version = "0.1.0" +description = "" +authors = ["Your Name "] +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.11" +livekit = "^0.11.1" +livekit-api = "^0.5.0" +vocode = { path = "../..", develop = true } +livekit-agents = "^0.7.2" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/poetry.lock b/poetry.lock index 28a3e98faa..b6eca1ea97 100644 --- a/poetry.lock +++ b/poetry.lock @@ -521,63 +521,63 @@ files = [ [[package]] name = "coverage" -version = "7.5.3" +version = "7.5.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"}, - {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"}, - {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"}, - {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"}, - {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"}, - {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"}, - {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"}, - {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"}, - {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"}, - {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"}, - {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"}, - {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"}, - {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"}, - {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"}, - {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"}, - {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"}, - {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"}, - {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"}, - {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"}, - {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"}, - {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"}, - {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"}, - {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"}, - {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"}, - {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"}, - {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"}, - {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"}, - {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.dependencies] @@ -745,13 +745,13 @@ websockets = ">=11.0" [[package]] name = "email-validator" -version = "2.1.2" +version = "2.2.0" description = "A robust email address syntax and deliverability validation library." optional = false python-versions = ">=3.8" files = [ - {file = "email_validator-2.1.2-py3-none-any.whl", hash = "sha256:d89f6324e13b1e39889eab7f9ca2f91dc9aebb6fa50a6d8bd4329ab50f251115"}, - {file = "email_validator-2.1.2.tar.gz", hash = "sha256:14c0f3d343c4beda37400421b39fa411bbe33a75df20825df73ad53e06a9f04c"}, + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, ] [package.dependencies] @@ -841,18 +841,18 @@ standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" -version = "3.15.1" +version = "3.15.4" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, - {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, + {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)"] +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]] @@ -982,13 +982,13 @@ tqdm = ["tqdm"] [[package]] name = "google-api-core" -version = "2.19.0" +version = "2.19.1" description = "Google API client core library" optional = true python-versions = ">=3.7" files = [ - {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, - {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, ] [package.dependencies] @@ -1003,7 +1003,7 @@ grpcio-status = [ {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "python_version < \"3.11\" and extra == \"grpc\""}, ] proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0.dev0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] @@ -1036,13 +1036,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.55.0" +version = "1.56.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.55.0.tar.gz", hash = "sha256:aa87cb6c49ae5fde87fb831ce8ad4a853c4656fe04babe505e9144c7a9e09c1a"}, - {file = "google_cloud_aiplatform-1.55.0-py2.py3-none-any.whl", hash = "sha256:c6cc76ca5537f4636a0c3f8c0288d2e0d2d86ef708e562d2654313e11d6ee46a"}, + {file = "google-cloud-aiplatform-1.56.0.tar.gz", hash = "sha256:d4cfb085427dac01142915f523949ac2955d6c7f148d95017d3286a77caf5d5e"}, + {file = "google_cloud_aiplatform-1.56.0-py2.py3-none-any.whl", hash = "sha256:ee1ab3bd115c3caebf8ddfd3e47eeb8396a3ec2fc5f5baf1a5c295c8d64333ab"}, ] [package.dependencies] @@ -1064,8 +1064,8 @@ cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)"] endpoint = ["requests (>=2.28.1)"] full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] -langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)"] -langchain-testing = ["absl-py", "cloudpickle (>=2.2.1,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist"] +langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "tenacity (<=8.3)"] +langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "tenacity (<=8.3)"] lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] pipelines = ["pyyaml (>=5.3.1,<7)"] @@ -1075,7 +1075,7 @@ private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] rapid-evaluation = ["nest-asyncio (>=1.0.0,<1.6.0)", "pandas (>=1.0.0,<2.2.0)"] ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "setuptools (<70.0.0)"] ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] -reasoningengine = ["cloudpickle (>=2.2.1,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] +reasoningengine = ["cloudpickle (>=3.0,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] vizier = ["google-vizier (>=0.1.6)"] @@ -1083,13 +1083,13 @@ xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] [[package]] name = "google-cloud-bigquery" -version = "3.24.0" +version = "3.25.0" description = "Google BigQuery API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-bigquery-3.24.0.tar.gz", hash = "sha256:e95e6f6e0aa32e6c453d44e2b3298931fdd7947c309ea329a31b6ff1f939e17e"}, - {file = "google_cloud_bigquery-3.24.0-py2.py3-none-any.whl", hash = "sha256:bc08323ce99dee4e811b7c3d0cde8929f5bf0b1aeaed6bcd75fc89796dd87652"}, + {file = "google-cloud-bigquery-3.25.0.tar.gz", hash = "sha256:5b2aff3205a854481117436836ae1403f11f2594e6810a98886afd57eda28509"}, + {file = "google_cloud_bigquery-3.25.0-py2.py3-none-any.whl", hash = "sha256:7f0c371bc74d2a7fb74dacbc00ac0f90c8c2bec2289b51dd6685a275873b1ce9"}, ] [package.dependencies] @@ -1304,18 +1304,18 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.63.1" +version = "1.63.2" description = "Common protobufs used in Google APIs" optional = true python-versions = ">=3.7" files = [ - {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"}, - {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"}, + {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] grpcio = {version = ">=1.44.0,<2.0.0.dev0", optional = true, markers = "extra == \"grpc\""} -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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" +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)"] @@ -1412,19 +1412,19 @@ typing-extensions = ">=4.7,<5" [[package]] name = "grpc-google-iam-v1" -version = "0.13.0" +version = "0.13.1" description = "IAM API client library" optional = true python-versions = ">=3.7" files = [ - {file = "grpc-google-iam-v1-0.13.0.tar.gz", hash = "sha256:fad318608b9e093258fbf12529180f400d1c44453698a33509cc6ecf005b294e"}, - {file = "grpc_google_iam_v1-0.13.0-py2.py3-none-any.whl", hash = "sha256:53902e2af7de8df8c1bd91373d9be55b0743ec267a7428ea638db3775becae89"}, + {file = "grpc-google-iam-v1-0.13.1.tar.gz", hash = "sha256:3ff4b2fd9d990965e410965253c0da6f66205d5a8291c4c31c6ebecca18a9001"}, + {file = "grpc_google_iam_v1-0.13.1-py2.py3-none-any.whl", hash = "sha256:c3e86151a981811f30d5e7330f271cee53e73bb87755e88cc3b6f0c7b5fe374e"}, ] [package.dependencies] googleapis-common-protos = {version = ">=1.56.0,<2.0.0dev", extras = ["grpc"]} grpcio = ">=1.44.0,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<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,<5.0.0dev" +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.0dev" [[package]] name = "grpcio" @@ -1726,72 +1726,72 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.4.2" +version = "0.5.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.4.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2b003ff58d14f5e182b875acd5177b2367245c19a03be9a2230535d296f7550"}, - {file = "jiter-0.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b48c77c25f094707731cd5bad6b776046846b60a27ee20efc8fadfb10a89415f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f50ad6b172bde4d45f4d4ea10c49282a337b8bb735afc99763dfa55ea84a743"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f6001e86f525fbbc9706db2078dc22be078b0950de55b92d37041930f5f940"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16646ef23b62b007de80460d303ebb2d81e355dac9389c787cec87cdd7ffef2f"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b4e847c13b0bf1255c711a92330e7a8cb8b5cdd1e37d7db309627bcdd3367ff"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c536589be60e4c5f2b20fadc4db7e9f55d4c9df3551f29ddf1c4a18dcc9dd54"}, - {file = "jiter-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3b2763996167830889a854b4ded30bb90897f9b76be78069c50c3ec4540950e"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:675e8ab98c99495091af6b6e9bf2b6353bcf81f25ab6ce27d36127e315b4505d"}, - {file = "jiter-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e48e43d9d999aaf55f53406b8846ff8cbe3e47ee4b9dc37e5a10a65ce760809f"}, - {file = "jiter-0.4.2-cp310-none-win32.whl", hash = "sha256:881b6e67c50bc36acb3570eda693763c8cd77d590940e06fa6d325d0da52ec1b"}, - {file = "jiter-0.4.2-cp310-none-win_amd64.whl", hash = "sha256:bb8f7b43259efc6add0d721ade2953e064b24e2026d26d979bc09ec080844cef"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:24ad336ac47f274fa83f6fbedcabff9d3387c80f67c66b992688e6a8ba2c47e9"}, - {file = "jiter-0.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fc392a220095730afe365ce1516f2f88bb085a2fd29ea191be9c6e3c71713d9a"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1fdc408de36c81460896de0176f2f7b9f3574dcd35693a0b2c00f4ca34c98e4"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10ad76722ee6a8c820b0db06a793c08b7d679e5201b9563015bd1e06c959a09"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb46d1e9c82bba87f0cbda38413e49448a7df35b1e55917124bff9f38974a23"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:194e28ef4b5f3b61408cb2ee6b6dcbcdb0c9063d01b92b01345b7605692849f5"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0a447533eccd62748a727e058efa10a8d7cf1de8ffe1a4d705ecb41dad9090"}, - {file = "jiter-0.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5f7704d7260bbb88cca3453951af739589132b26e896a3144fa2dae2263716d7"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01427458bc9550f2eda09d425755330e7d0eb09adce099577433bebf05d28d59"}, - {file = "jiter-0.4.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159b8416879c0053b17c352f70b67b749ef5b2924c6154318ecf71918aab0905"}, - {file = "jiter-0.4.2-cp311-none-win32.whl", hash = "sha256:f2445234acfb79048ce1a0d5d0e181abb9afd9e4a29d8d9988fe26cc5773a81a"}, - {file = "jiter-0.4.2-cp311-none-win_amd64.whl", hash = "sha256:e15a65f233b6b0e5ac10ddf3b97ceb18aa9ffba096259961641d78b4ee321bd5"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d61d59521aea9745447ce50f74d39a16ef74ec9d6477d9350d77e75a3d774ad2"}, - {file = "jiter-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eef607dc0acc251923427808dbd017f1998ae3c1a0430a261527aa5cbb3a942"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af6bf39954646e374fc47429c656372ac731a6a26b644158a5a84bcdbed33a47"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f509d23606e476852ee46a2b65b5c4ad3905f17424d9cc19c1dffa1c94ba3c6"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59672774daa44ee140aada0c781c82bee4d9ac5e522966186cfb6b3c217d8a51"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a0458efac5afeca254cf557b8a654e17013075a69905c78f88d557f129d871"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8860766d1c293e75c1bb4e25b74fa987e3adf199cac3f5f9e6e49c2bebf092f"}, - {file = "jiter-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a109f3281b72bbf4921fe43db1005c004a38559ca0b6c4985add81777dfe0a44"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:faa7e667454b77ad2f0ef87db39f4944de759617aadf210ea2b73f26bb24755f"}, - {file = "jiter-0.4.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3512f8b00cafb6780b427cb6282800d2bf8277161d9c917830661bd4ed1d3528"}, - {file = "jiter-0.4.2-cp312-none-win32.whl", hash = "sha256:853b35d508ee5b66d06630473c1c0b7bb5e29bf4785c9d2202437116c94f7e21"}, - {file = "jiter-0.4.2-cp312-none-win_amd64.whl", hash = "sha256:4a3a8197784278eb8b24cb02c45e1cad67c2ce5b5b758adfb19b87f74bbdff9c"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:ca2a4d750aed3154b89f2efb148609fc985fad8db739460797aaf9b478acedda"}, - {file = "jiter-0.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0e6c304b3cc6896256727e1fb8991c7179a345eca8224e201795e9cacf4683b0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cc34ac708ae1750d077e490321761ec4b9a055b994cbdd1d6fbd37099e4aa7b"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c93383875ab8d2e4f760aaff335b4a12ff32d4f9cf49c4498d657734f611466"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce197ee044add576afca0955b42142dd0312639adb6ebadbdbe4277f2855614f"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a427716813ff65480ca5b5117cfa099f49b49cd38051f8609bd0d5493013ca0"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479990218353356234669e70fac53e5eb6f739a10db25316171aede2c97d9364"}, - {file = "jiter-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d35a91ec5ac74cf33234c431505299fa91c0a197c2dbafd47400aca7c69489d4"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b27189847193708c94ad10ca0d891309342ae882725d2187cf5d2db02bde8d1b"}, - {file = "jiter-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76c255308cd1093fb411a03756b7bb220e48d4a98c30cbc79ed448bf3978e27d"}, - {file = "jiter-0.4.2-cp38-none-win32.whl", hash = "sha256:bb77438060bad49cc251941e6701b31138365c8a0ddaf10cdded2fcc6dd30701"}, - {file = "jiter-0.4.2-cp38-none-win_amd64.whl", hash = "sha256:ce858af19f7ce0d4b51c9f6c0c9d08f1e9dcef1986c5875efd0674a7054292ca"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:6128838a2f357b3921b2a3242d5dc002ae4255ecc8f9f05c20d56d7d2d79c5ad"}, - {file = "jiter-0.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f2420cebb9ba856cb57dcab1d2d8def949b464b0db09c22a4e4dbd52fff7b200"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d13d8128e853b320e00bb18bd4bb8b136cc0936091dc87633648fc688eb705"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eba5d6e54f149c508ba88677f97d3dc7dd75e9980d234bbac8027ac6db0763a3"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fad5d64af0bc0545237419bf4150d8de56f0bd217434bdd1a59730327252bef"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d179e7bca89cf5719bd761dd37a341ff0f98199ecaa9c14af09792e47e977cc"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36353caee9f103d8ee7bda077f6400505b0f370e27eabcab33a33d21de12a2a6"}, - {file = "jiter-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd146c25bce576ca5db64fc7eccb8862af00f1f0e30108796953f12a53660e4c"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:14b7c08cadbcd703041c66dc30e24e17de2f340281cac0e69374223ecf153aa4"}, - {file = "jiter-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a90f1a8b3d29aea198f8ea2b01148276ced8056e5103f32525266b3d880e65c9"}, - {file = "jiter-0.4.2-cp39-none-win32.whl", hash = "sha256:25b174997c780337b61ae57b1723455eecae9a17a9659044fd3c3b369190063f"}, - {file = "jiter-0.4.2-cp39-none-win_amd64.whl", hash = "sha256:bef62cea18521c5b99368147040c7e560c55098a35c93456f110678a2d34189a"}, - {file = "jiter-0.4.2.tar.gz", hash = "sha256:29b9d44f23f0c05f46d482f4ebf03213ee290d77999525d0975a17f875bf1eea"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, ] [[package]] @@ -1867,19 +1867,19 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.5" +version = "0.2.6" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.5-py3-none-any.whl", hash = "sha256:9aded9a65348254e1c93dcdaacffe4d1b6a5e7f74ef80c160c88ff78ad299228"}, - {file = "langchain-0.2.5.tar.gz", hash = "sha256:ffdbf4fcea46a10d461bcbda2402220fcfd72a0c70e9f4161ae0510067b9b3bd"}, + {file = "langchain-0.2.6-py3-none-any.whl", hash = "sha256:f86e8a7afd3e56f8eb5ba47f01dd00144fb9fc2f1db9873bd197347be2857aa4"}, + {file = "langchain-0.2.6.tar.gz", hash = "sha256:867f6add370c1e3911b0e87d3dd0e36aec1e8f513bf06131340fe8f151d89dc5"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.7,<0.3.0" +langchain-core = ">=0.2.10,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ @@ -1890,40 +1890,40 @@ pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-anthropic" -version = "0.1.15" +version = "0.1.16" description = "An integration package connecting AnthropicMessages and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_anthropic-0.1.15-py3-none-any.whl", hash = "sha256:7cceea526f473e4d514f39295dc128eec57da628a4bbb54850d11dda7aa959fc"}, - {file = "langchain_anthropic-0.1.15.tar.gz", hash = "sha256:c5c3c6eaccb11ed99a63886e50873ac21eaf8e9441e0f75c7ae7cd8cdef65155"}, + {file = "langchain_anthropic-0.1.16-py3-none-any.whl", hash = "sha256:0d3f66b7ffb2d4ef739ef87c4b096f0dbbf0ce12f988205d1fcaa1da2c9d09fa"}, + {file = "langchain_anthropic-0.1.16.tar.gz", hash = "sha256:28187dfb19389772e0abba98eeb0210ed3d99ab0a73f2e6707aa46c9bbbbe407"}, ] [package.dependencies] anthropic = ">=0.28.0,<1" defusedxml = ">=0.7.1,<0.8.0" -langchain-core = ">=0.2.2rc1,<0.3" +langchain-core = ">=0.2.10,<0.3" [[package]] name = "langchain-community" -version = "0.2.5" +version = "0.2.6" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.5-py3-none-any.whl", hash = "sha256:bf37a334952e42c7676d083cf2d2c4cbfbb7de1949c4149fe19913e2b06c485f"}, - {file = "langchain_community-0.2.5.tar.gz", hash = "sha256:476787b8c8c213b67e7b0eceb53346e787f00fbae12d8e680985bd4f93b0bf64"}, + {file = "langchain_community-0.2.6-py3-none-any.whl", hash = "sha256:758cc800acfe5dd396bf8ba1b57c4792639ead0eab48ed0367f0732ec6ee1f68"}, + {file = "langchain_community-0.2.6.tar.gz", hash = "sha256:40ce09a50ed798aa651ddb34c8978200fa8589b9813c7a28ce8af027bbf249f0"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.5,<0.3.0" -langchain-core = ">=0.2.7,<0.3.0" +langchain = ">=0.2.6,<0.3.0" +langchain-core = ">=0.2.10,<0.3.0" langsmith = ">=0.1.0,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1932,55 +1932,58 @@ numpy = [ PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.8" +version = "0.2.10" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.8-py3-none-any.whl", hash = "sha256:172c81c858dc1f3123cc72b7e44e10f44c92f8a761cae18c364081f6c208e9f6"}, - {file = "langchain_core-0.2.8.tar.gz", hash = "sha256:2db866a4514672c4875b69d5590aa2ed50aa0d144874268bef68d74b5e7f33f9"}, + {file = "langchain_core-0.2.10-py3-none-any.whl", hash = "sha256:6eb72086b6bc86db9812da98f79e507c2209a15c0112aefd214a04182ada8586"}, + {file = "langchain_core-0.2.10.tar.gz", hash = "sha256:33d1fc234ab58c80476eb5bbde2107ef522a2ce8f46bdf47d9e1bd21e054208f"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.75,<0.2.0" packaging = ">=23.2,<25" -pydantic = ">=1,<3" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] PyYAML = ">=5.3" -tenacity = ">=8.1.0,<9.0.0" +tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-google-vertexai" -version = "1.0.5" +version = "1.0.6" description = "An integration package connecting Google VertexAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_google_vertexai-1.0.5-py3-none-any.whl", hash = "sha256:38f4a39bf35927d744d0883907c4d4a59eef059e9b36f28bb5c737c2aae6963b"}, - {file = "langchain_google_vertexai-1.0.5.tar.gz", hash = "sha256:50005dc12ff9d66bbbab9e1ab660574b1584eee3e7b5a647dc8a009a94f0c500"}, + {file = "langchain_google_vertexai-1.0.6-py3-none-any.whl", hash = "sha256:240a9be3ae749335ec9a495502ca8f2bff60a432b8400a21cbd93b415e4d166d"}, + {file = "langchain_google_vertexai-1.0.6.tar.gz", hash = "sha256:000c4cfd0dee73317e1752dfeec76a08c5bf24f7a134d79b9905a720ac886b11"}, ] [package.dependencies] -google-cloud-aiplatform = ">=1.47.0,<2.0.0" -google-cloud-storage = ">=2.14.0,<3.0.0" -langchain-core = ">=0.2.2,<0.3" +google-cloud-aiplatform = ">=1.56.0,<2.0.0" +google-cloud-storage = ">=2.17.0,<3.0.0" +langchain-core = ">=0.2.9,<0.3" [package.extras] -anthropic = ["anthropic[vertexai] (>=0.23.0,<1)"] +anthropic = ["anthropic[vertexai] (>=0.29.0,<1)"] [[package]] name = "langchain-openai" -version = "0.1.8" +version = "0.1.10" description = "An integration package connecting OpenAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.8-py3-none-any.whl", hash = "sha256:8125c84223e9f43b05defbca64eedbcf362fd78a680de6c25e64f973b34a8063"}, - {file = "langchain_openai-0.1.8.tar.gz", hash = "sha256:a11fcce15def7917c44232abda6baaa63dfc79fe44be1531eea650d39a44cd95"}, + {file = "langchain_openai-0.1.10-py3-none-any.whl", hash = "sha256:62eb000980eb45e4f16c88acdbaeccf3d59266554b0dd3ce6bebea1bbe8143dd"}, + {file = "langchain_openai-0.1.10.tar.gz", hash = "sha256:30f881f8ccaec28c054759837c41fd2a2264fcc5564728ce12e1715891a9ce3c"}, ] [package.dependencies] @@ -1990,37 +1993,56 @@ tiktoken = ">=0.7,<1" [[package]] name = "langchain-text-splitters" -version = "0.2.1" +version = "0.2.2" description = "LangChain text splitting utilities" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_text_splitters-0.2.1-py3-none-any.whl", hash = "sha256:c2774a85f17189eaca50339629d2316d13130d4a8d9f1a1a96f3a03670c4a138"}, - {file = "langchain_text_splitters-0.2.1.tar.gz", hash = "sha256:06853d17d7241ecf5c97c7b6ef01f600f9b0fb953dd997838142a527a4f32ea4"}, + {file = "langchain_text_splitters-0.2.2-py3-none-any.whl", hash = "sha256:1c80d4b11b55e2995f02d2a326c0323ee1eeff24507329bb22924e420c782dff"}, + {file = "langchain_text_splitters-0.2.2.tar.gz", hash = "sha256:a1e45de10919fa6fb080ef0525deab56557e9552083600455cb9fa4238076140"}, ] [package.dependencies] -langchain-core = ">=0.2.0,<0.3.0" - -[package.extras] -extended-testing = ["beautifulsoup4 (>=4.12.3,<5.0.0)", "lxml (>=4.9.3,<6.0)"] +langchain-core = ">=0.2.10,<0.3.0" [[package]] name = "langsmith" -version = "0.1.78" +version = "0.1.82" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.78-py3-none-any.whl", hash = "sha256:87bc5d9072bfcb6392d7552cbcd6089dcc1faed36d688b1587d80bd48a1acba2"}, - {file = "langsmith-0.1.78.tar.gz", hash = "sha256:d9112d2e9298ec6b02d3b1afec6ed557df9db3746c79d34ef3b448fc18e116cd"}, + {file = "langsmith-0.1.82-py3-none-any.whl", hash = "sha256:9b3653e7d316036b0c60bf0bc3e280662d660f485a4ebd8e5c9d84f9831ae79c"}, + {file = "langsmith-0.1.82.tar.gz", hash = "sha256:c02e2bbc488c10c13b52c69d271eb40bd38da078d37b6ae7ae04a18bd48140be"}, ] [package.dependencies] orjson = ">=3.9.14,<4.0.0" -pydantic = ">=1,<3" +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] requests = ">=2,<3" +[[package]] +name = "livekit" +version = "0.11.1" +description = "Python Real-time SDK for LiveKit" +optional = true +python-versions = ">=3.9.0" +files = [ + {file = "livekit-0.11.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:262ec6aa47a3bcd43cfebc6a288be476ce05a68a40bb034db70be40c084e07a6"}, + {file = "livekit-0.11.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a00d56152cf4151580c3f869b4854aeca4116be68d42857651ecb9cfd24f6ac3"}, + {file = "livekit-0.11.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:768b976087cbaae625a35c0bb9e1a3a8345a6d00b7407bda2c95a6acf2d31eb4"}, + {file = "livekit-0.11.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:8645382faa3acbd4cedb905e2708f88ff9b48b6a6b88d4d4baff9ead96526fd9"}, + {file = "livekit-0.11.1-py3-none-win_amd64.whl", hash = "sha256:4177dc0903fc2fa6ead987d2abd9d1adb65ea0297eaa8a818db9a55837f61206"}, + {file = "livekit-0.11.1.tar.gz", hash = "sha256:1e5a79262f90e8ffee180fc0600c2f6eb95eccc6d31f1e5e4a425fa429050b0b"}, +] + +[package.dependencies] +protobuf = ">=3" +types-protobuf = ">=3" + [[package]] name = "loguru" version = "0.7.2" @@ -2327,38 +2349,38 @@ files = [ [[package]] name = "mypy" -version = "1.10.0" +version = "1.10.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da1cbf08fb3b851ab3b9523a884c232774008267b1f83371ace57f412fe308c2"}, - {file = "mypy-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12b6bfc1b1a66095ab413160a6e520e1dc076a28f3e22f7fb25ba3b000b4ef99"}, - {file = "mypy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e36fb078cce9904c7989b9693e41cb9711e0600139ce3970c6ef814b6ebc2b2"}, - {file = "mypy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b0695d605ddcd3eb2f736cd8b4e388288c21e7de85001e9f85df9187f2b50f9"}, - {file = "mypy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:cd777b780312ddb135bceb9bc8722a73ec95e042f911cc279e2ec3c667076051"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3be66771aa5c97602f382230165b856c231d1277c511c9a8dd058be4784472e1"}, - {file = "mypy-1.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b2cbaca148d0754a54d44121b5825ae71868c7592a53b7292eeb0f3fdae95ee"}, - {file = "mypy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ec404a7cbe9fc0e92cb0e67f55ce0c025014e26d33e54d9e506a0f2d07fe5de"}, - {file = "mypy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e22e1527dc3d4aa94311d246b59e47f6455b8729f4968765ac1eacf9a4760bc7"}, - {file = "mypy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:a87dbfa85971e8d59c9cc1fcf534efe664d8949e4c0b6b44e8ca548e746a8d53"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a781f6ad4bab20eef8b65174a57e5203f4be627b46291f4589879bf4e257b97b"}, - {file = "mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b808e12113505b97d9023b0b5e0c0705a90571c6feefc6f215c1df9381256e30"}, - {file = "mypy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f55583b12156c399dce2df7d16f8a5095291354f1e839c252ec6c0611e86e2e"}, - {file = "mypy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cf18f9d0efa1b16478c4c129eabec36148032575391095f73cae2e722fcf9d5"}, - {file = "mypy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc6ac273b23c6b82da3bb25f4136c4fd42665f17f2cd850771cb600bdd2ebeda"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fd50226364cd2737351c79807775136b0abe084433b55b2e29181a4c3c878c0"}, - {file = "mypy-1.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f90cff89eea89273727d8783fef5d4a934be2fdca11b47def50cf5d311aff727"}, - {file = "mypy-1.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcfc70599efde5c67862a07a1aaf50e55bce629ace26bb19dc17cece5dd31ca4"}, - {file = "mypy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:075cbf81f3e134eadaf247de187bd604748171d6b79736fa9b6c9685b4083061"}, - {file = "mypy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:3f298531bca95ff615b6e9f2fc0333aae27fa48052903a0ac90215021cdcfa4f"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa7ef5244615a2523b56c034becde4e9e3f9b034854c93639adb667ec9ec2976"}, - {file = "mypy-1.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3236a4c8f535a0631f85f5fcdffba71c7feeef76a6002fcba7c1a8e57c8be1ec"}, - {file = "mypy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a2b5cdbb5dd35aa08ea9114436e0d79aceb2f38e32c21684dcf8e24e1e92821"}, - {file = "mypy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92f93b21c0fe73dc00abf91022234c79d793318b8a96faac147cd579c1671746"}, - {file = "mypy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:28d0e038361b45f099cc086d9dd99c15ff14d0188f44ac883010e172ce86c38a"}, - {file = "mypy-1.10.0-py3-none-any.whl", hash = "sha256:f8c083976eb530019175aabadb60921e73b4f45736760826aa1689dda8208aee"}, - {file = "mypy-1.10.0.tar.gz", hash = "sha256:3d087fcbec056c4ee34974da493a826ce316947485cef3901f511848e687c131"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, + {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, + {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, + {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, + {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, + {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, + {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, + {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, + {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, + {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, + {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, + {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, + {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, + {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, + {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, + {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, + {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, + {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, + {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, + {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, + {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, + {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, + {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, ] [package.dependencies] @@ -2455,13 +2477,13 @@ files = [ [[package]] name = "openai" -version = "1.34.0" +version = "1.35.5" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.34.0-py3-none-any.whl", hash = "sha256:018623c2f795424044675c6230fa3bfbf98d9e0aab45d8fd116f2efb2cfb6b7e"}, - {file = "openai-1.34.0.tar.gz", hash = "sha256:95c8e2da4acd6958e626186957d656597613587195abd0fb2527566a93e76770"}, + {file = "openai-1.35.5-py3-none-any.whl", hash = "sha256:28d92503c6e4b6a32a89277b36693023ef41f60922a4b5c8c621e8c5697ae3a6"}, + {file = "openai-1.35.5.tar.gz", hash = "sha256:67ef289ae22d350cbf9381d83ae82c4e3596d71b7ad1cc886143554ee12fe0c9"}, ] [package.dependencies] @@ -2642,20 +2664,20 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "proto-plus" -version = "1.23.0" +version = "1.24.0" description = "Beautiful, Pythonic protocol buffers." optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, - {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, ] [package.dependencies] -protobuf = ">=3.19.0,<5.0.0dev" +protobuf = ">=3.19.0,<6.0.0dev" [package.extras] -testing = ["google-api-core[grpc] (>=1.31.5)"] +testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" @@ -2836,13 +2858,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.3.3" +version = "2.3.4" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.3.3-py3-none-any.whl", hash = "sha256:e4ed62ad851670975ec11285141db888fd24947f9440bd4380d7d8788d4965de"}, - {file = "pydantic_settings-2.3.3.tar.gz", hash = "sha256:87fda838b64b5039b970cd47c3e8a1ee460ce136278ff672980af21516f6e6ce"}, + {file = "pydantic_settings-2.3.4-py3-none-any.whl", hash = "sha256:11ad8bacb68a045f00e4f862c7a718c8a9ec766aa8fd4c32e39a0594b207b53a"}, + {file = "pydantic_settings-2.3.4.tar.gz", hash = "sha256:c5802e3d62b78e82522319bbc9b8f8ffb28ad1c988a99311d04f2a6051fca0a7"}, ] [package.dependencies] @@ -3155,13 +3177,13 @@ files = [ [[package]] name = "redis" -version = "5.0.6" +version = "5.0.7" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.6-py3-none-any.whl", hash = "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee"}, - {file = "redis-5.0.6.tar.gz", hash = "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197"}, + {file = "redis-5.0.7-py3-none-any.whl", hash = "sha256:0e479e24da960c690be5d9b96d21f7b918a98c0cf49af3b6fafaa0753f93a0db"}, + {file = "redis-5.0.7.tar.gz", hash = "sha256:8f611490b93c8109b50adc317b31bfd84fff31def3475b92e7e80bf39f48175b"}, ] [package.dependencies] @@ -3437,13 +3459,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.5.1" +version = "2.7.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.5.1-py2.py3-none-any.whl", hash = "sha256:1f87acdce4a43a523ae5aa21a3fc37522d73ebd9ec04b1dbf01aa3d173852def"}, - {file = "sentry_sdk-2.5.1.tar.gz", hash = "sha256:fbc40a78a8a9c6675133031116144f0d0940376fa6e4e1acd5624c90b0aaf58b"}, + {file = "sentry_sdk-2.7.0-py2.py3-none-any.whl", hash = "sha256:db9594c27a4d21c1ebad09908b1f0dc808ef65c2b89c1c8e7e455143262e37c1"}, + {file = "sentry_sdk-2.7.0.tar.gz", hash = "sha256:d846a211d4a0378b289ced3c434480945f110d0ede00450ba631fc2852e7a0d4"}, ] [package.dependencies] @@ -3474,7 +3496,7 @@ 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-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +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)"] @@ -3609,64 +3631,64 @@ numpy = ["NumPy"] [[package]] name = "sqlalchemy" -version = "2.0.30" +version = "2.0.31" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"}, - {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"}, - {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"}, - {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"}, - {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"}, - {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"}, - {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"}, - {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"}, - {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, + {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, + {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, + {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, + {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, + {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, + {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, + {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, + {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} typing-extensions = ">=4.6.0" [package.extras] @@ -3713,13 +3735,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 [[package]] name = "tenacity" -version = "8.4.1" +version = "8.4.2" description = "Retry code until it succeeds" optional = true python-versions = ">=3.8" files = [ - {file = "tenacity-8.4.1-py3-none-any.whl", hash = "sha256:28522e692eda3e1b8f5e99c51464efcc0b9fc86933da92415168bc1c4e2308fa"}, - {file = "tenacity-8.4.1.tar.gz", hash = "sha256:54b1412b878ddf7e1f1577cd49527bad8cdef32421bd599beac0c6c3f10582fd"}, + {file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"}, + {file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"}, ] [package.extras] @@ -3928,13 +3950,13 @@ telegram = ["requests"] [[package]] name = "twilio" -version = "9.1.1" +version = "9.2.1" description = "Twilio API client and TwiML generator" optional = true python-versions = ">=3.7.0" files = [ - {file = "twilio-9.1.1-py2.py3-none-any.whl", hash = "sha256:cc3e090c3884db7d70e7c647358b9cf1f4d30fd3fbe0412adcae0df8459d29b0"}, - {file = "twilio-9.1.1.tar.gz", hash = "sha256:cfe72b12cabac2f0997f1060d53cea14bd1196e2cbda14789e53c7dd762c4349"}, + {file = "twilio-9.2.1-py2.py3-none-any.whl", hash = "sha256:fd18f5e72429dedd2f83df821308d74b961b2a049ddb5c3cf7dd1eff8794fe1b"}, + {file = "twilio-9.2.1.tar.gz", hash = "sha256:dc1eb456182232e44f1a0e129a8956e7b7b45e4c0fb7f5b25b3ab6fa76e0efad"}, ] [package.dependencies] @@ -3974,6 +3996,17 @@ files = [ [package.dependencies] types-setuptools = "*" +[[package]] +name = "types-protobuf" +version = "5.27.0.20240626" +description = "Typing stubs for protobuf" +optional = true +python-versions = ">=3.8" +files = [ + {file = "types-protobuf-5.27.0.20240626.tar.gz", hash = "sha256:683ba14043bade6785e3f937a7498f243b37881a91ac8d81b9202ecf8b191e9c"}, + {file = "types_protobuf-5.27.0.20240626-py3-none-any.whl", hash = "sha256:688e8f7e8d9295db26bc560df01fb731b27a25b77cbe4c1ce945647f7024f5c1"}, +] + [[package]] name = "types-pyopenssl" version = "24.1.0.20240425" @@ -4017,13 +4050,13 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20240602" +version = "2.32.0.20240622" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240602.tar.gz", hash = "sha256:3f98d7bbd0dd94ebd10ff43a7fbe20c3b8528acace6d8efafef0b6a184793f06"}, - {file = "types_requests-2.32.0.20240602-py3-none-any.whl", hash = "sha256:ed3946063ea9fbc6b5fc0c44fa279188bae42d582cb63760be6cb4b9d06c3de8"}, + {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, + {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, ] [package.dependencies] @@ -4031,13 +4064,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "70.0.0.20240524" +version = "70.1.0.20240625" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-70.0.0.20240524.tar.gz", hash = "sha256:e31fee7b9d15ef53980526579ac6089b3ae51a005a281acf97178e90ac71aff6"}, - {file = "types_setuptools-70.0.0.20240524-py3-none-any.whl", hash = "sha256:8f5379b9948682d72a9ab531fbe52932e84c4f38deda570255f9bae3edd766bc"}, + {file = "types-setuptools-70.1.0.20240625.tar.gz", hash = "sha256:eb7175c9a304de4de9f4dfd0f299c754ac94cd9e30a262fbb5ff3047a0a6c517"}, + {file = "types_setuptools-70.1.0.20240625-py3-none-any.whl", hash = "sha256:181986729bdae9fa7efc7d37f1578361739e35dd6ec456d37de8e8f3bd2be1ef"}, ] [[package]] @@ -4668,7 +4701,7 @@ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linke 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)"] [extras] -all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "groq", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "pvkoala", "twilio", "vonage"] +all = ["cartesia", "google-cloud-speech", "google-cloud-texttospeech", "groq", "langchain", "langchain-anthropic", "langchain-community", "langchain-google-vertexai", "langchain-openai", "livekit", "pvkoala", "twilio", "vonage"] langchain = ["langchain", "langchain-community"] langchain-extras = ["langchain-anthropic", "langchain-google-vertexai", "langchain-openai"] synthesizers = ["cartesia", "google-cloud-texttospeech", "pvkoala"] @@ -4678,4 +4711,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "e56040c6bd76616232f8ef2b371771ee098c6a12fd57228c0b0ab2a0d24e3e58" +content-hash = "6db0fe735d65f6e7ef508241d63a4b069d7b01d67b2d4bca5571aae70641d4c3" diff --git a/pyproject.toml b/pyproject.toml index 2110da3b70..61332efecf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,6 +59,8 @@ langchain-openai = { version = "^0.1.8", optional = true } langchain-anthropic = { version = "^0.1.15", optional = true } langchain-google-vertexai = { version = "^1.0.5", optional = true } +# LiveKit +livekit = { version = "^0.11.1", optional = true } [tool.poetry.group.lint.dependencies] black = "^24.4.2" @@ -104,7 +106,8 @@ all = [ "langchain-anthropic", "langchain-google-vertexai", "cartesia", - "groq" + "groq", + "livekit" ] [tool.mypy] diff --git a/vocode/streaming/livekit/constants.py b/vocode/streaming/livekit/constants.py new file mode 100644 index 0000000000..829ee473ad --- /dev/null +++ b/vocode/streaming/livekit/constants.py @@ -0,0 +1,5 @@ +from vocode.streaming.models.audio import AudioEncoding + +DEFAULT_SAMPLING_RATE = 48000 +DEFAULT_CHUNK_SIZE = 480 +AUDIO_ENCODING = AudioEncoding.LINEAR16 diff --git a/vocode/streaming/livekit/livekit_conversation.py b/vocode/streaming/livekit/livekit_conversation.py new file mode 100644 index 0000000000..9818b70561 --- /dev/null +++ b/vocode/streaming/livekit/livekit_conversation.py @@ -0,0 +1,68 @@ +import asyncio + +from livekit import rtc +from loguru import logger + +from vocode.streaming.livekit.livekit_events_manager import LiveKitEventsManager +from vocode.streaming.output_device.livekit_output_device import LiveKitOutputDevice +from vocode.streaming.streaming_conversation import StreamingConversation + + +class LiveKitConversation(StreamingConversation[LiveKitOutputDevice]): + room: rtc.Room + user_track: rtc.Track + user_participant: rtc.RemoteParticipant + + def __init__(self, *args, **kwargs): + if kwargs.get("events_manager") is None: + events_manager = LiveKitEventsManager() + events_manager.attach_conversation(self) + kwargs["events_manager"] = events_manager + super().__init__(*args, **kwargs) + self.receive_frames_task: asyncio.Task | None = None + + async def start_room(self, room: rtc.Room): + self.room = room + room.on("track_subscribed", self._on_track_subscribed) + room.on("track_unsubscribed", self._on_track_unsubscribed) + + await self.output_device.initialize_source(room) + + await super().start() + + def _on_track_subscribed( + self, + track: rtc.Track, + publication: rtc.RemoteTrackPublication, + participant: rtc.RemoteParticipant, + ): + logger.info("track subscribed: %s", publication.sid) + if track.kind == rtc.TrackKind.KIND_AUDIO: + self.user_participant = participant + self.user_track = track + audio_stream = rtc.AudioStream(track) + self.receive_frames_task = asyncio.create_task(self._receive_frames(audio_stream)) + + async def _receive_frames( + self, + audio_stream: rtc.AudioStream, + ): + # this is where we will send the frames to transcription + async for event in audio_stream: + if self.is_active(): + frame = event.frame + self.receive_audio(bytes(frame.data)) + + def _on_track_unsubscribed( + self, + track: rtc.RemoteTrack, + pub: rtc.RemoteTrackPublication, + participant: rtc.RemoteParticipant, + ): + self.mark_terminated() + + async def terminate(self): + if self.receive_frames_task: + self.receive_frames_task.cancel() + await self.output_device.uninitialize_source() + return await super().terminate() diff --git a/vocode/streaming/livekit/livekit_events_manager.py b/vocode/streaming/livekit/livekit_events_manager.py new file mode 100644 index 0000000000..5daaefcc87 --- /dev/null +++ b/vocode/streaming/livekit/livekit_events_manager.py @@ -0,0 +1,55 @@ +import uuid +from typing import TYPE_CHECKING, List + +from livekit import rtc + +from vocode.streaming.models.events import Event, EventType, Sender +from vocode.streaming.models.transcript import TranscriptEvent +from vocode.streaming.utils.events_manager import EventsManager + +if TYPE_CHECKING: + from vocode.streaming.livekit.livekit_conversation import LiveKitConversation + + +class LiveKitEventsManager(EventsManager): + _conversation: "LiveKitConversation" + + def __init__( + self, + subscriptions: List[EventType] = [], + ): + if EventType.TRANSCRIPT not in subscriptions: + subscriptions.append(EventType.TRANSCRIPT) + super().__init__(subscriptions) + + def attach_conversation(self, conversation: "LiveKitConversation"): + self._conversation = conversation + + async def handle_event(self, event: Event): + if isinstance(event, TranscriptEvent): + participant = ( + self._conversation.room.local_participant + if event.sender == Sender.BOT + else self._conversation.user_participant + ) + track = ( + self._conversation.user_track + if event.sender == Sender.HUMAN + else self._conversation.output_device.track + ) + + transcription = rtc.Transcription( + participant_identity=participant.identity, + track_id=track.sid, + segments=[ + rtc.TranscriptionSegment( + id=str(uuid.uuid4()), + text=event.text, + start_time=int(event.timestamp), + end_time=int(event.timestamp), + final=True, + ) + ], + language="", + ) + await self._conversation.room.local_participant.publish_transcription(transcription) diff --git a/vocode/streaming/models/transcriber.py b/vocode/streaming/models/transcriber.py index b67cbd79c0..c27d865197 100644 --- a/vocode/streaming/models/transcriber.py +++ b/vocode/streaming/models/transcriber.py @@ -3,6 +3,7 @@ from pydantic.v1 import validator +import vocode.streaming.livekit.constants as LiveKitConstants from vocode.streaming.input_device.base_input_device import BaseInputDevice from vocode.streaming.models.client_backend import InputAudioConfig from vocode.streaming.models.model import BaseModel @@ -105,6 +106,15 @@ def from_input_audio_config(cls, input_audio_config: InputAudioConfig, **kwargs) **kwargs, ) + @classmethod + def from_livekit_input_device(cls, **kwargs): + return cls( + sampling_rate=LiveKitConstants.DEFAULT_SAMPLING_RATE, + audio_encoding=LiveKitConstants.AUDIO_ENCODING, + chunk_size=LiveKitConstants.DEFAULT_CHUNK_SIZE, + **kwargs, + ) + class DeepgramTranscriberConfig(TranscriberConfig, type=TranscriberType.DEEPGRAM.value): # type: ignore language: Optional[str] = None diff --git a/vocode/streaming/output_device/livekit_output_device.py b/vocode/streaming/output_device/livekit_output_device.py new file mode 100644 index 0000000000..5a2e1a040f --- /dev/null +++ b/vocode/streaming/output_device/livekit_output_device.py @@ -0,0 +1,69 @@ +import asyncio + +from livekit import rtc + +from vocode.streaming.livekit.constants import AUDIO_ENCODING, DEFAULT_SAMPLING_RATE +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.output_device.audio_chunk import ChunkState + +NUM_CHANNELS = 1 + + +class LiveKitOutputDevice(AbstractOutputDevice): + source: rtc.AudioSource + track: rtc.LocalAudioTrack + room: rtc.Room + + def __init__( + self, + sampling_rate: int = DEFAULT_SAMPLING_RATE, + audio_encoding: AudioEncoding = AUDIO_ENCODING, + ): + super().__init__(sampling_rate, audio_encoding) + + async def _run_loop(self): + while True: + try: + item = await self.input_queue.get() + except asyncio.CancelledError: + return + + self.interruptible_event = item + audio_chunk = item.payload + + if item.is_interrupted(): + audio_chunk.on_interrupt() + audio_chunk.state = ChunkState.INTERRUPTED + continue + + await self.play(audio_chunk.data) + audio_chunk.on_play() + audio_chunk.state = ChunkState.PLAYED + self.interruptible_event.is_interruptible = False + + async def initialize_source(self, room: rtc.Room): + """Creates the AudioSource that will be used to capture audio frames. + + Can only be called once the room has set up its track callbcks + """ + self.room = room + source = rtc.AudioSource(self.sampling_rate, NUM_CHANNELS) + track = rtc.LocalAudioTrack.create_audio_track("agent-synthesis", source) + options = rtc.TrackPublishOptions() + options.source = rtc.TrackSource.SOURCE_MICROPHONE + await self.room.local_participant.publish_track(track, options) + self.track = track + self.source = source + + async def uninitialize_source(self): + await self.room.local_participant.unpublish_track(self.track.sid) + + async def play(self, item: bytes): + audio_frame = rtc.AudioFrame( + item, self.sampling_rate, num_channels=1, samples_per_channel=len(item) // 2 + ) + return await self.source.capture_frame(audio_frame) + + def interrupt(self): + pass diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index bdb563230f..58ce8d167b 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -661,7 +661,7 @@ def __init__( self.transcript.attach_events_manager(self.events_manager) self.is_human_speaking = False - self.active = False + self.is_terminated = asyncio.Event() self.mark_last_action_timestamp() self.check_for_idle_task: Optional[asyncio.Task] = None @@ -718,7 +718,7 @@ async def start(self, mark_ready: Optional[Callable[[], Awaitable[None]]] = None self.agent.attach_transcript(self.transcript) if mark_ready: await mark_ready() - self.active = True + self.is_terminated.clear() self.check_for_idle_task = asyncio_create_task_with_done_error_log( self.check_for_idle(), ) @@ -989,7 +989,7 @@ def _on_interrupt(): return message_sent, cut_off def mark_terminated(self, bot_disconnect: bool = False): - self.active = False + self.is_terminated.set() async def terminate(self): self.mark_terminated() @@ -1036,4 +1036,7 @@ async def terminate(self): logger.debug("Successfully terminated") def is_active(self): - return self.active + return not self.is_terminated.is_set() + + async def wait_for_termination(self): + await self.is_terminated.wait() diff --git a/vocode/streaming/telephony/conversation/twilio_phone_conversation.py b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py index f3c833726d..267e37e927 100644 --- a/vocode/streaming/telephony/conversation/twilio_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/twilio_phone_conversation.py @@ -99,7 +99,7 @@ async def attach_ws_and_start(self, ws: WebSocket): from_phone_number=self.from_phone, ) ) - while self.active: + while self.is_active(): message = await ws.receive_text() response = await self._handle_ws_message(message) if response == TwilioPhoneConversationWebsocketAction.CLOSE_WEBSOCKET: diff --git a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py index 38629f89e9..faa259a6c8 100644 --- a/vocode/streaming/telephony/conversation/vonage_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/vonage_phone_conversation.py @@ -100,7 +100,7 @@ async def attach_ws_and_start(self, ws: WebSocket): ) ) disconnected = False - while self.active: + while self.is_active(): try: message = await ws.receive() if message["type"] == "websocket.disconnect": From 949711f7f91a235a3c14c407cf53a4c23864b4a2 Mon Sep 17 00:00:00 2001 From: rjheeta Date: Wed, 3 Jul 2024 17:36:00 -0400 Subject: [PATCH 105/148] upgrade to latest cartesia 1.0.3 (#587) * upgrade to latest cartesia 1.0.3 * fixed linting conflict * finish streaming * make cartesia optional --------- Co-authored-by: Ajay Raj --- .../streaming/synthesizer/synthesize.py | 5 +- poetry.lock | 374 +++++++++--------- pyproject.toml | 2 +- vocode/streaming/models/synthesizer.py | 2 +- .../streaming/synthesizer/base_synthesizer.py | 2 +- .../synthesizer/cartesia_synthesizer.py | 90 +++-- 6 files changed, 258 insertions(+), 217 deletions(-) diff --git a/playground/streaming/synthesizer/synthesize.py b/playground/streaming/synthesizer/synthesize.py index c9431620af..bc5827b940 100644 --- a/playground/streaming/synthesizer/synthesize.py +++ b/playground/streaming/synthesizer/synthesize.py @@ -1,5 +1,6 @@ import time +from vocode.streaming.constants import PER_CHUNK_ALLOWANCE_SECONDS from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import AzureSynthesizerConfig from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice @@ -46,7 +47,9 @@ async def speak( end_time = time.time() await asyncio.sleep( max( - speech_length_seconds - (end_time - start_time), + speech_length_seconds + - (end_time - start_time) + - PER_CHUNK_ALLOWANCE_SECONDS, 0, ) ) diff --git a/poetry.lock b/poetry.lock index b6eca1ea97..254e7f0840 100644 --- a/poetry.lock +++ b/poetry.lock @@ -300,13 +300,13 @@ files = [ [[package]] name = "cartesia" -version = "0.1.1" +version = "1.0.3" description = "The official Python library for the Cartesia API." optional = true python-versions = ">=3.8.0" files = [ - {file = "cartesia-0.1.1-py2.py3-none-any.whl", hash = "sha256:7a7365f17e220247ee2af1efdb88e69b0aa332e390c85775bf356b5e7b882498"}, - {file = "cartesia-0.1.1.tar.gz", hash = "sha256:c584770f4698e6dc826a75b7b5fd39bfce749c88ad9786dca46edd9527710002"}, + {file = "cartesia-1.0.3-py2.py3-none-any.whl", hash = "sha256:d680c197361507faf11e8ed99a30a0d6ece682298ea306f41a66a0195c08ae37"}, + {file = "cartesia-1.0.3.tar.gz", hash = "sha256:446e7bea274e71c95f790d1efdc4b04a6eec1747f3ae5cc48a4fd68985d0aafc"}, ] [package.dependencies] @@ -774,13 +774,13 @@ test = ["pytest (>=6)"] [[package]] name = "fakeredis" -version = "2.23.2" +version = "2.23.3" description = "Python implementation of redis API, can be used for testing purposes." optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "fakeredis-2.23.2-py3-none-any.whl", hash = "sha256:3721946b955930c065231befd24a9cdc68b339746e93848ef01a010d98e4eb4f"}, - {file = "fakeredis-2.23.2.tar.gz", hash = "sha256:d649c409abe46c63690b6c35d3c460e4ce64c69a52cea3f02daff2649378f878"}, + {file = "fakeredis-2.23.3-py3-none-any.whl", hash = "sha256:4779be828f4ebf53e1a286fd11e2ffe0f510d3e5507f143d644e67a07387d759"}, + {file = "fakeredis-2.23.3.tar.gz", hash = "sha256:0c67caa31530114f451f012eca920338c5eb83fa7f1f461dd41b8d2488a99cba"}, ] [package.dependencies] @@ -943,13 +943,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.6.0" +version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.extras] @@ -1013,13 +1013,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.30.0" +version = "2.31.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.30.0.tar.gz", hash = "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688"}, - {file = "google_auth-2.30.0-py2.py3-none-any.whl", hash = "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5"}, + {file = "google-auth-2.31.0.tar.gz", hash = "sha256:87805c36970047247c8afe614d4e3af8eceafc1ebba0c679fe75ddd1d575e871"}, + {file = "google_auth-2.31.0-py2.py3-none-any.whl", hash = "sha256:042c4702efa9f7d3c48d3a69341c209381b125faa6dbf3ebe56bc7e40ae05c23"}, ] [package.dependencies] @@ -1036,13 +1036,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.56.0" +version = "1.57.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.56.0.tar.gz", hash = "sha256:d4cfb085427dac01142915f523949ac2955d6c7f148d95017d3286a77caf5d5e"}, - {file = "google_cloud_aiplatform-1.56.0-py2.py3-none-any.whl", hash = "sha256:ee1ab3bd115c3caebf8ddfd3e47eeb8396a3ec2fc5f5baf1a5c295c8d64333ab"}, + {file = "google-cloud-aiplatform-1.57.0.tar.gz", hash = "sha256:113905f100cb0a9ad744a2445a7675f92f28600233ba499614aa704d11a809b7"}, + {file = "google_cloud_aiplatform-1.57.0-py2.py3-none-any.whl", hash = "sha256:ca5391a56e0cc8f4ed39a2beb7be02f51936ff04fd5304775a72a86c345d0e47"}, ] [package.dependencies] @@ -1077,7 +1077,8 @@ ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict" ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] reasoningengine = ["cloudpickle (>=3.0,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "sentencepiece (>=0.2.0)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +tokenization = ["sentencepiece (>=0.2.0)"] vizier = ["google-vizier (>=0.1.6)"] xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] @@ -1894,13 +1895,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-anthropic" -version = "0.1.16" +version = "0.1.19" description = "An integration package connecting AnthropicMessages and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_anthropic-0.1.16-py3-none-any.whl", hash = "sha256:0d3f66b7ffb2d4ef739ef87c4b096f0dbbf0ce12f988205d1fcaa1da2c9d09fa"}, - {file = "langchain_anthropic-0.1.16.tar.gz", hash = "sha256:28187dfb19389772e0abba98eeb0210ed3d99ab0a73f2e6707aa46c9bbbbe407"}, + {file = "langchain_anthropic-0.1.19-py3-none-any.whl", hash = "sha256:ed0d5823dcf65802c6367a8fada2e82610aa1c96dfaae5400b6920131483707b"}, + {file = "langchain_anthropic-0.1.19.tar.gz", hash = "sha256:7f4b3834947bbefdc43f5dc4ebbaddac4b58253c0c54684ac960af5054acc341"}, ] [package.dependencies] @@ -1936,13 +1937,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.10" +version = "0.2.11" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.10-py3-none-any.whl", hash = "sha256:6eb72086b6bc86db9812da98f79e507c2209a15c0112aefd214a04182ada8586"}, - {file = "langchain_core-0.2.10.tar.gz", hash = "sha256:33d1fc234ab58c80476eb5bbde2107ef522a2ce8f46bdf47d9e1bd21e054208f"}, + {file = "langchain_core-0.2.11-py3-none-any.whl", hash = "sha256:c7ca4dc4d88e3c69fd7916c95a7027c2b1a11c2db5a51141c3ceb8afac212208"}, + {file = "langchain_core-0.2.11.tar.gz", hash = "sha256:7a4661b50604eeb20c3373fbfd8a4f1b74482a6ab4e0f9df11e96821ead8ef0c"}, ] [package.dependencies] @@ -1977,18 +1978,18 @@ anthropic = ["anthropic[vertexai] (>=0.29.0,<1)"] [[package]] name = "langchain-openai" -version = "0.1.10" +version = "0.1.14" description = "An integration package connecting OpenAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.10-py3-none-any.whl", hash = "sha256:62eb000980eb45e4f16c88acdbaeccf3d59266554b0dd3ce6bebea1bbe8143dd"}, - {file = "langchain_openai-0.1.10.tar.gz", hash = "sha256:30f881f8ccaec28c054759837c41fd2a2264fcc5564728ce12e1715891a9ce3c"}, + {file = "langchain_openai-0.1.14-py3-none-any.whl", hash = "sha256:fcd34cc5b5713798908a5828d364b4426e3b1afccbd564d344e5477acb86634a"}, + {file = "langchain_openai-0.1.14.tar.gz", hash = "sha256:1f13d6041e8bedddf6eb47ccad7416e05af38fa169324f7f1bdf4f385780f8d8"}, ] [package.dependencies] langchain-core = ">=0.2.2,<0.3" -openai = ">=1.26.0,<2.0.0" +openai = ">=1.32.0,<2.0.0" tiktoken = ">=0.7,<1" [[package]] @@ -2007,13 +2008,13 @@ langchain-core = ">=0.2.10,<0.3.0" [[package]] name = "langsmith" -version = "0.1.82" +version = "0.1.83" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.82-py3-none-any.whl", hash = "sha256:9b3653e7d316036b0c60bf0bc3e280662d660f485a4ebd8e5c9d84f9831ae79c"}, - {file = "langsmith-0.1.82.tar.gz", hash = "sha256:c02e2bbc488c10c13b52c69d271eb40bd38da078d37b6ae7ae04a18bd48140be"}, + {file = "langsmith-0.1.83-py3-none-any.whl", hash = "sha256:f54d8cd8479b648b6339f3f735d19292c3516d080f680933ecdca3eab4b67ed3"}, + {file = "langsmith-0.1.83.tar.gz", hash = "sha256:5cdd947212c8ad19adb992c06471c860185a777daa6859bb47150f90daf64bf3"}, ] [package.dependencies] @@ -2477,13 +2478,13 @@ files = [ [[package]] name = "openai" -version = "1.35.5" +version = "1.35.9" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.5-py3-none-any.whl", hash = "sha256:28d92503c6e4b6a32a89277b36693023ef41f60922a4b5c8c621e8c5697ae3a6"}, - {file = "openai-1.35.5.tar.gz", hash = "sha256:67ef289ae22d350cbf9381d83ae82c4e3596d71b7ad1cc886143554ee12fe0c9"}, + {file = "openai-1.35.9-py3-none-any.whl", hash = "sha256:d73d353bcc0bd46b9516e78a0c6fb1cffaaeb92906c7c7b467c4fa088332a150"}, + {file = "openai-1.35.9.tar.gz", hash = "sha256:4f5c1b90526cf48eaedac7b32d11b5c92fa7064b82617ad8f5f3279cd9ef090d"}, ] [package.dependencies] @@ -2545,57 +2546,62 @@ opentelemetry-api = "1.25.0" [[package]] name = "orjson" -version = "3.10.5" +version = "3.10.6" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" files = [ - {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, - {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, - {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, - {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, - {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, - {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, - {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, - {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, - {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, - {file = "orjson-3.10.5-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d"}, - {file = "orjson-3.10.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9"}, - {file = "orjson-3.10.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b"}, - {file = "orjson-3.10.5-cp38-none-win32.whl", hash = "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4"}, - {file = "orjson-3.10.5-cp38-none-win_amd64.whl", hash = "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09"}, - {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, - {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, - {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, - {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, + {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c1c4b53b24a4c06547ce43e5fee6ec4e0d8fe2d597f4647fc033fd205707365"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eadc8fd310edb4bdbd333374f2c8fec6794bbbae99b592f448d8214a5e4050c0"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61272a5aec2b2661f4fa2b37c907ce9701e821b2c1285d5c3ab0207ebd358d38"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57985ee7e91d6214c837936dc1608f40f330a6b88bb13f5a57ce5257807da143"}, + {file = "orjson-3.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:633a3b31d9d7c9f02d49c4ab4d0a86065c4a6f6adc297d63d272e043472acab5"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1c680b269d33ec444afe2bdc647c9eb73166fa47a16d9a75ee56a374f4a45f43"}, + {file = "orjson-3.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f759503a97a6ace19e55461395ab0d618b5a117e8d0fbb20e70cfd68a47327f2"}, + {file = "orjson-3.10.6-cp310-none-win32.whl", hash = "sha256:95a0cce17f969fb5391762e5719575217bd10ac5a189d1979442ee54456393f3"}, + {file = "orjson-3.10.6-cp310-none-win_amd64.whl", hash = "sha256:df25d9271270ba2133cc88ee83c318372bdc0f2cd6f32e7a450809a111efc45c"}, + {file = "orjson-3.10.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b1ec490e10d2a77c345def52599311849fc063ae0e67cf4f84528073152bb2ba"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d43d3feb8f19d07e9f01e5b9be4f28801cf7c60d0fa0d279951b18fae1932b"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3045267e98fe749408eee1593a142e02357c5c99be0802185ef2170086a863"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c27bc6a28ae95923350ab382c57113abd38f3928af3c80be6f2ba7eb8d8db0b0"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d27456491ca79532d11e507cadca37fb8c9324a3976294f68fb1eff2dc6ced5a"}, + {file = "orjson-3.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05ac3d3916023745aa3b3b388e91b9166be1ca02b7c7e41045da6d12985685f0"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1335d4ef59ab85cab66fe73fd7a4e881c298ee7f63ede918b7faa1b27cbe5212"}, + {file = "orjson-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4bbc6d0af24c1575edc79994c20e1b29e6fb3c6a570371306db0993ecf144dc5"}, + {file = "orjson-3.10.6-cp311-none-win32.whl", hash = "sha256:450e39ab1f7694465060a0550b3f6d328d20297bf2e06aa947b97c21e5241fbd"}, + {file = "orjson-3.10.6-cp311-none-win_amd64.whl", hash = "sha256:227df19441372610b20e05bdb906e1742ec2ad7a66ac8350dcfd29a63014a83b"}, + {file = "orjson-3.10.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ea2977b21f8d5d9b758bb3f344a75e55ca78e3ff85595d248eee813ae23ecdfb"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6f3d167d13a16ed263b52dbfedff52c962bfd3d270b46b7518365bcc2121eed"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f710f346e4c44a4e8bdf23daa974faede58f83334289df80bc9cd12fe82573c7"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7275664f84e027dcb1ad5200b8b18373e9c669b2a9ec33d410c40f5ccf4b257e"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0943e4c701196b23c240b3d10ed8ecd674f03089198cf503105b474a4f77f21f"}, + {file = "orjson-3.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:446dee5a491b5bc7d8f825d80d9637e7af43f86a331207b9c9610e2f93fee22a"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:64c81456d2a050d380786413786b057983892db105516639cb5d3ee3c7fd5148"}, + {file = "orjson-3.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:960db0e31c4e52fa0fc3ecbaea5b2d3b58f379e32a95ae6b0ebeaa25b93dfd34"}, + {file = "orjson-3.10.6-cp312-none-win32.whl", hash = "sha256:a6ea7afb5b30b2317e0bee03c8d34c8181bc5a36f2afd4d0952f378972c4efd5"}, + {file = "orjson-3.10.6-cp312-none-win_amd64.whl", hash = "sha256:874ce88264b7e655dde4aeaacdc8fd772a7962faadfb41abe63e2a4861abc3dc"}, + {file = "orjson-3.10.6-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:66680eae4c4e7fc193d91cfc1353ad6d01b4801ae9b5314f17e11ba55e934183"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caff75b425db5ef8e8f23af93c80f072f97b4fb3afd4af44482905c9f588da28"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3722fddb821b6036fd2a3c814f6bd9b57a89dc6337b9924ecd614ebce3271394"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2c116072a8533f2fec435fde4d134610f806bdac20188c7bd2081f3e9e0133f"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6eeb13218c8cf34c61912e9df2de2853f1d009de0e46ea09ccdf3d757896af0a"}, + {file = "orjson-3.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965a916373382674e323c957d560b953d81d7a8603fbeee26f7b8248638bd48b"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03c95484d53ed8e479cade8628c9cea00fd9d67f5554764a1110e0d5aa2de96e"}, + {file = "orjson-3.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e060748a04cccf1e0a6f2358dffea9c080b849a4a68c28b1b907f272b5127e9b"}, + {file = "orjson-3.10.6-cp38-none-win32.whl", hash = "sha256:738dbe3ef909c4b019d69afc19caf6b5ed0e2f1c786b5d6215fbb7539246e4c6"}, + {file = "orjson-3.10.6-cp38-none-win_amd64.whl", hash = "sha256:d40f839dddf6a7d77114fe6b8a70218556408c71d4d6e29413bb5f150a692ff7"}, + {file = "orjson-3.10.6-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:697a35a083c4f834807a6232b3e62c8b280f7a44ad0b759fd4dce748951e70db"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd502f96bf5ea9a61cbc0b2b5900d0dd68aa0da197179042bdd2be67e51a1e4b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f215789fb1667cdc874c1b8af6a84dc939fd802bf293a8334fce185c79cd359b"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2debd8ddce948a8c0938c8c93ade191d2f4ba4649a54302a7da905a81f00b56"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5410111d7b6681d4b0d65e0f58a13be588d01b473822483f77f513c7f93bd3b2"}, + {file = "orjson-3.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb1f28a137337fdc18384079fa5726810681055b32b92253fa15ae5656e1dddb"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf2fbbce5fe7cd1aa177ea3eab2b8e6a6bc6e8592e4279ed3db2d62e57c0e1b2"}, + {file = "orjson-3.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:79b9b9e33bd4c517445a62b90ca0cc279b0f1f3970655c3df9e608bc3f91741a"}, + {file = "orjson-3.10.6-cp39-none-win32.whl", hash = "sha256:30b0a09a2014e621b1adf66a4f705f0809358350a757508ee80209b2d8dae219"}, + {file = "orjson-3.10.6-cp39-none-win_amd64.whl", hash = "sha256:49e3bc615652617d463069f91b867a4458114c5b104e13b7ae6872e5f79d0844"}, + {file = "orjson-3.10.6.tar.gz", hash = "sha256:e54b63d0a7c6c54a5f5f726bc93a2078111ef060fec4ecbf34c5db800ca3b3a7"}, ] [[package]] @@ -2622,13 +2628,13 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.39" +version = "8.13.40" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.39-py2.py3-none-any.whl", hash = "sha256:3ad2d086fa71e7eef409001b9195ac54bebb0c6e3e752209b558ca192c9229a0"}, - {file = "phonenumbers-8.13.39.tar.gz", hash = "sha256:db7ca4970d206b2056231105300753b1a5b229f43416f8c2b3010e63fbb68d77"}, + {file = "phonenumbers-8.13.40-py2.py3-none-any.whl", hash = "sha256:9582752c20a1da5ec4449f7f97542bf8a793c8e2fec0ab57f767177bb8fc0b1d"}, + {file = "phonenumbers-8.13.40.tar.gz", hash = "sha256:f137c2848b8e83dd064b71881b65680584417efa202177fd330e2f7ff6c68113"}, ] [[package]] @@ -2748,109 +2754,121 @@ files = [ [[package]] name = "pydantic" -version = "2.7.4" +version = "2.8.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.4-py3-none-any.whl", hash = "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"}, - {file = "pydantic-2.7.4.tar.gz", hash = "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52"}, + {file = "pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e"}, + {file = "pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.18.4" -typing-extensions = ">=4.6.1" +pydantic-core = "2.20.0" +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.18.4" +version = "2.20.0" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4"}, - {file = "pydantic_core-2.18.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be"}, - {file = "pydantic_core-2.18.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c"}, - {file = "pydantic_core-2.18.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e"}, - {file = "pydantic_core-2.18.4-cp310-none-win32.whl", hash = "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc"}, - {file = "pydantic_core-2.18.4-cp310-none-win_amd64.whl", hash = "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8"}, - {file = "pydantic_core-2.18.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2"}, - {file = "pydantic_core-2.18.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9"}, - {file = "pydantic_core-2.18.4-cp311-none-win32.whl", hash = "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558"}, - {file = "pydantic_core-2.18.4-cp311-none-win_amd64.whl", hash = "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b"}, - {file = "pydantic_core-2.18.4-cp311-none-win_arm64.whl", hash = "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2"}, - {file = "pydantic_core-2.18.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3"}, - {file = "pydantic_core-2.18.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c"}, - {file = "pydantic_core-2.18.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8"}, - {file = "pydantic_core-2.18.4-cp312-none-win32.whl", hash = "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07"}, - {file = "pydantic_core-2.18.4-cp312-none-win_amd64.whl", hash = "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a"}, - {file = "pydantic_core-2.18.4-cp312-none-win_arm64.whl", hash = "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2"}, - {file = "pydantic_core-2.18.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d"}, - {file = "pydantic_core-2.18.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b"}, - {file = "pydantic_core-2.18.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af"}, - {file = "pydantic_core-2.18.4-cp38-none-win32.whl", hash = "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2"}, - {file = "pydantic_core-2.18.4-cp38-none-win_amd64.whl", hash = "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528"}, - {file = "pydantic_core-2.18.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94"}, - {file = "pydantic_core-2.18.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b"}, - {file = "pydantic_core-2.18.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a"}, - {file = "pydantic_core-2.18.4-cp39-none-win32.whl", hash = "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d"}, - {file = "pydantic_core-2.18.4-cp39-none-win_amd64.whl", hash = "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d"}, - {file = "pydantic_core-2.18.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee"}, - {file = "pydantic_core-2.18.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9"}, - {file = "pydantic_core-2.18.4.tar.gz", hash = "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864"}, + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d"}, + {file = "pydantic_core-2.20.0-cp310-none-win32.whl", hash = "sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d"}, + {file = "pydantic_core-2.20.0-cp310-none-win_amd64.whl", hash = "sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137"}, + {file = "pydantic_core-2.20.0-cp311-none-win32.whl", hash = "sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e"}, + {file = "pydantic_core-2.20.0-cp311-none-win_amd64.whl", hash = "sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af"}, + {file = "pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918"}, + {file = "pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d"}, + {file = "pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e"}, + {file = "pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d"}, + {file = "pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc"}, + {file = "pydantic_core-2.20.0-cp38-none-win32.whl", hash = "sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2"}, + {file = "pydantic_core-2.20.0-cp38-none-win_amd64.whl", hash = "sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab"}, + {file = "pydantic_core-2.20.0-cp39-none-win32.whl", hash = "sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377"}, + {file = "pydantic_core-2.20.0-cp39-none-win_amd64.whl", hash = "sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2"}, + {file = "pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877"}, ] [package.dependencies] @@ -3459,13 +3477,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.7.0" +version = "2.7.1" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.7.0-py2.py3-none-any.whl", hash = "sha256:db9594c27a4d21c1ebad09908b1f0dc808ef65c2b89c1c8e7e455143262e37c1"}, - {file = "sentry_sdk-2.7.0.tar.gz", hash = "sha256:d846a211d4a0378b289ced3c434480945f110d0ede00450ba631fc2852e7a0d4"}, + {file = "sentry_sdk-2.7.1-py2.py3-none-any.whl", hash = "sha256:ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a"}, + {file = "sentry_sdk-2.7.1.tar.gz", hash = "sha256:25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b"}, ] [package.dependencies] @@ -3506,7 +3524,7 @@ sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=5)"] +tornado = ["tornado (>=6)"] [[package]] name = "shapely" @@ -3950,13 +3968,13 @@ telegram = ["requests"] [[package]] name = "twilio" -version = "9.2.1" +version = "9.2.3" description = "Twilio API client and TwiML generator" optional = true python-versions = ">=3.7.0" files = [ - {file = "twilio-9.2.1-py2.py3-none-any.whl", hash = "sha256:fd18f5e72429dedd2f83df821308d74b961b2a049ddb5c3cf7dd1eff8794fe1b"}, - {file = "twilio-9.2.1.tar.gz", hash = "sha256:dc1eb456182232e44f1a0e129a8956e7b7b45e4c0fb7f5b25b3ab6fa76e0efad"}, + {file = "twilio-9.2.3-py2.py3-none-any.whl", hash = "sha256:76bfc39aa8d854510907cb7f9465814dfdea9e91ec199bb44f0785f05746f4cc"}, + {file = "twilio-9.2.3.tar.gz", hash = "sha256:da2255b5f3753cb3bf647fc6c50edbdb367ebc3cde6802806f6f863058a65f75"}, ] [package.dependencies] @@ -4064,13 +4082,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "70.1.0.20240625" +version = "70.1.0.20240627" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-70.1.0.20240625.tar.gz", hash = "sha256:eb7175c9a304de4de9f4dfd0f299c754ac94cd9e30a262fbb5ff3047a0a6c517"}, - {file = "types_setuptools-70.1.0.20240625-py3-none-any.whl", hash = "sha256:181986729bdae9fa7efc7d37f1578361739e35dd6ec456d37de8e8f3bd2be1ef"}, + {file = "types-setuptools-70.1.0.20240627.tar.gz", hash = "sha256:385907a47b5cf302b928ce07953cd91147d5de6f3da604c31905fdf0ec309e83"}, + {file = "types_setuptools-70.1.0.20240627-py3-none-any.whl", hash = "sha256:c7bdf05cd0a8b66868b4774c7b3c079d01ae025d8c9562bfc8bf2ff44d263c9c"}, ] [[package]] @@ -4711,4 +4729,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "6db0fe735d65f6e7ef508241d63a4b069d7b01d67b2d4bca5571aae70641d4c3" +content-hash = "f2d5fe214311ec582efd7760aa25147f11567ddfa1b4ca8ee8088e5798336d8f" diff --git a/pyproject.toml b/pyproject.toml index 61332efecf..22af311b7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ groq = { version = "^0.9.0", optional = true } # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } pvkoala = { version = "^2.0.1", optional = true } -cartesia = { version = "^0.1.1", optional = true } +cartesia = { version = "^1.0.3", optional = true } # Transcribers google-cloud-speech = { version = "^2.26.0", optional = true } diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index 13a7fe655c..cc7969eaeb 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -229,7 +229,7 @@ class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value sampling_rate: int = DEFAULT_POLLY_SAMPLING_RATE -DEFAULT_CARTESIA_MODEL_ID = "upbeat-moon" +DEFAULT_CARTESIA_MODEL_ID = "sonic-english" DEFAULT_CARTESIA_VOICE_ID = "5345cf08-6f37-424d-a5d9-8ae1101b9377" diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index ea368cc15b..5038cf2669 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -295,7 +295,7 @@ def get_message_cutoff_from_total_response_length( @staticmethod def get_message_cutoff_from_voice_speed( - message: BaseMessage, seconds: Optional[float], words_per_minute: int + message: BaseMessage, seconds: Optional[float], words_per_minute: int = 150 ) -> str: if seconds is None: diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index 84f779ca07..7458f7f7ff 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -7,7 +7,6 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import CartesiaSynthesizerConfig from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log class CartesiaSynthesizer(BaseSynthesizer[CartesiaSynthesizerConfig]): @@ -19,46 +18,63 @@ def __init__( # Lazy import the cartesia module try: - from cartesia.tts import AsyncCartesiaTTS + from cartesia import AsyncCartesia except ImportError as e: raise ImportError(f"Missing required dependancies for CartesiaSynthesizer") from e - self.cartesia_tts = AsyncCartesiaTTS - self.api_key = synthesizer_config.api_key or getenv("CARTESIA_API_KEY") if not self.api_key: raise ValueError("Missing Cartesia API key") + self.cartesia_tts = AsyncCartesia + if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: - self.channel_width = 2 match synthesizer_config.sampling_rate: case SamplingRate.RATE_44100: - self.sampling_rate = 44100 - self.output_format = "pcm_44100" + self.output_format = { + "sample_rate": 44100, + "encoding": "pcm_s16le", + "container": "raw", + } case SamplingRate.RATE_22050: - self.sampling_rate = 22050 - self.output_format = "pcm_22050" + self.output_format = { + "sample_rate": 22050, + "encoding": "pcm_s16le", + "container": "raw", + } case SamplingRate.RATE_16000: - self.sampling_rate = 16000 - self.output_format = "pcm_16000" + self.output_format = { + "sample_rate": 16000, + "encoding": "pcm_s16le", + "container": "raw", + } + case SamplingRate.RATE_8000: + self.output_format = { + "sample_rate": 8000, + "encoding": "pcm_s16le", + "container": "raw", + } case _: raise ValueError( f"Unsupported PCM sampling rate {synthesizer_config.sampling_rate}" ) elif synthesizer_config.audio_encoding == AudioEncoding.MULAW: - # Cartesia has issues with MuLaw/8000. Use pcm/16000 and - # create_synthesis_result_from_wav will handle the conversion to mulaw/8000 self.channel_width = 2 - self.output_format = "pcm_16000" - self.sampling_rate = 16000 + self.output_format = { + "sample_rate": 8000, + "encoding": "pcm_mulaw", + "container": "raw", + } else: raise ValueError(f"Unsupported audio encoding {synthesizer_config.audio_encoding}") + if not isinstance(self.output_format["sample_rate"], int): + raise ValueError(f"Invalid type for sample_rate") + self.sampling_rate = self.output_format["sample_rate"] self.num_channels = 1 self.model_id = synthesizer_config.model_id self.voice_id = synthesizer_config.voice_id self.client = self.cartesia_tts(api_key=self.api_key) - self.voice_embedding = self.client.get_voice_embedding(voice_id=self.voice_id) async def create_speech_uncached( self, @@ -67,33 +83,33 @@ async def create_speech_uncached( is_first_text_chunk: bool = False, is_sole_text_chunk: bool = False, ) -> SynthesisResult: - generator = await self.client.generate( + generator = await self.client.tts.sse( + model_id=self.model_id, transcript=message.text, - voice=self.voice_embedding, + voice_id=self.voice_id, stream=True, - model_id=self.model_id, - data_rtype="bytes", output_format=self.output_format, ) - audio_file = io.BytesIO() - with wave.open(audio_file, "wb") as wav_file: - wav_file.setnchannels(self.num_channels) - wav_file.setsampwidth(self.channel_width) - wav_file.setframerate(self.sampling_rate) - async for chunk in generator: - wav_file.writeframes(chunk["audio"]) - audio_file.seek(0) + async def chunk_generator(sse): + buffer = bytearray() + async for event in sse: + audio = event.get("audio") + buffer.extend(audio) + while len(buffer) >= chunk_size: + yield SynthesisResult.ChunkResult( + chunk=buffer[:chunk_size], is_last_chunk=False + ) + buffer = buffer[chunk_size:] + yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) - result = self.create_synthesis_result_from_wav( - synthesizer_config=self.synthesizer_config, - file=audio_file, - message=message, - chunk_size=chunk_size, + return SynthesisResult( + chunk_generator=chunk_generator(generator), + get_message_up_to=lambda seconds: self.get_message_cutoff_from_voice_speed( + message, seconds + ), ) - return result - @classmethod def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): hashed_api_key = hashlib.sha256(f"{synthesizer_config.api_key}".encode("utf-8")).hexdigest() @@ -106,3 +122,7 @@ def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): synthesizer_config.audio_encoding, ) ) + + async def tear_down(self): + await super().tear_down() + await self.client.close() From af2849c569c14033b4b6a5dd53a2898197f3375a Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 3 Jul 2024 14:44:00 -0700 Subject: [PATCH 106/148] poetry version prerelease (#602) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 22af311b7a..eec09a2715 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.113" +version = "0.1.114a0" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From 918412c4e2469fe14bf5f3c9e4914c43a5bd3b79 Mon Sep 17 00:00:00 2001 From: Clay Elmore <39035319+celmore25@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:10:11 -0700 Subject: [PATCH 107/148] feat: Add ability to configure OpenAI base URL in ChatGPTAgentConfig (#577) * feat: Add ability to configure OpenAI base URL in ChatGPTAgentConfig - Added `base_url` parameter to `ChatGPTAgentConfig` to allow customization of the OpenAI API base URL. - Updated `instantiate_openai_client` function to use the `base_url` parameter from the configuration. - Modified `ChatGPTAgent` to utilize the updated `instantiate_openai_client` function. - Added tests to verify the new `base_url` functionality in `tests/streaming/agent/test_base_agent.py`. This enhancement allows users to specify a custom OpenAI API base URL, providing greater flexibility in agent configuration. * adding capability to use the openai compatible endpoint with token estimation for llama * lint fix * changing openai base_url parameter for overall less code changes * missed logging update * Update vocode/streaming/agent/chat_gpt_agent.py * Update tests/streaming/agent/test_base_agent.py * fix test --------- Co-authored-by: Ajay Raj --- tests/streaming/agent/test_base_agent.py | 15 +++++++++++++++ vocode/streaming/agent/chat_gpt_agent.py | 4 +++- vocode/streaming/agent/token_utils.py | 10 +++++++++- vocode/streaming/models/agent.py | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/streaming/agent/test_base_agent.py b/tests/streaming/agent/test_base_agent.py index c6a0adb952..9720405793 100644 --- a/tests/streaming/agent/test_base_agent.py +++ b/tests/streaming/agent/test_base_agent.py @@ -177,3 +177,18 @@ async def test_action_response_agent_input(mocker: MockerFixture): # TODO: assert that the canned response is optionally sent if the action is not quiet # and that it goes through the normal flow when the action is not quiet pass + + +@pytest.fixture +def agent_config(): + return ChatGPTAgentConfig( + openai_api_key="test_key", + model_name="llama3-8b-8192", + base_url_override="https://api.groq.com/openai/v1/", + prompt_preamble="Test prompt", + ) + + +def test_chat_gpt_agent_base_url(agent_config): + agent = ChatGPTAgent(agent_config) + assert str(agent.openai_client.base_url) == "https://api.groq.com/openai/v1/" diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 047aa6c90e..11e7c6586c 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -39,9 +39,11 @@ def instantiate_openai_client(agent_config: ChatGPTAgentConfig, model_fallback: else: if agent_config.openai_api_key is not None: logger.info("Using OpenAI API key override") + if agent_config.base_url_override is not None: + logger.info(f"Using OpenAI base URL override: {agent_config.base_url_override}") return AsyncOpenAI( api_key=agent_config.openai_api_key or os.environ["OPENAI_API_KEY"], - base_url="https://api.openai.com/v1", + base_url=agent_config.base_url_override or "https://api.openai.com/v1", max_retries=0 if model_fallback else OPENAI_DEFAULT_MAX_RETRIES, ) diff --git a/vocode/streaming/agent/token_utils.py b/vocode/streaming/agent/token_utils.py index 7cd80f8cc0..bf014b2b7f 100644 --- a/vocode/streaming/agent/token_utils.py +++ b/vocode/streaming/agent/token_utils.py @@ -90,7 +90,7 @@ def get_tokenizer_info(model: str) -> Optional[TokenizerInfo]: try: encoding = tiktoken.encoding_for_model(model) except KeyError: - logger.warning("Warning: model not found. Using cl100k_base encoding.") + logger.warning(f"Warning: model not found. Using cl100k_base encoding for {model}.") encoding = tiktoken.get_encoding("cl100k_base") if model in { "gpt-3.5-turbo-0613", @@ -117,6 +117,14 @@ def get_tokenizer_info(model: str) -> Optional[TokenizerInfo]: ) tokens_per_message = 3 tokens_per_name = 1 + elif "llama" in model.lower(): + logger.warning( + f"Warning: you are using a llama model with an OpenAI compatible endpoint. \ + Llama models are not supported natively support for token counting in tiktoken. \ + Using cl100k_base encoding for {model} as an APPROXIMATION of token usage." + ) + tokens_per_message = 3 + tokens_per_name = 1 else: return None diff --git a/vocode/streaming/models/agent.py b/vocode/streaming/models/agent.py index b023e1e234..aa9b63c8fd 100644 --- a/vocode/streaming/models/agent.py +++ b/vocode/streaming/models/agent.py @@ -122,6 +122,7 @@ class ChatGPTAgentConfig(AgentConfig, type=AgentType.CHAT_GPT.value): # type: i openai_api_key: Optional[str] = None prompt_preamble: str model_name: str = CHAT_GPT_AGENT_DEFAULT_MODEL_NAME + base_url_override: Optional[str] = None temperature: float = LLM_AGENT_DEFAULT_TEMPERATURE max_tokens: int = LLM_AGENT_DEFAULT_MAX_TOKENS azure_params: Optional[AzureOpenAIConfig] = None From 41f38bcc7d91cc50693e7113442d70456bab05b9 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Fri, 5 Jul 2024 10:23:27 -0700 Subject: [PATCH 108/148] Support passthrough of AsyncHTTPTransport (#603) Support passthrough of AsyncHTTPTransport object --- tests/streaming/action/test_external_actions_requester.py | 2 ++ vocode/streaming/action/external_actions_requester.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/streaming/action/test_external_actions_requester.py b/tests/streaming/action/test_external_actions_requester.py index c9d2f8b359..626d5db938 100644 --- a/tests/streaming/action/test_external_actions_requester.py +++ b/tests/streaming/action/test_external_actions_requester.py @@ -5,6 +5,7 @@ import os from typing import Any, Callable, Dict +import httpx import pytest from httpx import Request, Response from pytest_httpx import HTTPXMock @@ -65,6 +66,7 @@ async def test_send_request_responses( JSON_SCHEMA, base64.b64encode(os.urandom(32)).decode(), additional_payload_values={"call_id": "call_id"}, + transport=httpx.AsyncHTTPTransport(retries=3, verify=True), ) assert response.success is expected_success diff --git a/vocode/streaming/action/external_actions_requester.py b/vocode/streaming/action/external_actions_requester.py index ff82911bd6..658192e7b4 100644 --- a/vocode/streaming/action/external_actions_requester.py +++ b/vocode/streaming/action/external_actions_requester.py @@ -52,6 +52,7 @@ async def send_request( payload: Dict[str, Any], signature_secret: str, additional_payload_values: Dict[str, Any] = {}, + transport: httpx.AsyncHTTPTransport = httpx.AsyncHTTPTransport(retries=2), ) -> ExternalActionResponse: encoded_payload = json.dumps({"payload": payload} | additional_payload_values).encode( "utf-8" @@ -63,7 +64,6 @@ async def send_request( "x-vocode-signature": self._encode_payload(encoded_payload, signature_secret), } - transport = httpx.AsyncHTTPTransport(retries=2) async with httpx.AsyncClient( headers=headers, transport=transport, From c580d13addca1b0bd283fb525c4fc42899fb418b Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Fri, 5 Jul 2024 11:33:20 -0700 Subject: [PATCH 109/148] Remove catch-all exception logger for asyncio tasks (#605) * remove error log from exception for asyncio tasks * remove log error on chatgpt query --- vocode/streaming/agent/chat_gpt_agent.py | 15 +-------------- .../output_device/twilio_output_device.py | 10 +++------- vocode/streaming/streaming_conversation.py | 8 ++++---- vocode/streaming/synthesizer/base_synthesizer.py | 4 ++-- .../synthesizer/eleven_labs_synthesizer.py | 4 ++-- .../synthesizer/play_ht_synthesizer_v2.py | 4 ++-- vocode/streaming/utils/create_task.py | 15 +-------------- vocode/streaming/utils/worker.py | 8 ++++---- 8 files changed, 19 insertions(+), 49 deletions(-) diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 11e7c6586c..4d54eb54a2 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -151,26 +151,13 @@ async def _create_openai_stream_with_fallback( ) self.apply_model_fallback(chat_parameters) stream = await self.openai_client.chat.completions.create(**chat_parameters) - except Exception as e: - logger.error( - f"Error while hitting OpenAI with chat_parameters: {chat_parameters}", - exc_info=True, - ) - raise e return stream async def _create_openai_stream(self, chat_parameters: Dict[str, Any]) -> AsyncGenerator: if self.agent_config.llm_fallback is not None and self.openai_client.max_retries == 0: stream = await self._create_openai_stream_with_fallback(chat_parameters) else: - try: - stream = await self.openai_client.chat.completions.create(**chat_parameters) - except Exception as e: - logger.error( - f"Error while hitting OpenAI with chat_parameters: {chat_parameters}", - exc_info=True, - ) - raise e + stream = await self.openai_client.chat.completions.create(**chat_parameters) return stream def should_backchannel(self, human_input: str) -> bool: diff --git a/vocode/streaming/output_device/twilio_output_device.py b/vocode/streaming/output_device/twilio_output_device.py index 74e0e9c077..00926e9b0f 100644 --- a/vocode/streaming/output_device/twilio_output_device.py +++ b/vocode/streaming/output_device/twilio_output_device.py @@ -14,7 +14,7 @@ from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task from vocode.streaming.utils.worker import InterruptibleEvent @@ -95,12 +95,8 @@ async def _process_mark_messages(self): self.interruptible_event.is_interruptible = False async def _run_loop(self): - send_twilio_messages_task = asyncio_create_task_with_done_error_log( - self._send_twilio_messages() - ) - process_mark_messages_task = asyncio_create_task_with_done_error_log( - self._process_mark_messages() - ) + send_twilio_messages_task = asyncio_create_task(self._send_twilio_messages()) + process_mark_messages_task = asyncio_create_task(self._process_mark_messages()) await asyncio.gather(send_twilio_messages_task, process_mark_messages_task) def _send_audio_chunk_and_mark(self, chunk: bytes, chunk_id: str): diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index 58ce8d167b..52e862ca6b 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -61,7 +61,7 @@ enumerate_async_iter, get_chunk_size_per_second, ) -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task from vocode.streaming.utils.events_manager import EventsManager from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.state_manager import ConversationStateManager @@ -710,7 +710,7 @@ async def start(self, mark_ready: Optional[Callable[[], Awaitable[None]]] = None self.agent.start() initial_message = self.agent.get_agent_config().initial_message if initial_message: - asyncio_create_task_with_done_error_log( + asyncio_create_task( self.send_initial_message(initial_message), ) else: @@ -719,11 +719,11 @@ async def start(self, mark_ready: Optional[Callable[[], Awaitable[None]]] = None if mark_ready: await mark_ready() self.is_terminated.clear() - self.check_for_idle_task = asyncio_create_task_with_done_error_log( + self.check_for_idle_task = asyncio_create_task( self.check_for_idle(), ) if len(self.events_manager.subscriptions) > 0: - self.events_task = asyncio_create_task_with_done_error_log( + self.events_task = asyncio_create_task( self.events_manager.start(), ) diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 5038cf2669..bdbd6d7d53 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -21,7 +21,7 @@ from vocode.streaming.telephony.constants import MULAW_SILENCE_BYTE, PCM_SILENCE_BYTE from vocode.streaming.utils import convert_wav, get_chunk_size_per_second from vocode.streaming.utils.async_requester import AsyncRequestor -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task FILLER_PHRASES = [ BaseMessage(text="Um..."), @@ -428,7 +428,7 @@ async def send_chunks(): miniaudio_worker.consume_nonblocking(None) # sentinel try: - asyncio_create_task_with_done_error_log(send_chunks(), reraise_cancelled=True) + asyncio_create_task(send_chunks(), reraise_cancelled=True) # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop while True: diff --git a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py index 714b5bf720..1ccd435475 100644 --- a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py @@ -10,7 +10,7 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import ElevenLabsSynthesizerConfig from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task ELEVEN_LABS_BASE_URL = "https://api.elevenlabs.io/v1/" STREAMED_CHUNK_SIZE = 16000 * 2 // 4 # 1/8 of a second of 16kHz audio with 16-bit samples @@ -97,7 +97,7 @@ async def create_speech_uncached( body["model_id"] = self.model_id chunk_queue: asyncio.Queue[Optional[bytes]] = asyncio.Queue() - asyncio_create_task_with_done_error_log( + asyncio_create_task( self.get_chunks(url, headers, body, chunk_size, chunk_queue), ) diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py b/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py index 6db09ef7d3..1e58b70fb4 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer_v2.py @@ -18,7 +18,7 @@ ) from vocode.streaming.synthesizer.synthesizer_utils import split_text from vocode.streaming.utils import generate_from_async_iter_with_lookahead, generate_with_is_last -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task PLAY_HT_ON_PREM_ADDR = os.environ.get("VOCODE_PLAYHT_ON_PREM_ADDR", None) PLAY_HT_V2_MAX_CHARS = 200 @@ -86,7 +86,7 @@ async def create_speech_uncached( self.total_chars += len(message.text) chunk_queue: asyncio.Queue[Optional[bytes]] = asyncio.Queue() - asyncio_create_task_with_done_error_log( + asyncio_create_task( self.get_chunks( message, chunk_size, diff --git a/vocode/streaming/utils/create_task.py b/vocode/streaming/utils/create_task.py index 9554734d05..38778d0bf6 100644 --- a/vocode/streaming/utils/create_task.py +++ b/vocode/streaming/utils/create_task.py @@ -6,25 +6,12 @@ tasks_registry = [] -def log_if_exception(reraise_cancelled: bool, future: asyncio.Future) -> None: - try: - if exc := future.exception(): - logger.exception( - f"Vocode wrapped logger; exception raised by task {future}: {exc}", - exc_info=exc, - ) - except asyncio.CancelledError: - if reraise_cancelled: - raise - - -def asyncio_create_task_with_done_error_log( +def asyncio_create_task( *args, reraise_cancelled: bool = False, **kwargs, ) -> asyncio.Task: task = asyncio.create_task(*args, **kwargs) tasks_registry.append(task) - task.add_done_callback(functools.partial(log_if_exception, reraise_cancelled)) task.add_done_callback(lambda t: tasks_registry.remove(t)) return task diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index cdbff41ace..16c52a6551 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -7,7 +7,7 @@ import janus from loguru import logger -from vocode.streaming.utils.create_task import asyncio_create_task_with_done_error_log +from vocode.streaming.utils.create_task import asyncio_create_task WorkerInputType = TypeVar("WorkerInputType") @@ -23,7 +23,7 @@ def __init__( self.output_queue = output_queue def start(self) -> asyncio.Task: - self.worker_task = asyncio_create_task_with_done_error_log( + self.worker_task = asyncio_create_task( self._run_loop(), ) if not self.worker_task: @@ -60,7 +60,7 @@ def __init__( def start(self) -> asyncio.Task: self.worker_thread = threading.Thread(target=self._run_loop) self.worker_thread.start() - self.worker_task = asyncio_create_task_with_done_error_log( + self.worker_task = asyncio_create_task( self.run_thread_forwarding(), ) if not self.worker_task: @@ -224,7 +224,7 @@ async def _run_loop(self): if item.is_interrupted(): continue self.interruptible_event = item - self.current_task = asyncio_create_task_with_done_error_log( + self.current_task = asyncio_create_task( self.process(item), reraise_cancelled=True, ) From be5f78e97b4349348adba024176c0bd7c98325ff Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 14:00:37 -0700 Subject: [PATCH 110/148] remove phantom parameter (#612) --- vocode/streaming/synthesizer/base_synthesizer.py | 2 +- vocode/streaming/utils/create_task.py | 1 - vocode/streaming/utils/worker.py | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index bdbd6d7d53..2263cc0e2e 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -428,7 +428,7 @@ async def send_chunks(): miniaudio_worker.consume_nonblocking(None) # sentinel try: - asyncio_create_task(send_chunks(), reraise_cancelled=True) + asyncio_create_task(send_chunks()) # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop while True: diff --git a/vocode/streaming/utils/create_task.py b/vocode/streaming/utils/create_task.py index 38778d0bf6..0680709c5e 100644 --- a/vocode/streaming/utils/create_task.py +++ b/vocode/streaming/utils/create_task.py @@ -8,7 +8,6 @@ def asyncio_create_task( *args, - reraise_cancelled: bool = False, **kwargs, ) -> asyncio.Task: task = asyncio.create_task(*args, **kwargs) diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index 16c52a6551..d2552fb0d5 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -226,7 +226,6 @@ async def _run_loop(self): self.interruptible_event = item self.current_task = asyncio_create_task( self.process(item), - reraise_cancelled=True, ) try: From 9904cd6828676714075194e88bc5d43e423e2487 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 14:36:55 -0700 Subject: [PATCH 111/148] support files in make transcribe (#610) * support files in make transcribe * switch comment --- playground/streaming/transcriber/transcribe.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/playground/streaming/transcriber/transcribe.py b/playground/streaming/transcriber/transcribe.py index 111c272466..b9ff325b1b 100644 --- a/playground/streaming/transcriber/transcribe.py +++ b/playground/streaming/transcriber/transcribe.py @@ -1,3 +1,4 @@ +from vocode.streaming.input_device.file_input_device import FileInputDevice from vocode.streaming.input_device.microphone_input import MicrophoneInput from vocode.streaming.models.transcriber import DeepgramTranscriberConfig, Transcription from vocode.streaming.transcriber.base_transcriber import BaseTranscriber @@ -20,18 +21,19 @@ async def print_output(transcriber: BaseTranscriber): async def listen(): microphone_input = MicrophoneInput.from_default_device() + # input_device = FileInputDevice(file_path="spacewalk.wav") # replace with the transcriber you want to test transcriber = DeepgramTranscriber( DeepgramTranscriberConfig.from_input_device( - microphone_input, endpointing_config=DeepgramEndpointingConfig() + input_device, endpointing_config=DeepgramEndpointingConfig() ) ) transcriber.start() asyncio.create_task(print_output(transcriber)) print("Start speaking...press Ctrl+C to end. ") while True: - chunk = await microphone_input.get_audio() + chunk = await input_device.get_audio() transcriber.send_audio(chunk) asyncio.run(listen()) From f84cd0392c01346002fda4ed750ef876c43ff491 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 15:26:50 -0700 Subject: [PATCH 112/148] uses .value instead of passing enum for sampling rate (#613) --- vocode/streaming/models/synthesizer.py | 2 +- vocode/streaming/telephony/constants.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index cc7969eaeb..ce8af4babb 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -220,7 +220,7 @@ class BarkSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.BARK.value): DEFAULT_POLLY_LANGUAGE_CODE = "en-US" DEFAULT_POLLY_VOICE_ID = "Matthew" -DEFAULT_POLLY_SAMPLING_RATE = SamplingRate.RATE_16000 +DEFAULT_POLLY_SAMPLING_RATE = SamplingRate.RATE_16000.value class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value): # type: ignore diff --git a/vocode/streaming/telephony/constants.py b/vocode/streaming/telephony/constants.py index 889971bbf0..34c1766fc6 100644 --- a/vocode/streaming/telephony/constants.py +++ b/vocode/streaming/telephony/constants.py @@ -1,12 +1,12 @@ from vocode.streaming.models.audio import AudioEncoding, SamplingRate # TODO(EPD-186): namespace as Twilio -DEFAULT_SAMPLING_RATE = SamplingRate.RATE_8000 +DEFAULT_SAMPLING_RATE: int = SamplingRate.RATE_8000.value DEFAULT_AUDIO_ENCODING = AudioEncoding.MULAW DEFAULT_CHUNK_SIZE = 20 * 160 MULAW_SILENCE_BYTE = b"\xff" -VONAGE_SAMPLING_RATE = SamplingRate.RATE_16000 +VONAGE_SAMPLING_RATE: int = SamplingRate.RATE_16000.value VONAGE_AUDIO_ENCODING = AudioEncoding.LINEAR16 VONAGE_CHUNK_SIZE = 640 # 20ms at 16kHz with 16bit samples VONAGE_CONTENT_TYPE = "audio/l16;rate=16000" From 7f4899e54666458e7999d00c31f887c05b3189ae Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 15:28:55 -0700 Subject: [PATCH 113/148] [hotfix] fix ref in make transcribe (#614) --- playground/streaming/transcriber/transcribe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playground/streaming/transcriber/transcribe.py b/playground/streaming/transcriber/transcribe.py index b9ff325b1b..a9b6b82097 100644 --- a/playground/streaming/transcriber/transcribe.py +++ b/playground/streaming/transcriber/transcribe.py @@ -20,7 +20,7 @@ async def print_output(transcriber: BaseTranscriber): print(transcription) async def listen(): - microphone_input = MicrophoneInput.from_default_device() + input_device = MicrophoneInput.from_default_device() # input_device = FileInputDevice(file_path="spacewalk.wav") # replace with the transcriber you want to test From d4b139eac73a28b6fcb624a3dbde14a088768f83 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 15:41:18 -0700 Subject: [PATCH 114/148] [DOW-113] deprecate output queue and manually attach workers to each other (#593) * deprecate output queues * fix quickstarts * fix mypy * fix tests * fix mypy * adds comment * adds back streamingconversation test * make input queue private on AsyncWorker * update tests * resolve PR comments --- .vscode/settings.json | 3 +- playground/streaming/agent/chat.py | 28 ++-- .../streaming/transcriber/transcribe.py | 18 ++- tests/fakedata/conversation.py | 7 +- tests/fixtures/synthesizer.py | 50 ++++++++ tests/fixtures/transcriber.py | 24 ++++ tests/streaming/agent/test_base_agent.py | 48 +++---- .../streaming/test_streaming_conversation.py | 100 ++++++++++----- vocode/streaming/action/worker.py | 43 ++++--- vocode/streaming/agent/base_agent.py | 121 ++++++++++-------- .../agent/websocket_user_implemented_agent.py | 14 +- .../output_device/abstract_output_device.py | 2 +- .../output_device/blocking_speaker_output.py | 5 +- .../output_device/livekit_output_device.py | 2 +- .../rate_limit_interruptions_output_device.py | 2 +- vocode/streaming/streaming_conversation.py | 116 ++++++++--------- .../streaming/synthesizer/base_synthesizer.py | 9 +- .../streaming/synthesizer/miniaudio_worker.py | 26 +++- .../abstract_phone_conversation.py | 6 - .../transcriber/assembly_ai_transcriber.py | 6 +- .../transcriber/azure_transcriber.py | 4 +- .../streaming/transcriber/base_transcriber.py | 38 +++++- .../transcriber/deepgram_transcriber.py | 8 +- .../transcriber/gladia_transcriber.py | 6 +- .../transcriber/google_transcriber.py | 2 +- .../transcriber/rev_ai_transcriber.py | 8 +- .../transcriber/whisper_cpp_transcriber.py | 2 +- vocode/streaming/utils/worker.py | 96 +++++++------- 28 files changed, 473 insertions(+), 321 deletions(-) create mode 100644 tests/fixtures/synthesizer.py create mode 100644 tests/fixtures/transcriber.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 5353050c8e..03e207285d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,6 @@ "rewrap.wrappingColumn": 100, "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "isort.check": true + "isort.check": true, + "python.testing.pytestArgs": ["tests"] } diff --git a/playground/streaming/agent/chat.py b/playground/streaming/agent/chat.py index 659443c9a4..e93b9eeda8 100644 --- a/playground/streaming/agent/chat.py +++ b/playground/streaming/agent/chat.py @@ -21,12 +21,13 @@ from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.transcript import Transcript from vocode.streaming.utils.state_manager import AbstractConversationStateManager -from vocode.streaming.utils.worker import InterruptibleAgentResponseEvent +from vocode.streaming.utils.worker import InterruptibleAgentResponseEvent, QueueConsumer load_dotenv() from vocode.streaming.agent import ChatGPTAgent from vocode.streaming.agent.base_agent import ( + AgentResponse, AgentResponseMessage, AgentResponseType, BaseAgent, @@ -96,6 +97,11 @@ async def run_agent( ): ended = False conversation_id = create_conversation_id() + agent_response_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]] = ( + asyncio.Queue() + ) + agent_consumer = QueueConsumer(input_queue=agent_response_queue) + agent.agent_responses_consumer = agent_consumer async def receiver(): nonlocal ended @@ -106,7 +112,7 @@ async def receiver(): while not ended: try: - event = await agent.get_output_queue().get() + event = await agent_response_queue.get() response = event.payload if response.type == AgentResponseType.FILLER_AUDIO: print("Would have sent filler audio") @@ -152,6 +158,13 @@ async def receiver(): break async def sender(): + if agent.agent_config.initial_message is not None: + agent.agent_responses_consumer.consume_nonblocking( + InterruptibleAgentResponseEvent( + payload=AgentResponseMessage(message=agent.agent_config.initial_message), + agent_response_tracker=asyncio.Event(), + ) + ) while not ended: try: message = await asyncio.get_event_loop().run_in_executor( @@ -175,10 +188,10 @@ async def sender(): actions_worker = None if isinstance(agent, ChatGPTAgent): actions_worker = ActionsWorker( - input_queue=agent.actions_queue, - output_queue=agent.get_input_queue(), action_factory=agent.action_factory, ) + actions_worker.consumer = agent + agent.actions_consumer = actions_worker actions_worker.attach_conversation_state_manager(agent.conversation_state_manager) actions_worker.start() @@ -215,13 +228,6 @@ async def agent_main(): ) agent.attach_conversation_state_manager(DummyConversationManager()) agent.attach_transcript(transcript) - if agent.agent_config.initial_message is not None: - agent.output_queue.put_nowait( - InterruptibleAgentResponseEvent( - payload=AgentResponseMessage(message=agent.agent_config.initial_message), - agent_response_tracker=asyncio.Event(), - ) - ) agent.start() try: diff --git a/playground/streaming/transcriber/transcribe.py b/playground/streaming/transcriber/transcribe.py index a9b6b82097..d7a097df32 100644 --- a/playground/streaming/transcriber/transcribe.py +++ b/playground/streaming/transcriber/transcribe.py @@ -6,6 +6,15 @@ DeepgramEndpointingConfig, DeepgramTranscriber, ) +from vocode.streaming.utils.worker import AsyncWorker + + +class TranscriptionPrinter(AsyncWorker[Transcription]): + async def _run_loop(self): + while True: + transcription: Transcription = await self._input_queue.get() + print(transcription) + if __name__ == "__main__": import asyncio @@ -14,11 +23,6 @@ load_dotenv() - async def print_output(transcriber: BaseTranscriber): - while True: - transcription: Transcription = await transcriber.output_queue.get() - print(transcription) - async def listen(): input_device = MicrophoneInput.from_default_device() # input_device = FileInputDevice(file_path="spacewalk.wav") @@ -30,7 +34,9 @@ async def listen(): ) ) transcriber.start() - asyncio.create_task(print_output(transcriber)) + transcription_printer = TranscriptionPrinter() + transcriber.consumer = transcription_printer + transcription_printer.start() print("Start speaking...press Ctrl+C to end. ") while True: chunk = await input_device.get_audio() diff --git a/tests/fakedata/conversation.py b/tests/fakedata/conversation.py index 69e407d33a..890dcb44ec 100644 --- a/tests/fakedata/conversation.py +++ b/tests/fakedata/conversation.py @@ -1,5 +1,4 @@ import asyncio -import time from typing import Optional from pytest_mock import MockerFixture @@ -52,6 +51,7 @@ def __init__( self.wait_for_interrupt = wait_for_interrupt self.chunks_before_interrupt = chunks_before_interrupt self.interrupt_event = asyncio.Event() + self.dummy_playback_queue = asyncio.Queue() async def process(self, item): self.interruptible_event = item @@ -61,6 +61,7 @@ async def process(self, item): audio_chunk.on_interrupt() audio_chunk.state = ChunkState.INTERRUPTED else: + self.dummy_playback_queue.put_nowait(audio_chunk) audio_chunk.on_play() audio_chunk.state = ChunkState.PLAYED self.interruptible_event.is_interruptible = False @@ -69,7 +70,7 @@ async def _run_loop(self): chunk_counter = 0 while True: try: - item = await self.input_queue.get() + item = await self._input_queue.get() except asyncio.CancelledError: return if self.wait_for_interrupt and chunk_counter == self.chunks_before_interrupt: @@ -80,7 +81,7 @@ async def _run_loop(self): def flush(self): while True: try: - item = self.input_queue.get_nowait() + item = self._input_queue.get_nowait() except asyncio.QueueEmpty: break self.process(item) diff --git a/tests/fixtures/synthesizer.py b/tests/fixtures/synthesizer.py new file mode 100644 index 0000000000..6181db2a20 --- /dev/null +++ b/tests/fixtures/synthesizer.py @@ -0,0 +1,50 @@ +import wave +from io import BytesIO + +from vocode.streaming.models.message import BaseMessage +from vocode.streaming.models.synthesizer import SynthesizerConfig +from vocode.streaming.synthesizer.base_synthesizer import BaseSynthesizer, SynthesisResult + + +def create_fake_audio(message: str, synthesizer_config: SynthesizerConfig): + file = BytesIO() + with wave.open(file, "wb") as wave_file: + wave_file.setnchannels(1) + wave_file.setsampwidth(2) + wave_file.setframerate(synthesizer_config.sampling_rate) + wave_file.writeframes(message.encode()) + file.seek(0) + return file + + +class TestSynthesizerConfig(SynthesizerConfig, type="synthesizer_test"): + __test__ = False + + +class TestSynthesizer(BaseSynthesizer[TestSynthesizerConfig]): + """Accepts text and creates a SynthesisResult containing audio data which is the same as the text as bytes.""" + + __test__ = False + + def __init__(self, synthesizer_config: SynthesizerConfig): + super().__init__(synthesizer_config) + + async def create_speech_uncached( + self, + message: BaseMessage, + chunk_size: int, + is_first_text_chunk: bool = False, + is_sole_text_chunk: bool = False, + ) -> SynthesisResult: + return self.create_synthesis_result_from_wav( + synthesizer_config=self.synthesizer_config, + message=message, + chunk_size=chunk_size, + file=create_fake_audio( + message=message.text, synthesizer_config=self.synthesizer_config + ), + ) + + @classmethod + def get_voice_identifier(cls, synthesizer_config: TestSynthesizerConfig) -> str: + return "test_voice" diff --git a/tests/fixtures/transcriber.py b/tests/fixtures/transcriber.py new file mode 100644 index 0000000000..4c1b2e9f49 --- /dev/null +++ b/tests/fixtures/transcriber.py @@ -0,0 +1,24 @@ +import asyncio + +from vocode.streaming.models.transcriber import TranscriberConfig +from vocode.streaming.transcriber.base_transcriber import BaseAsyncTranscriber, Transcription + + +class TestTranscriberConfig(TranscriberConfig, type="transcriber_test"): + __test__ = False + + +class TestAsyncTranscriber(BaseAsyncTranscriber[TestTranscriberConfig]): + """Accepts fake audio chunks and sends out transcriptions which are the same as the audio chunks.""" + + __test__ = False + + async def _run_loop(self): + while True: + try: + audio_chunk = await self._input_queue.get() + self.produce_nonblocking( + Transcription(message=audio_chunk.decode("utf-8"), confidence=1, is_final=True) + ) + except asyncio.CancelledError: + return diff --git a/tests/streaming/agent/test_base_agent.py b/tests/streaming/agent/test_base_agent.py index 9720405793..26519ad141 100644 --- a/tests/streaming/agent/test_base_agent.py +++ b/tests/streaming/agent/test_base_agent.py @@ -19,7 +19,11 @@ from vocode.streaming.models.transcriber import Transcription from vocode.streaming.models.transcript import Transcript from vocode.streaming.utils.state_manager import ConversationStateManager -from vocode.streaming.utils.worker import InterruptibleEvent +from vocode.streaming.utils.worker import ( + InterruptibleAgentResponseEvent, + InterruptibleEvent, + QueueConsumer, +) @pytest.fixture(autouse=True) @@ -51,11 +55,16 @@ def _create_agent( return agent -async def _consume_until_end_of_turn(agent: BaseAgent, timeout: float = 0.1) -> List[AgentResponse]: +async def _consume_until_end_of_turn( + agent_consumer: QueueConsumer[InterruptibleAgentResponseEvent[AgentResponse]], + timeout: float = 0.1, +) -> List[AgentResponse]: agent_responses = [] try: while True: - agent_response = await asyncio.wait_for(agent.output_queue.get(), timeout=timeout) + agent_response = await asyncio.wait_for( + agent_consumer.input_queue.get(), timeout=timeout + ) agent_responses.append(agent_response.payload) if isinstance(agent_response.payload, AgentResponseMessage) and isinstance( agent_response.payload.message, EndOfTurn @@ -127,37 +136,10 @@ async def test_generate_responses(mocker: MockerFixture): agent, Transcription(message="Hello?", confidence=1.0, is_final=True), ) + agent_consumer = QueueConsumer() + agent.agent_responses_consumer = agent_consumer agent.start() - agent_responses = await _consume_until_end_of_turn(agent) - agent.terminate() - - messages = [response.message for response in agent_responses] - - assert messages == [BaseMessage(text="Hi, how are you doing today?"), EndOfTurn()] - - -@pytest.mark.asyncio -async def test_generate_response(mocker: MockerFixture): - agent_config = ChatGPTAgentConfig( - prompt_preamble="Have a pleasant conversation about life", - generate_responses=True, - ) - agent = _create_agent(mocker, agent_config) - _mock_generate_response( - mocker, - agent, - [ - GeneratedResponse( - message=BaseMessage(text="Hi, how are you doing today?"), is_interruptible=True - ) - ], - ) - _send_transcription( - agent, - Transcription(message="Hello?", confidence=1.0, is_final=True), - ) - agent.start() - agent_responses = await _consume_until_end_of_turn(agent) + agent_responses = await _consume_until_end_of_turn(agent_consumer) agent.terminate() messages = [response.message for response in agent_responses] diff --git a/tests/streaming/test_streaming_conversation.py b/tests/streaming/test_streaming_conversation.py index 1d4ef026d6..2266a7e47d 100644 --- a/tests/streaming/test_streaming_conversation.py +++ b/tests/streaming/test_streaming_conversation.py @@ -9,16 +9,23 @@ from tests.fakedata.conversation import ( DEFAULT_CHAT_GPT_AGENT_CONFIG, + DummyOutputDevice, create_fake_agent, create_fake_streaming_conversation, ) +from tests.fixtures.synthesizer import TestSynthesizer, TestSynthesizerConfig +from tests.fixtures.transcriber import TestAsyncTranscriber, TestTranscriberConfig +from vocode.streaming.agent.echo_agent import EchoAgent from vocode.streaming.models.actions import ActionInput -from vocode.streaming.models.agent import InterruptSensitivity +from vocode.streaming.models.agent import EchoAgentConfig, InterruptSensitivity +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.events import Sender +from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.transcriber import Transcription from vocode.streaming.models.transcript import ActionStart, Message, Transcript +from vocode.streaming.streaming_conversation import StreamingConversation from vocode.streaming.synthesizer.base_synthesizer import SynthesisResult -from vocode.streaming.utils.worker import AsyncWorker +from vocode.streaming.utils.worker import QueueConsumer class ShouldIgnoreUtteranceTestCase(BaseModel): @@ -27,9 +34,9 @@ class ShouldIgnoreUtteranceTestCase(BaseModel): expected: bool -async def _consume_worker_output(worker: AsyncWorker, timeout: float = 0.1): +async def _get_from_consumer_queue_if_exists(queue_consumer: QueueConsumer, timeout: float = 0.1): try: - return await asyncio.wait_for(worker.output_queue.get(), timeout=timeout) + return await asyncio.wait_for(queue_consumer.input_queue.get(), timeout=timeout) except asyncio.TimeoutError: return None @@ -174,8 +181,6 @@ def test_should_ignore_utterance( conversation = mocker.MagicMock() transcriptions_worker = StreamingConversation.TranscriptionsWorker( - input_queue=mocker.MagicMock(), - output_queue=mocker.MagicMock(), conversation=conversation, interruptible_event_factory=mocker.MagicMock(), ) @@ -229,9 +234,8 @@ async def test_transcriptions_worker_ignores_utterances_before_initial_message( mocker, ) - streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.start() + transcriptions_worker_consumer = QueueConsumer() + streaming_conversation.transcriptions_worker.consumer = transcriptions_worker_consumer streaming_conversation.transcriptions_worker.consume_nonblocking( Transcription( message="sup", @@ -253,7 +257,8 @@ async def test_transcriptions_worker_ignores_utterances_before_initial_message( is_final=True, ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + streaming_conversation.transcriptions_worker.start() + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert not streaming_conversation.broadcast_interrupt.called streaming_conversation.transcript.add_bot_message( @@ -269,8 +274,8 @@ async def test_transcriptions_worker_ignores_utterances_before_initial_message( ), ) - transcription_agent_input = await _consume_worker_output( - streaming_conversation.transcriptions_worker + transcription_agent_input = await _get_from_consumer_queue_if_exists( + transcriptions_worker_consumer ) assert transcription_agent_input.payload.transcription.message == "hi, who is this?" assert streaming_conversation.broadcast_interrupt.called @@ -293,9 +298,6 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( mocker, ) - streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.start() streaming_conversation.initial_message_tracker.set() streaming_conversation.transcript.add_bot_message( text="Hi, I was wondering", @@ -303,6 +305,10 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( conversation_id="test", ) + transcriptions_worker_consumer = QueueConsumer() + streaming_conversation.transcriptions_worker.consumer = transcriptions_worker_consumer + streaming_conversation.transcriptions_worker.start() + streaming_conversation.transcriptions_worker.consume_nonblocking( Transcription( message="i'm listening", @@ -310,7 +316,8 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( is_final=False, ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert not streaming_conversation.broadcast_interrupt.called # ignored for length of response streaming_conversation.transcript.event_logs[-1].text = ( @@ -325,7 +332,7 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert not streaming_conversation.broadcast_interrupt.called # ignored for length of response streaming_conversation.transcriptions_worker.consume_nonblocking( @@ -336,8 +343,8 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( ), ) - transcription_agent_input = await _consume_worker_output( - streaming_conversation.transcriptions_worker + transcription_agent_input = await _get_from_consumer_queue_if_exists( + transcriptions_worker_consumer ) assert ( transcription_agent_input.payload.transcription.message == "I have not yet gotten a chance." @@ -359,9 +366,6 @@ async def test_transcriptions_worker_interrupts_on_interim_transcripts( mocker, ) - streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.start() streaming_conversation.initial_message_tracker.set() streaming_conversation.transcript.add_bot_message( text="Hi, I was wondering", @@ -369,6 +373,9 @@ async def test_transcriptions_worker_interrupts_on_interim_transcripts( conversation_id="test", ) + transcriptions_worker_consumer = QueueConsumer() + streaming_conversation.transcriptions_worker.consumer = transcriptions_worker_consumer + streaming_conversation.transcriptions_worker.start() streaming_conversation.transcriptions_worker.consume_nonblocking( Transcription( message="Sorry, could you stop", @@ -377,7 +384,7 @@ async def test_transcriptions_worker_interrupts_on_interim_transcripts( ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert streaming_conversation.broadcast_interrupt.called streaming_conversation.transcriptions_worker.consume_nonblocking( @@ -388,8 +395,8 @@ async def test_transcriptions_worker_interrupts_on_interim_transcripts( ), ) - transcription_agent_input = await _consume_worker_output( - streaming_conversation.transcriptions_worker + transcription_agent_input = await _get_from_consumer_queue_if_exists( + transcriptions_worker_consumer ) assert ( transcription_agent_input.payload.transcription.message @@ -409,11 +416,11 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun mocker, ) - streaming_conversation.transcriptions_worker.input_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.output_queue = asyncio.Queue() - streaming_conversation.transcriptions_worker.start() streaming_conversation.initial_message_tracker.set() + transcriptions_worker_consumer = QueueConsumer() + streaming_conversation.transcriptions_worker.consumer = transcriptions_worker_consumer + streaming_conversation.transcriptions_worker.start() streaming_conversation.transcriptions_worker.consume_nonblocking( Transcription( message="Sorry,", @@ -421,7 +428,8 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun is_final=False, ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert streaming_conversation.broadcast_interrupt.called streaming_conversation.transcriptions_worker.consume_nonblocking( @@ -431,8 +439,8 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun is_final=True, ), ) - transcription_agent_input = await _consume_worker_output( - streaming_conversation.transcriptions_worker + transcription_agent_input = await _get_from_consumer_queue_if_exists( + transcriptions_worker_consumer ) assert transcription_agent_input.payload.transcription.message == "Sorry, what?" assert streaming_conversation.broadcast_interrupt.called @@ -449,7 +457,7 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun ), ) - assert await _consume_worker_output(streaming_conversation.transcriptions_worker) is None + assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert streaming_conversation.broadcast_interrupt.called streaming_conversation.transcriptions_worker.terminate() @@ -574,3 +582,31 @@ async def chunk_generator(): assert cut_off assert transcript_message.text != "Hi there" assert not transcript_message.is_final + + +@pytest.mark.asyncio +async def test_streaming_conversation_pipeline( + mocker: MockerFixture, +): + output_device = DummyOutputDevice(sampling_rate=48000, audio_encoding=AudioEncoding.LINEAR16) + streaming_conversation = StreamingConversation( + output_device=output_device, + transcriber=TestAsyncTranscriber( + TestTranscriberConfig( + sampling_rate=48000, + audio_encoding=AudioEncoding.LINEAR16, + chunk_size=480, + ) + ), + agent=EchoAgent( + EchoAgentConfig(initial_message=BaseMessage(text="Hi there")), + ), + synthesizer=TestSynthesizer(TestSynthesizerConfig.from_output_device(output_device)), + ) + await streaming_conversation.start() + await streaming_conversation.initial_message_tracker.wait() + streaming_conversation.receive_audio(b"test") + initial_message_audio_chunk = await output_device.dummy_playback_queue.get() + assert initial_message_audio_chunk.data == b"Hi there" + first_response_audio_chunk = await output_device.dummy_playback_queue.get() + assert first_response_audio_chunk.data == b"test" diff --git a/vocode/streaming/action/worker.py b/vocode/streaming/action/worker.py index 26c51b2406..b256489cba 100644 --- a/vocode/streaming/action/worker.py +++ b/vocode/streaming/action/worker.py @@ -12,6 +12,7 @@ ) from vocode.streaming.utils.state_manager import AbstractConversationStateManager from vocode.streaming.utils.worker import ( + AbstractWorker, InterruptibleEvent, InterruptibleEventFactory, InterruptibleWorker, @@ -19,16 +20,14 @@ class ActionsWorker(InterruptibleWorker): + consumer: AbstractWorker[InterruptibleEvent[ActionResultAgentInput]] + def __init__( self, action_factory: AbstractActionFactory, - input_queue: asyncio.Queue[InterruptibleEvent[ActionInput]], - output_queue: asyncio.Queue[InterruptibleEvent[AgentInput]], interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), ): super().__init__( - input_queue=input_queue, - output_queue=output_queue, interruptible_event_factory=interruptible_event_factory, ) self.action_factory = action_factory @@ -43,22 +42,24 @@ async def process(self, item: InterruptibleEvent[ActionInput]): action = self.action_factory.create_action(action_input.action_config) action.attach_conversation_state_manager(self.conversation_state_manager) action_output = await action.run(action_input) - self.produce_interruptible_event_nonblocking( - ActionResultAgentInput( - conversation_id=action_input.conversation_id, - action_input=action_input, - action_output=action_output, - vonage_uuid=( - action_input.vonage_uuid - if isinstance(action_input, VonagePhoneConversationActionInput) - else None - ), - twilio_sid=( - action_input.twilio_sid - if isinstance(action_input, TwilioPhoneConversationActionInput) - else None + self.consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_event( + ActionResultAgentInput( + conversation_id=action_input.conversation_id, + action_input=action_input, + action_output=action_output, + vonage_uuid=( + action_input.vonage_uuid + if isinstance(action_input, VonagePhoneConversationActionInput) + else None + ), + twilio_sid=( + action_input.twilio_sid + if isinstance(action_input, TwilioPhoneConversationActionInput) + else None + ), + is_quiet=action.quiet, ), - is_quiet=action.quiet, - ), - is_interruptible=False, + is_interruptible=False, + ) ) diff --git a/vocode/streaming/agent/base_agent.py b/vocode/streaming/agent/base_agent.py index f6a56a7e77..7dd5a3fe7e 100644 --- a/vocode/streaming/agent/base_agent.py +++ b/vocode/streaming/agent/base_agent.py @@ -38,6 +38,7 @@ from vocode.streaming.utils import unrepeating_randomizer from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.worker import ( + AbstractWorker, InterruptibleAgentResponseEvent, InterruptibleEvent, InterruptibleEventFactory, @@ -154,6 +155,9 @@ def get_cut_off_response(self) -> str: class BaseAgent(AbstractAgent[AgentConfigType], InterruptibleWorker): + agent_responses_consumer: AbstractWorker[InterruptibleAgentResponseEvent[AgentResponse]] + actions_consumer: Optional[AbstractWorker[InterruptibleEvent[ActionInput]]] + def __init__( self, agent_config: AgentConfigType, @@ -161,18 +165,12 @@ def __init__( interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), ): self.input_queue: asyncio.Queue[InterruptibleEvent[AgentInput]] = asyncio.Queue() - self.output_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]] = ( - asyncio.Queue() - ) AbstractAgent.__init__(self, agent_config=agent_config) InterruptibleWorker.__init__( self, - input_queue=self.input_queue, - output_queue=self.output_queue, interruptible_event_factory=interruptible_event_factory, ) self.action_factory = action_factory - self.actions_queue: asyncio.Queue[InterruptibleEvent[ActionInput]] = asyncio.Queue() self.transcript: Optional[Transcript] = None self.functions = self.get_functions() if self.agent_config.actions else None @@ -211,11 +209,6 @@ def get_input_queue( ) -> asyncio.Queue[InterruptibleEvent[AgentInput]]: return self.input_queue - def get_output_queue( - self, - ) -> asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]]: - return self.output_queue - def is_first_response(self): assert self.transcript is not None @@ -299,14 +292,16 @@ async def handle_generate_response( continue agent_response_tracker = agent_input.agent_response_tracker or asyncio.Event() - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage( - message=generated_response.message, - is_first=is_first_response_of_turn, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage( + message=generated_response.message, + is_first=is_first_response_of_turn, + ), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off + and generated_response.is_interruptible, + agent_response_tracker=agent_response_tracker, ), - is_interruptible=self.agent_config.allow_agent_to_be_cut_off - and generated_response.is_interruptible, - agent_response_tracker=agent_response_tracker, ) if isinstance(generated_response.message, BaseMessage): responses_buffer = f"{responses_buffer} {generated_response.message.text}" @@ -330,14 +325,15 @@ async def handle_generate_response( end_of_turn_agent_response_tracker = ( agent_input.agent_response_tracker or asyncio.Event() ) - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage( - message=EndOfTurn(), - is_first=is_first_response_of_turn, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage( + message=EndOfTurn(), + is_first=is_first_response_of_turn, + ), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + agent_response_tracker=end_of_turn_agent_response_tracker, ), - is_interruptible=self.agent_config.allow_agent_to_be_cut_off - and generated_response.is_interruptible, - agent_response_tracker=end_of_turn_agent_response_tracker, ) phrase_trigger_match = ( @@ -374,13 +370,17 @@ async def handle_respond(self, transcription: Transcription, conversation_id: st response = None return True if response: - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=BaseMessage(text=response)), - is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage(message=BaseMessage(text=response)), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + ) ) - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=EndOfTurn()), - is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage(message=EndOfTurn()), + is_interruptible=self.agent_config.allow_agent_to_be_cut_off, + ) ) return should_stop else: @@ -408,15 +408,19 @@ async def process(self, item: InterruptibleEvent[AgentInput]): logger.debug("Action is quiet, skipping response generation") return if agent_input.action_output.canned_response is not None: - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage( - message=agent_input.action_output.canned_response, - is_sole_text_chunk=True, - ), - is_interruptible=True, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage( + message=agent_input.action_output.canned_response, + is_sole_text_chunk=True, + ), + is_interruptible=True, + ) ) - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=EndOfTurn()), + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage(message=EndOfTurn()), + ) ) return transcription = Transcription( @@ -432,8 +436,10 @@ async def process(self, item: InterruptibleEvent[AgentInput]): return if self.agent_config.send_filler_audio: - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseFillerAudio(), + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseFillerAudio(), + ) ) logger.debug("Responding to transcription") @@ -451,7 +457,11 @@ async def process(self, item: InterruptibleEvent[AgentInput]): if should_stop: logger.debug("Agent requested to stop") - self.produce_interruptible_agent_response_event_nonblocking(AgentResponseStop()) + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseStop(), + ) + ) return except asyncio.CancelledError: pass @@ -478,16 +488,20 @@ async def call_function(self, function_call: FunctionCall, agent_input: AgentInp if "user_message" in params: user_message = params["user_message"] user_message_tracker = asyncio.Event() - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage( - message=BaseMessage(text=user_message), - is_sole_text_chunk=True, - ), - is_interruptible=action.is_interruptible, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage( + message=BaseMessage(text=user_message), + is_sole_text_chunk=True, + ), + is_interruptible=action.is_interruptible, + ) ) - self.produce_interruptible_agent_response_event_nonblocking( - AgentResponseMessage(message=EndOfTurn()), - agent_response_tracker=user_message_tracker, + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseMessage(message=EndOfTurn()), + agent_response_tracker=user_message_tracker, + ) ) action_input = self.create_action_input(action, agent_input, params, user_message_tracker) self.enqueue_action_input(action, action_input, agent_input.conversation_id) @@ -534,6 +548,9 @@ def enqueue_action_input( action_input: ActionInput, conversation_id: str, ): + if self.actions_consumer is None: + logger.warning("No actions consumer attached, skipping action") + return event = self.interruptible_event_factory.create_interruptible_event( action_input, is_interruptible=action.is_interruptible, @@ -543,7 +560,7 @@ def enqueue_action_input( action_input=action_input, conversation_id=conversation_id, ) - self.actions_queue.put_nowait(event) + self.actions_consumer.consume_nonblocking(event) async def respond( self, diff --git a/vocode/streaming/agent/websocket_user_implemented_agent.py b/vocode/streaming/agent/websocket_user_implemented_agent.py index 1a09e199d0..f8233588fb 100644 --- a/vocode/streaming/agent/websocket_user_implemented_agent.py +++ b/vocode/streaming/agent/websocket_user_implemented_agent.py @@ -27,7 +27,6 @@ class WebSocketUserImplementedAgent(BaseAgent[WebSocketUserImplementedAgentConfig]): input_queue: asyncio.Queue[InterruptibleEvent[AgentInput]] - output_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]] def __init__( self, @@ -63,8 +62,11 @@ def _handle_incoming_socket_message(self, message: WebSocketAgentMessage) -> Non raise Exception("Unknown Socket message type") logger.info("Putting interruptible agent response event in output queue") - self.produce_interruptible_agent_response_event_nonblocking( - agent_response, self.get_agent_config().allow_agent_to_be_cut_off + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + agent_response, + is_interruptible=self.get_agent_config().allow_agent_to_be_cut_off, + ) ) async def _process(self) -> None: @@ -137,5 +139,9 @@ async def receiver(ws: WebSocketClientProtocol) -> None: await asyncio.gather(sender(ws), receiver(ws)) def terminate(self): - self.produce_interruptible_agent_response_event_nonblocking(AgentResponseStop()) + self.agent_responses_consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + AgentResponseStop() + ) + ) super().terminate() diff --git a/vocode/streaming/output_device/abstract_output_device.py b/vocode/streaming/output_device/abstract_output_device.py index 985077f638..2137d13216 100644 --- a/vocode/streaming/output_device/abstract_output_device.py +++ b/vocode/streaming/output_device/abstract_output_device.py @@ -16,7 +16,7 @@ class AbstractOutputDevice(AsyncWorker[InterruptibleEvent[AudioChunk]]): """ def __init__(self, sampling_rate: int, audio_encoding: AudioEncoding): - super().__init__(input_queue=asyncio.Queue()) + super().__init__() self.sampling_rate = sampling_rate self.audio_encoding = audio_encoding diff --git a/vocode/streaming/output_device/blocking_speaker_output.py b/vocode/streaming/output_device/blocking_speaker_output.py index d273cb9e0b..4679fb0a72 100644 --- a/vocode/streaming/output_device/blocking_speaker_output.py +++ b/vocode/streaming/output_device/blocking_speaker_output.py @@ -19,8 +19,7 @@ class _PlaybackWorker(ThreadAsyncWorker[bytes]): def __init__(self, *, device_info: dict, sampling_rate: int): self.sampling_rate = sampling_rate self.device_info = device_info - self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() - super().__init__(self.input_queue) + super().__init__() self.stream = sd.OutputStream( channels=1, samplerate=self.sampling_rate, @@ -28,7 +27,7 @@ def __init__(self, *, device_info: dict, sampling_rate: int): device=int(self.device_info["index"]), ) self._ended = False - self.input_queue.put_nowait(self.sampling_rate * b"\x00") + self.consume_nonblocking(self.sampling_rate * b"\x00") self.stream.start() def _run_loop(self): diff --git a/vocode/streaming/output_device/livekit_output_device.py b/vocode/streaming/output_device/livekit_output_device.py index 5a2e1a040f..bfb5dd5d5f 100644 --- a/vocode/streaming/output_device/livekit_output_device.py +++ b/vocode/streaming/output_device/livekit_output_device.py @@ -25,7 +25,7 @@ def __init__( async def _run_loop(self): while True: try: - item = await self.input_queue.get() + item = await self._input_queue.get() except asyncio.CancelledError: return diff --git a/vocode/streaming/output_device/rate_limit_interruptions_output_device.py b/vocode/streaming/output_device/rate_limit_interruptions_output_device.py index 98493b9d8c..b621b213f7 100644 --- a/vocode/streaming/output_device/rate_limit_interruptions_output_device.py +++ b/vocode/streaming/output_device/rate_limit_interruptions_output_device.py @@ -27,7 +27,7 @@ async def _run_loop(self): while True: start_time = time.time() try: - item = await self.input_queue.get() + item = await self._input_queue.get() except asyncio.CancelledError: return diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index 52e862ca6b..f6fc02500c 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -66,11 +66,13 @@ from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.state_manager import ConversationStateManager from vocode.streaming.utils.worker import ( + AbstractWorker, AsyncQueueWorker, InterruptibleAgentResponseEvent, InterruptibleAgentResponseWorker, InterruptibleEvent, InterruptibleEventFactory, + InterruptibleWorker, ) from vocode.utils.sentry_utils import ( CustomSentrySpans, @@ -143,16 +145,14 @@ class TranscriptionsWorker(AsyncQueueWorker[Transcription]): """Processes all transcriptions: sends an interrupt if needed and sends final transcriptions to the output queue""" + consumer: AbstractWorker[InterruptibleEvent[Transcription]] + def __init__( self, - input_queue: asyncio.Queue[Transcription], - output_queue: asyncio.Queue[InterruptibleEvent[AgentInput]], conversation: "StreamingConversation", interruptible_event_factory: InterruptibleEventFactory, ): - super().__init__(input_queue, output_queue) - self.input_queue = input_queue - self.output_queue = output_queue + super().__init__() self.conversation = conversation self.interruptible_event_factory = interruptible_event_factory self.in_interrupt_endpointing_config = False @@ -313,9 +313,9 @@ async def process(self, transcription: Transcription): agent_response_tracker=agent_response_tracker, ), ) - self.output_queue.put_nowait(event) + self.consumer.consume_nonblocking(event) - class FillerAudioWorker(InterruptibleAgentResponseWorker): + class FillerAudioWorker(InterruptibleWorker[InterruptibleAgentResponseEvent[FillerAudio]]): """ - Waits for a configured number of seconds and then sends filler audio to the output - Exposes wait_for_filler_audio_to_finish() which the AgentResponsesWorker waits on before @@ -324,11 +324,9 @@ class FillerAudioWorker(InterruptibleAgentResponseWorker): def __init__( self, - input_queue: asyncio.Queue[InterruptibleAgentResponseEvent[FillerAudio]], conversation: "StreamingConversation", ): - super().__init__(input_queue=input_queue) - self.input_queue = input_queue + super().__init__() self.conversation = conversation self.current_filler_seconds_per_chunk: Optional[int] = None self.filler_audio_started_event: Optional[threading.Event] = None @@ -369,26 +367,21 @@ async def process(self, item: InterruptibleAgentResponseEvent[FillerAudio]): except asyncio.CancelledError: pass - class AgentResponsesWorker(InterruptibleAgentResponseWorker): + class AgentResponsesWorker(InterruptibleWorker[InterruptibleAgentResponseEvent[AgentResponse]]): """Runs Synthesizer.create_speech and sends the SynthesisResult to the output queue""" + consumer: AbstractWorker[ + InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ] + ] + def __init__( self, - input_queue: asyncio.Queue[InterruptibleAgentResponseEvent[AgentResponse]], - output_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[ - Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] - ] - ], conversation: "StreamingConversation", interruptible_event_factory: InterruptibleEventFactory, ): - super().__init__( - input_queue=input_queue, - output_queue=output_queue, - ) - self.input_queue = input_queue - self.output_queue = output_queue + super().__init__() self.conversation = conversation self.interruptible_event_factory = interruptible_event_factory self.chunk_size = self.conversation._get_synthesizer_chunk_size() @@ -437,10 +430,12 @@ async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): logger.debug("Sending end of turn") if isinstance(self.conversation.synthesizer, InputStreamingSynthesizer): await self.conversation.synthesizer.handle_end_of_turn() - self.produce_interruptible_agent_response_event_nonblocking( - (agent_response_message.message, None), - is_interruptible=item.is_interruptible, - agent_response_tracker=item.agent_response_tracker, + self.consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + (agent_response_message.message, None), + is_interruptible=item.is_interruptible, + agent_response_tracker=item.agent_response_tracker, + ), ) self.is_first_text_chunk = True return @@ -507,10 +502,12 @@ async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): if not synthesis_result.cached and synthesis_span: synthesis_result.synthesis_total_span = synthesis_span synthesis_result.ttft_span = ttft_span - self.produce_interruptible_agent_response_event_nonblocking( - (agent_response_message.message, synthesis_result), - is_interruptible=item.is_interruptible, - agent_response_tracker=item.agent_response_tracker, + self.consumer.consume_nonblocking( + self.interruptible_event_factory.create_interruptible_agent_response_event( + (agent_response_message.message, synthesis_result), + is_interruptible=item.is_interruptible, + agent_response_tracker=item.agent_response_tracker, + ), ) self.last_agent_response_tracker = item.agent_response_tracker if not isinstance(agent_response_message.message, SilenceMessage): @@ -518,20 +515,20 @@ async def process(self, item: InterruptibleAgentResponseEvent[AgentResponse]): except asyncio.CancelledError: pass - class SynthesisResultsWorker(InterruptibleAgentResponseWorker): + class SynthesisResultsWorker( + InterruptibleWorker[ + InterruptibleAgentResponseEvent[ + Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] + ] + ] + ): """Plays SynthesisResults from the output queue on the output device""" def __init__( self, - input_queue: asyncio.Queue[ - InterruptibleAgentResponseEvent[ - Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] - ] - ], conversation: "StreamingConversation", ): - super().__init__(input_queue=input_queue) - self.input_queue = input_queue + super().__init__() self.conversation = conversation self.last_transcript_message: Optional[Message] = None @@ -604,49 +601,52 @@ def __init__( self.interruptible_events: queue.Queue[InterruptibleEvent] = queue.Queue() self.interruptible_event_factory = self.QueueingInterruptibleEventFactory(conversation=self) - self.agent.set_interruptible_event_factory(self.interruptible_event_factory) self.synthesis_results_queue: asyncio.Queue[ InterruptibleAgentResponseEvent[ Tuple[Union[BaseMessage, EndOfTurn], Optional[SynthesisResult]] ] ] = asyncio.Queue() - self.filler_audio_queue: asyncio.Queue[InterruptibleAgentResponseEvent[FillerAudio]] = ( - asyncio.Queue() - ) self.state_manager = self.create_state_manager() + + # Transcriptions Worker self.transcriptions_worker = self.TranscriptionsWorker( - input_queue=self.transcriber.output_queue, - output_queue=self.agent.get_input_queue(), conversation=self, interruptible_event_factory=self.interruptible_event_factory, ) + self.transcriber.consumer = self.transcriptions_worker + + # Agent + self.transcriptions_worker.consumer = self.agent + self.agent.set_interruptible_event_factory(self.interruptible_event_factory) self.agent.attach_conversation_state_manager(self.state_manager) + + # Agent Responses Worker self.agent_responses_worker = self.AgentResponsesWorker( - input_queue=self.agent.get_output_queue(), - output_queue=self.synthesis_results_queue, conversation=self, interruptible_event_factory=self.interruptible_event_factory, ) + self.agent.agent_responses_consumer = self.agent_responses_worker + + # Actions Worker self.actions_worker = None if self.agent.get_agent_config().actions: self.actions_worker = ActionsWorker( - input_queue=self.agent.actions_queue, - output_queue=self.agent.get_input_queue(), - interruptible_event_factory=self.interruptible_event_factory, action_factory=self.agent.action_factory, + interruptible_event_factory=self.interruptible_event_factory, ) self.actions_worker.attach_conversation_state_manager(self.state_manager) - self.synthesis_results_worker = self.SynthesisResultsWorker( - input_queue=self.synthesis_results_queue, - conversation=self, - ) + self.actions_worker.consumer = self.agent + self.agent.actions_consumer = self.actions_worker + + # Synthesis Results Worker + self.synthesis_results_worker = self.SynthesisResultsWorker(conversation=self) + self.agent_responses_worker.consumer = self.synthesis_results_worker + + # Filler Audio Worker self.filler_audio_worker = None self.filler_audio_config: Optional[FillerAudioConfig] = None if self.agent.get_agent_config().send_filler_audio: - self.filler_audio_worker = self.FillerAudioWorker( - input_queue=self.filler_audio_queue, - conversation=self, - ) + self.filler_audio_worker = self.FillerAudioWorker(conversation=self) self.speed_coefficient = speed_coefficient self.speed_manager = SpeedManager( diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 2263cc0e2e..8ccd6aad25 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -22,6 +22,7 @@ from vocode.streaming.utils import convert_wav, get_chunk_size_per_second from vocode.streaming.utils.async_requester import AsyncRequestor from vocode.streaming.utils.create_task import asyncio_create_task +from vocode.streaming.utils.worker import QueueConsumer FILLER_PHRASES = [ BaseMessage(text="Um..."), @@ -410,14 +411,12 @@ async def experimental_mp3_streaming_output_generator( response: aiohttp.ClientResponse, chunk_size: int, ) -> AsyncGenerator[SynthesisResult.ChunkResult, None]: - miniaudio_worker_input_queue: asyncio.Queue[Union[bytes, None]] = asyncio.Queue() - miniaudio_worker_output_queue: asyncio.Queue[Tuple[bytes, bool]] = asyncio.Queue() + miniaudio_worker_consumer: QueueConsumer = QueueConsumer() miniaudio_worker = MiniaudioWorker( self.synthesizer_config, chunk_size, - miniaudio_worker_input_queue, - miniaudio_worker_output_queue, ) + miniaudio_worker.consumer = miniaudio_worker_consumer miniaudio_worker.start() stream_reader = response.content @@ -433,7 +432,7 @@ async def send_chunks(): # Await the output queue of the MiniaudioWorker and yield the wav chunks in another loop while True: # Get the wav chunk and the flag from the output queue of the MiniaudioWorker - wav_chunk, is_last = await miniaudio_worker.output_queue.get() + wav_chunk, is_last = await miniaudio_worker_consumer.input_queue.get() if self.synthesizer_config.should_encode_as_wav: wav_chunk = encode_as_wav(wav_chunk, self.synthesizer_config) diff --git a/vocode/streaming/synthesizer/miniaudio_worker.py b/vocode/streaming/synthesizer/miniaudio_worker.py index 92d33adc33..fcba60460b 100644 --- a/vocode/streaming/synthesizer/miniaudio_worker.py +++ b/vocode/streaming/synthesizer/miniaudio_worker.py @@ -10,23 +10,39 @@ from vocode.streaming.models.synthesizer import SynthesizerConfig from vocode.streaming.utils import convert_wav from vocode.streaming.utils.mp3_helper import decode_mp3 -from vocode.streaming.utils.worker import ThreadAsyncWorker +from vocode.streaming.utils.worker import AbstractWorker, ThreadAsyncWorker class MiniaudioWorker(ThreadAsyncWorker[Union[bytes, None]]): + consumer: AbstractWorker[Tuple[bytes, bool]] + def __init__( self, synthesizer_config: SynthesizerConfig, chunk_size: int, - input_queue: asyncio.Queue[Union[bytes, None]], - output_queue: asyncio.Queue[Tuple[bytes, bool]], ) -> None: - super().__init__(input_queue, output_queue) - self.output_queue = output_queue # for typing + super().__init__() self.synthesizer_config = synthesizer_config self.chunk_size = chunk_size self._ended = False + async def run_thread_forwarding(self): + try: + await asyncio.gather( + self._forward_to_thread(), + self._forward_from_thread(), + ) + except asyncio.CancelledError: + return + + async def _forward_from_thread(self): + while True: + try: + chunk, done = await self.output_janus_queue.async_q.get() + self.consumer.consume_nonblocking((chunk, done)) + except asyncio.CancelledError: + break + def _run_loop(self): # tracks the mp3 so far current_mp3_buffer = bytearray() diff --git a/vocode/streaming/telephony/conversation/abstract_phone_conversation.py b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py index 1e3cf4c0ff..cf876a1806 100644 --- a/vocode/streaming/telephony/conversation/abstract_phone_conversation.py +++ b/vocode/streaming/telephony/conversation/abstract_phone_conversation.py @@ -66,12 +66,6 @@ def __init__( events_manager=events_manager, speed_coefficient=speed_coefficient, ) - self.transcriptions_worker = self.TranscriptionsWorker( - input_queue=self.transcriber.output_queue, - output_queue=self.agent.get_input_queue(), - conversation=self, - interruptible_event_factory=self.interruptible_event_factory, - ) self.config_manager = config_manager def attach_ws(self, ws: WebSocket): diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index 47fa12c361..331810e735 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -75,7 +75,7 @@ def send_audio(self, chunk): if ( len(self.buffer) / (2 * self.transcriber_config.sampling_rate) ) >= self.transcriber_config.buffer_size_seconds: - self.input_queue.put_nowait(self.buffer) + self.consume_nonblocking(self.buffer) self.buffer = bytearray() def terminate(self): @@ -106,7 +106,7 @@ async def process(self): async def sender(ws): # sends audio to websocket while not self._ended: try: - data = await asyncio.wait_for(self.input_queue.get(), 5) + data = await asyncio.wait_for(self._input_queue.get(), 5) except asyncio.exceptions.TimeoutError: break num_channels = 1 @@ -133,7 +133,7 @@ async def receiver(ws): is_final = "message_type" in data and data["message_type"] == "FinalTranscript" if "text" in data and data["text"]: - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription( message=data["text"], confidence=data["confidence"], diff --git a/vocode/streaming/transcriber/azure_transcriber.py b/vocode/streaming/transcriber/azure_transcriber.py index c272fdf890..2cc666340f 100644 --- a/vocode/streaming/transcriber/azure_transcriber.py +++ b/vocode/streaming/transcriber/azure_transcriber.py @@ -79,12 +79,12 @@ def recognized_sentence_final(self, evt): op=CustomSentrySpans.LATENCY_OF_CONVERSATION, start_timestamp=datetime.now(tz=timezone.utc), ) - self.output_janus_queue.sync_q.put_nowait( + self.produce_nonblocking( Transcription(message=evt.result.text, confidence=1.0, is_final=True) ) def recognized_sentence_stream(self, evt): - self.output_janus_queue.sync_q.put_nowait( + self.produce_nonblocking( Transcription(message=evt.result.text, confidence=1.0, is_final=False) ) diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index 3e89d23d12..beea852b15 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -8,18 +8,19 @@ from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcriber import TranscriberConfig, Transcription from vocode.streaming.utils.speed_manager import SpeedManager -from vocode.streaming.utils.worker import AsyncWorker, ThreadAsyncWorker +from vocode.streaming.utils.worker import AbstractWorker, AsyncWorker, ThreadAsyncWorker TranscriberConfigType = TypeVar("TranscriberConfigType", bound=TranscriberConfig) -class AbstractTranscriber(Generic[TranscriberConfigType], ABC): +class AbstractTranscriber(Generic[TranscriberConfigType], AbstractWorker[bytes]): + consumer: AbstractWorker[Transcription] + def __init__(self, transcriber_config: TranscriberConfigType): + AbstractWorker.__init__(self) self.transcriber_config = transcriber_config self.is_muted = False self.speed_manager: Optional[SpeedManager] = None - self.input_queue: asyncio.Queue[bytes] = asyncio.Queue() - self.output_queue: asyncio.Queue[Transcription] = asyncio.Queue() def attach_speed_manager(self, speed_manager: SpeedManager): self.speed_manager = speed_manager @@ -47,12 +48,15 @@ def create_silent_chunk(self, chunk_size, sample_width=2): async def _run_loop(self): pass - def send_audio(self, chunk): + def send_audio(self, chunk: bytes): if not self.is_muted: self.consume_nonblocking(chunk) else: self.consume_nonblocking(self.create_silent_chunk(len(chunk))) + def produce_nonblocking(self, item: Transcription): + self.consumer.consume_nonblocking(item) + @abstractmethod def terminate(self): pass @@ -61,7 +65,7 @@ def terminate(self): class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker[bytes]): # type: ignore def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) - AsyncWorker.__init__(self, self.input_queue, self.output_queue) + AsyncWorker.__init__(self) def terminate(self): AsyncWorker.terminate(self) @@ -72,11 +76,31 @@ class BaseThreadAsyncTranscriber( # type: ignore ): def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) - ThreadAsyncWorker.__init__(self, self.input_queue, self.output_queue) + ThreadAsyncWorker.__init__(self) def _run_loop(self): raise NotImplementedError + async def run_thread_forwarding(self): + try: + await asyncio.gather( + self._forward_to_thread(), + self._forward_from_thread(), + ) + except asyncio.CancelledError: + return + + async def _forward_from_thread(self): + while True: + try: + transcription = await self.output_janus_queue.async_q.get() + self.consumer.consume_nonblocking(transcription) + except asyncio.CancelledError: + break + + def produce_nonblocking(self, item: Transcription): + self.output_janus_queue.sync_q.put_nowait(item) + def terminate(self): ThreadAsyncWorker.terminate(self) diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index eef281d58c..4835d9646e 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -190,7 +190,7 @@ def terminate(self): }, ) terminate_msg = json.dumps({"type": "CloseStream"}).encode("utf-8") - self.input_queue.put_nowait(terminate_msg) + self.consume_nonblocking(terminate_msg) # todo (dow-107): typing self._ended = True super().terminate() @@ -404,7 +404,7 @@ async def sender( while not self._ended: try: - data = await asyncio.wait_for(self.input_queue.get(), 5) + data = await asyncio.wait_for(self._input_queue.get(), 5) except asyncio.exceptions.TimeoutError: break @@ -485,7 +485,7 @@ async def receiver(ws: WebSocketClientProtocol): is_final_ts=is_final_ts, output_ts=output_ts, ) - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription( message=buffer, confidence=buffer_avg_confidence, @@ -513,7 +513,7 @@ async def receiver(ws: WebSocketClientProtocol): else: interim_message = buffer - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription( message=interim_message, confidence=deepgram_response.top_choice.confidence, diff --git a/vocode/streaming/transcriber/gladia_transcriber.py b/vocode/streaming/transcriber/gladia_transcriber.py index 54366035a1..1cd8f32b0a 100644 --- a/vocode/streaming/transcriber/gladia_transcriber.py +++ b/vocode/streaming/transcriber/gladia_transcriber.py @@ -53,7 +53,7 @@ def send_audio(self, chunk): if ( len(self.buffer) / (2 * self.transcriber_config.sampling_rate) ) >= self.transcriber_config.buffer_size_seconds: - self.input_queue.put_nowait(self.buffer) + self.consume_nonblocking(self.buffer) self.buffer = bytearray() def terminate(self): @@ -75,7 +75,7 @@ async def process(self): async def sender(ws): while not self._ended: try: - data = await asyncio.wait_for(self.input_queue.get(), 5) + data = await asyncio.wait_for(self._input_queue.get(), 5) except asyncio.exceptions.TimeoutError: break @@ -104,7 +104,7 @@ async def receiver(ws): is_final = data["type"] == "final" if "transcription" in data and data["transcription"]: - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription( message=data["transcription"], confidence=data["confidence"], diff --git a/vocode/streaming/transcriber/google_transcriber.py b/vocode/streaming/transcriber/google_transcriber.py index 5f3da9a68d..97c2c34b56 100644 --- a/vocode/streaming/transcriber/google_transcriber.py +++ b/vocode/streaming/transcriber/google_transcriber.py @@ -80,7 +80,7 @@ def _on_response(self, response): message = top_choice.transcript confidence = top_choice.confidence - self.output_janus_queue.sync_q.put_nowait( + self.produce_nonblocking( Transcription(message=message, confidence=confidence, is_final=result.is_final) ) diff --git a/vocode/streaming/transcriber/rev_ai_transcriber.py b/vocode/streaming/transcriber/rev_ai_transcriber.py index 8567686959..0684f3dce6 100644 --- a/vocode/streaming/transcriber/rev_ai_transcriber.py +++ b/vocode/streaming/transcriber/rev_ai_transcriber.py @@ -74,7 +74,7 @@ async def process(self): async def sender(ws: WebSocketClientProtocol): while not self.closed: try: - data = await asyncio.wait_for(self.input_queue.get(), 5) + data = await asyncio.wait_for(self._input_queue.get(), 5) except asyncio.exceptions.TimeoutError: break await ws.send(data) @@ -118,12 +118,12 @@ async def receiver(ws: WebSocketClientProtocol): confidence = 1.0 if is_done: - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription(message=buffer, confidence=confidence, is_final=True) ) buffer = "" else: - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription( message=buffer, confidence=confidence, @@ -137,5 +137,5 @@ async def receiver(ws: WebSocketClientProtocol): def terminate(self): terminate_msg = json.dumps({"type": "CloseStream"}) - self.input_queue.put_nowait(terminate_msg) + self.consume_nonblocking(terminate_msg) self.closed = True diff --git a/vocode/streaming/transcriber/whisper_cpp_transcriber.py b/vocode/streaming/transcriber/whisper_cpp_transcriber.py index 6f1967de56..c12c6333c3 100644 --- a/vocode/streaming/transcriber/whisper_cpp_transcriber.py +++ b/vocode/streaming/transcriber/whisper_cpp_transcriber.py @@ -72,7 +72,7 @@ def _run_loop(self): message_buffer += message is_final = any(message_buffer.endswith(ending) for ending in SENTENCE_ENDINGS) in_memory_wav, audio_buffer = self.create_new_buffer() - self.output_queue.put_nowait( + self.produce_nonblocking( Transcription(message=message_buffer, confidence=confidence, is_final=is_final) ) if is_final: diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index d2552fb0d5..d321ea193d 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -2,7 +2,8 @@ import asyncio import threading -from typing import Any, Generic, Optional, TypeVar +from abc import ABC, abstractmethod +from typing import Any, Dict, Generic, List, Optional, TypeVar import janus from loguru import logger @@ -12,15 +13,44 @@ WorkerInputType = TypeVar("WorkerInputType") -class AsyncWorker(Generic[WorkerInputType]): +class AbstractWorker(Generic[WorkerInputType], ABC): + """ + A generic processor - knows only how to consume typed items. + In order for a worker to process items, clients must invoke start() and tear down with terminate() + """ + + @abstractmethod + def start(self): + raise NotImplementedError + + @abstractmethod + def consume_nonblocking(self, item: WorkerInputType): + raise NotImplementedError + + def terminate(self): + pass + + +class QueueConsumer(AbstractWorker[WorkerInputType]): + def __init__( + self, + input_queue: Optional[asyncio.Queue[WorkerInputType]] = None, + ) -> None: + self.input_queue: asyncio.Queue[WorkerInputType] = input_queue or asyncio.Queue() + + def consume_nonblocking(self, item: WorkerInputType): + self.input_queue.put_nowait(item) + + def start(self): + pass + + +class AsyncWorker(AbstractWorker[WorkerInputType]): def __init__( self, - input_queue: asyncio.Queue[WorkerInputType], - output_queue: asyncio.Queue = asyncio.Queue(), ) -> None: self.worker_task: Optional[asyncio.Task] = None - self.input_queue = input_queue - self.output_queue = output_queue + self._input_queue: asyncio.Queue[WorkerInputType] = asyncio.Queue() def start(self) -> asyncio.Task: self.worker_task = asyncio_create_task( @@ -31,10 +61,7 @@ def start(self) -> asyncio.Task: return self.worker_task def consume_nonblocking(self, item: WorkerInputType): - self.input_queue.put_nowait(item) - - def produce_nonblocking(self, item): - self.output_queue.put_nowait(item) + self._input_queue.put_nowait(item) async def _run_loop(self): raise NotImplementedError @@ -49,10 +76,8 @@ def terminate(self): class ThreadAsyncWorker(AsyncWorker[WorkerInputType]): def __init__( self, - input_queue: asyncio.Queue[WorkerInputType], - output_queue: asyncio.Queue = asyncio.Queue(), ) -> None: - super().__init__(input_queue, output_queue) + super().__init__() self.worker_thread: Optional[threading.Thread] = None self.input_janus_queue: janus.Queue[WorkerInputType] = janus.Queue() self.output_janus_queue: janus.Queue = janus.Queue() @@ -69,35 +94,24 @@ def start(self) -> asyncio.Task: async def run_thread_forwarding(self): try: - await asyncio.gather( - self._forward_to_thread(), - self._forward_from_thead(), - ) + await self._forward_to_thread() except asyncio.CancelledError: return async def _forward_to_thread(self): while True: - item = await self.input_queue.get() + item = await self._input_queue.get() self.input_janus_queue.async_q.put_nowait(item) - async def _forward_from_thead(self): - while True: - item = await self.output_janus_queue.async_q.get() - self.output_queue.put_nowait(item) - def _run_loop(self): raise NotImplementedError - def terminate(self): - return super().terminate() - class AsyncQueueWorker(AsyncWorker[WorkerInputType]): async def _run_loop(self): while True: try: - item = await self.input_queue.get() + item = await self._input_queue.get() await self.process(item) except asyncio.CancelledError: return @@ -180,44 +194,20 @@ def create_interruptible_agent_response_event( class InterruptibleWorker(AsyncWorker[InterruptibleEventType]): def __init__( self, - input_queue: asyncio.Queue[InterruptibleEventType], - output_queue: asyncio.Queue = asyncio.Queue(), interruptible_event_factory: InterruptibleEventFactory = InterruptibleEventFactory(), max_concurrency=2, ) -> None: - super().__init__(input_queue, output_queue) - self.input_queue = input_queue + super().__init__() self.max_concurrency = max_concurrency self.interruptible_event_factory = interruptible_event_factory self.current_task = None self.interruptible_event = None - def produce_interruptible_event_nonblocking(self, item: Any, is_interruptible: bool = True): - interruptible_event = self.interruptible_event_factory.create_interruptible_event( - item, is_interruptible=is_interruptible - ) - return super().produce_nonblocking(interruptible_event) - - def produce_interruptible_agent_response_event_nonblocking( - self, - item: Any, - is_interruptible: bool = True, - agent_response_tracker: Optional[asyncio.Event] = None, - ): - interruptible_utterance_event = ( - self.interruptible_event_factory.create_interruptible_agent_response_event( - item, - is_interruptible=is_interruptible, - agent_response_tracker=agent_response_tracker or asyncio.Event(), - ) - ) - return super().produce_nonblocking(interruptible_utterance_event) - async def _run_loop(self): # TODO Implement concurrency with max_nb_of_thread while True: try: - item = await self.input_queue.get() + item = await self._input_queue.get() except asyncio.CancelledError: return From 6b419417b652d054ca39379cc60f5aeb44afa303 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 5 Jul 2024 20:20:28 -0700 Subject: [PATCH 115/148] create scripts for vocodehq-public (#615) * add script used to make PR * adds test target for vocodehq-public --- .github/workflows/test.yml | 100 ++++++++++++++++++------------------- pull_core_into_upstream.sh | 27 ++++++++++ 2 files changed, 77 insertions(+), 50 deletions(-) create mode 100755 pull_core_into_upstream.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7793ca8d4a..357bd7ea7a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: push: branches: [main] pull_request: - branches: [main, vocode-core-0.1.0] + branches: [main, vocode-core-0.1.0, vocodehq-public] env: poetry-version: "1.8.3" @@ -15,78 +15,78 @@ jobs: fail-fast: false matrix: python-version: - - "3.10" - - "3.11" + - "3.10" + - "3.11" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Install ffmpeg - run: | - sudo apt-get update - sudo apt-get install -y ffmpeg + - name: Install ffmpeg + run: | + sudo apt-get update + sudo apt-get install -y ffmpeg - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} - - name: Set up Poetry - uses: abatilo/actions-poetry@v3.0.0 - with: - poetry-version: ${{ env.poetry-version }} + - name: Set up Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: ${{ env.poetry-version }} - - name: Install dependencies - run: poetry install -E all + - name: Install dependencies + run: poetry install -E all - - name: Run mypy - run: | - poetry run mypy -p vocode - poetry run mypy -p quickstarts - poetry run mypy -p playground + - name: Run mypy + run: | + poetry run mypy -p vocode + poetry run mypy -p quickstarts + poetry run mypy -p playground - - name: Run black - if: success() || failure() - run: poetry run black --check . + - name: Run black + if: success() || failure() + run: poetry run black --check . - - name: Run isort - shell: bash - if: success() || failure() - run: poetry run isort --check . + - name: Run isort + shell: bash + if: success() || failure() + run: poetry run isort --check . pytest: strategy: fail-fast: false matrix: python-version: - - "3.10" - - "3.11" + - "3.10" + - "3.11" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Install ffmpeg - run: | - sudo apt-get update - sudo apt-get install -y ffmpeg + - name: Install ffmpeg + run: | + sudo apt-get update + sudo apt-get install -y ffmpeg - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} - - name: Set up Poetry - uses: abatilo/actions-poetry@v3.0.0 - with: - poetry-version: ${{ env.poetry-version }} + - name: Set up Poetry + uses: abatilo/actions-poetry@v3.0.0 + with: + poetry-version: ${{ env.poetry-version }} - - name: Install dependencies - run: poetry install -E all + - name: Install dependencies + run: poetry install -E all - - name: Test with pytest - run: | - poetry run pytest -v tests + - name: Test with pytest + run: | + poetry run pytest -v tests diff --git a/pull_core_into_upstream.sh b/pull_core_into_upstream.sh new file mode 100755 index 0000000000..10c35d5770 --- /dev/null +++ b/pull_core_into_upstream.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# if gh is not installed, raise an error +if ! command -v gh >/dev/null 2>&1 +then + echo "gh could not be found" + echo "Please install gh, e.g. 'brew install gh'" + exit 1 +fi + +SUBMODULE_BRANCH="vocodehq-public" + +USER=$(gh api user | jq -r '.login') +DATE=$(date +%Y%m%d%H%M%S) +FEATURE_BRANCH="${USER}/update-${SUBMODULE_BRANCH}-${DATE}" +PR_TITLE="Update ${SUBMODULE_BRANCH}" +PR_BODY="This PR updates the ${SUBMODULE_BRANCH} branch by merging changes from the main branch." + +echo "Creating a new branch ${FEATURE_BRANCH}" + +git checkout main +git pull origin main +git pull origin ${SUBMODULE_BRANCH} +git checkout ${SUBMODULE_BRANCH} +git checkout -b ${FEATURE_BRANCH} +git merge main +gh pr create -t "${PR_TITLE}" -b "${PR_BODY}" -B ${SUBMODULE_BRANCH} From 65983240496067c9851cf43c8b75a6ba9b33bc1d Mon Sep 17 00:00:00 2001 From: rjheeta Date: Mon, 8 Jul 2024 13:25:24 -0400 Subject: [PATCH 116/148] Fix action worker twilio sid capture (#619) * adjust ActionWorker.process to read twilio & vonage IDs from the convo state manager * fixed formatting for linter --- vocode/streaming/action/worker.py | 22 +++++++++++++--------- vocode/streaming/utils/state_manager.py | 6 ++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/vocode/streaming/action/worker.py b/vocode/streaming/action/worker.py index b256489cba..3c9fda74f1 100644 --- a/vocode/streaming/action/worker.py +++ b/vocode/streaming/action/worker.py @@ -5,12 +5,12 @@ from vocode.streaming.action.abstract_factory import AbstractActionFactory from vocode.streaming.action.default_factory import DefaultActionFactory from vocode.streaming.agent.base_agent import ActionResultAgentInput, AgentInput -from vocode.streaming.models.actions import ( - ActionInput, - TwilioPhoneConversationActionInput, - VonagePhoneConversationActionInput, +from vocode.streaming.models.actions import ActionInput +from vocode.streaming.utils.state_manager import ( + AbstractConversationStateManager, + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, ) -from vocode.streaming.utils.state_manager import AbstractConversationStateManager from vocode.streaming.utils.worker import ( AbstractWorker, InterruptibleEvent, @@ -49,13 +49,17 @@ async def process(self, item: InterruptibleEvent[ActionInput]): action_input=action_input, action_output=action_output, vonage_uuid=( - action_input.vonage_uuid - if isinstance(action_input, VonagePhoneConversationActionInput) + self.conversation_state_manager.get_vonage_uuid() + if isinstance( + self.conversation_state_manager, VonagePhoneConversationStateManager + ) else None ), twilio_sid=( - action_input.twilio_sid - if isinstance(action_input, TwilioPhoneConversationActionInput) + self.conversation_state_manager.get_twilio_sid() + if isinstance( + self.conversation_state_manager, TwilioPhoneConversationStateManager + ) else None ), is_quiet=action.quiet, diff --git a/vocode/streaming/utils/state_manager.py b/vocode/streaming/utils/state_manager.py index b67eb1bd20..c439bc30e2 100644 --- a/vocode/streaming/utils/state_manager.py +++ b/vocode/streaming/utils/state_manager.py @@ -142,6 +142,9 @@ def __init__(self, conversation: "VonagePhoneConversation"): super().__init__(conversation=conversation) self._vonage_phone_conversation = conversation + def get_vonage_uuid(self): + return self._vonage_phone_conversation.vonage_uuid + def create_vonage_client(self): return VonageClient( base_url=self._vonage_phone_conversation.base_url, @@ -157,6 +160,9 @@ def __init__(self, conversation: "TwilioPhoneConversation"): def get_twilio_config(self): return self._twilio_phone_conversation.twilio_config + def get_twilio_sid(self): + return self._twilio_phone_conversation.twilio_sid + def create_twilio_client(self): return TwilioClient( base_url=self._twilio_phone_conversation.base_url, From 6198f7b2c2a1bdc64d417819216eaeda4e2a820b Mon Sep 17 00:00:00 2001 From: Kian Hooshmand Date: Mon, 8 Jul 2024 16:52:32 -0700 Subject: [PATCH 117/148] add livekit docs (#621) * add livekit docs * update image * finishing touch * undo pyproject change * Update docs/open-source/livekit-webrtc.mdx Co-authored-by: Ajay Raj * Update docs/open-source/livekit-webrtc.mdx Co-authored-by: Ajay Raj * add .env example * Update docs/open-source/livekit-webrtc.mdx * Update docs/open-source/livekit-webrtc.mdx * Update docs/open-source/livekit-webrtc.mdx * title change --------- Co-authored-by: Ajay Raj --- apps/livekit/.env.example | 6 ++++ docs/images/livekit_keys.png | Bin 0 -> 38926 bytes docs/mint.json | 1 + docs/open-source/livekit-webrtc.mdx | 45 ++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 apps/livekit/.env.example create mode 100644 docs/images/livekit_keys.png create mode 100644 docs/open-source/livekit-webrtc.mdx diff --git a/apps/livekit/.env.example b/apps/livekit/.env.example new file mode 100644 index 0000000000..fe31a9d9b4 --- /dev/null +++ b/apps/livekit/.env.example @@ -0,0 +1,6 @@ +LIVEKIT_API_KEY=your_livekit_api_key +LIVEKIT_API_SECRET=your_livekit_api_secret +LIVEKIT_WS_URL=your_livekit_ws_url +OPENAI_API_KEY=your_openai_api_key +DEEPGRAM_API_KEY=your_deepgram_api_key +ELEVENLABS_API_KEY=your_elevenlabs_api_key \ No newline at end of file diff --git a/docs/images/livekit_keys.png b/docs/images/livekit_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..d22eae27b45522c5071bd20f83d026ec2f1a92fe GIT binary patch literal 38926 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 literal 0 HcmV?d00001 diff --git a/docs/mint.json b/docs/mint.json index 36e5f60e54..6d661923af 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -65,6 +65,7 @@ "open-source/python-quickstart", "open-source/react-quickstart", "open-source/telephony", + "open-source/livekit-webrtc", "open-source/turn-based-conversation" ] }, diff --git a/docs/open-source/livekit-webrtc.mdx b/docs/open-source/livekit-webrtc.mdx new file mode 100644 index 0000000000..d2409300fb --- /dev/null +++ b/docs/open-source/livekit-webrtc.mdx @@ -0,0 +1,45 @@ +--- +title: "Using WebRTC with LiveKit" +description: "Deploy your Vocode Agents using WebRTC" +--- + +# Overview + +[WebRTC](https://webrtc.org/) is an alternative to websockets for real-time P2P communication. Vocode Agents are compatible with both WebRTC and websockets, enabling developers to pick +the stack best suited for their application. + +To connect Vocode agents to WebRTC, Vocode uses [LiveKit](https://livekit.io/)–an open source platform for building on WebRTC. For a background on how LiveKit +works, please see their [documentation](https://docs.livekit.io/home/get-started/intro-to-livekit/). + +In this guide, we'll be walking through how to connect a Vocode Agent to the [LiveKit Agents Playground](https://agents-playground.livekit.io/). + +# Walkthrough: hooking up a Vocode Agent to a LiveKit Room + +## Setting up your LiveKit Server + +First, you'll want to set up a LiveKit Server for your Agent. For simplicity, we are using LiveKit's hosted offering–but it can also be self hosted, since LiveKit is open source! + +In our LiveKit dashboard, we first generate our websocket URL, API key, and Secret Key. + +![Setup](/images/livekit_keys.png) + +## Deploying your Vocode agent to a LiveKit Room + +Once you have your LiveKit Server credentials, we can hook it up to Vocode via the `LiveKitConversation` abstraction. Using the starter code in +[vocode-core/apps/livekit/app.py](https://github.com/vocodedev/vocode-core/blob/main/apps/livekit/app.py), you can quickly deploy a Vocode Agent to accept +new job requests. + +Fill in your credentials in `.env`: + +```bash + +LIVEKIT_SERVER_URL=wss://your-livekit-ws-url.livekit.cloud +LIVEKIT_API_KEY="KEY" +LIVEKIT_API_SECRET="SECRET" +``` + +Followed by +`poetry run python app.py dev` + +And now you can connect to the [Agents Playground](https://agents-playground.livekit.io/) to interact with your agent. With LiveKit, you can connect Vocode +agents to any web application and leverage their [React Component](https://docs.livekit.io/reference/components/react/) library. From 18761bb862f66cf8bda04724ee3d3ba319e7a98a Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Mon, 8 Jul 2024 18:19:05 -0700 Subject: [PATCH 118/148] phrase trigger matcher returns agent config instead of type (#622) --- vocode/streaming/agent/base_agent.py | 8 +++----- vocode/streaming/agent/phrase_trigger.py | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/vocode/streaming/agent/base_agent.py b/vocode/streaming/agent/base_agent.py index 7dd5a3fe7e..eb16e638cf 100644 --- a/vocode/streaming/agent/base_agent.py +++ b/vocode/streaming/agent/base_agent.py @@ -336,15 +336,13 @@ async def handle_generate_response( ), ) - phrase_trigger_match = ( + phrase_trigger_match_action_config = ( matches_phrase_trigger(responses_buffer, self.agent_config.actions) if self.agent_config.actions else None ) - if phrase_trigger_match: - action_config = self._get_action_config(phrase_trigger_match) - assert action_config is not None - action = self.action_factory.create_action(action_config) + if phrase_trigger_match_action_config: + action = self.action_factory.create_action(phrase_trigger_match_action_config) action_input = self.create_action_input( action, agent_input, diff --git a/vocode/streaming/agent/phrase_trigger.py b/vocode/streaming/agent/phrase_trigger.py index 0d9587f77f..fb106fb45b 100644 --- a/vocode/streaming/agent/phrase_trigger.py +++ b/vocode/streaming/agent/phrase_trigger.py @@ -7,7 +7,7 @@ def matches_phrase_trigger( message: str, action_configs: List[ActionConfig], -) -> Optional[str]: +) -> Optional[ActionConfig]: cleaned = re.sub(r"[^\w\s]", "", message.lower()) for action_config in action_configs: if not isinstance(action_config.action_trigger, PhraseBasedActionTrigger): @@ -17,5 +17,5 @@ def matches_phrase_trigger( lowered = phrase_trigger.phrase.lower() for condition in phrase_trigger.conditions: if condition == "phrase_condition_type_contains" and lowered in cleaned: - return action_config.type + return action_config return None From 48cba3eb3594c93c6bd06734c30c8560d6885a44 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Tue, 9 Jul 2024 15:26:17 -0700 Subject: [PATCH 119/148] adds twilio dtmf action (#623) * adds twilio dtmf * make it work * move onus of audio encoding into utils * adds tests * adds log for pressing buttons * adds test for dtmftonegenerator * fix types * change response message * change while condition --- tests/streaming/action/test_dtmf.py | 85 ++++++++++++++++++- .../test_twilio_output_device.py | 16 ++++ vocode/streaming/action/dtmf.py | 29 ++++++- .../output_device/twilio_output_device.py | 19 ++++- vocode/streaming/utils/dtmf_utils.py | 65 ++++++++++++++ 5 files changed, 205 insertions(+), 9 deletions(-) create mode 100644 vocode/streaming/utils/dtmf_utils.py diff --git a/tests/streaming/action/test_dtmf.py b/tests/streaming/action/test_dtmf.py index 24050c0525..026779c0a3 100644 --- a/tests/streaming/action/test_dtmf.py +++ b/tests/streaming/action/test_dtmf.py @@ -1,5 +1,10 @@ +import asyncio +import base64 +import json + import pytest from aioresponses import aioresponses +from pytest_mock import MockerFixture from tests.fakedata.id import generate_uuid from vocode.streaming.action.dtmf import ( @@ -12,9 +17,15 @@ TwilioPhoneConversationActionInput, VonagePhoneConversationActionInput, ) +from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.telephony import VonageConfig +from vocode.streaming.output_device.twilio_output_device import TwilioOutputDevice from vocode.streaming.utils import create_conversation_id -from vocode.streaming.utils.state_manager import VonagePhoneConversationStateManager +from vocode.streaming.utils.dtmf_utils import DTMFToneGenerator +from vocode.streaming.utils.state_manager import ( + TwilioPhoneConversationStateManager, + VonagePhoneConversationStateManager, +) @pytest.mark.asyncio @@ -59,12 +70,79 @@ async def test_vonage_dtmf_press_digits(mocker, mock_env): assert action_output.response.success is True +@pytest.fixture +def mock_twilio_output_device(mocker: MockerFixture): + output_device = TwilioOutputDevice() + output_device.ws = mocker.AsyncMock() + output_device.stream_sid = "stream_sid" + return output_device + + +@pytest.fixture +def mock_twilio_phone_conversation( + mocker: MockerFixture, mock_twilio_output_device: TwilioOutputDevice +): + twilio_phone_conversation_mock = mocker.MagicMock() + twilio_phone_conversation_mock.output_device = mock_twilio_output_device + return twilio_phone_conversation_mock + + @pytest.mark.asyncio -async def test_twilio_dtmf_press_digits(mocker, mock_env): +async def test_twilio_dtmf_press_digits( + mocker, mock_env, mock_twilio_phone_conversation, mock_twilio_output_device: TwilioOutputDevice +): action = TwilioDTMF(action_config=DTMFVocodeActionConfig()) digits = "1234" twilio_sid = "twilio_sid" + action.attach_conversation_state_manager( + TwilioPhoneConversationStateManager(mock_twilio_phone_conversation) + ) + + action_output = await action.run( + action_input=TwilioPhoneConversationActionInput( + action_config=DTMFVocodeActionConfig(), + conversation_id=create_conversation_id(), + params=DTMFParameters(buttons=digits), + twilio_sid=twilio_sid, + ) + ) + + mock_twilio_output_device.start() + max_wait_seconds = 1 + waited_seconds = 0 + while mock_twilio_output_device.ws.send_text.call_count < len(digits): + await asyncio.sleep(0.1) + waited_seconds += 0.1 + if waited_seconds > max_wait_seconds: + assert False, "Timed out waiting for DTMF tones to be sent" + + assert action_output.response.success + mock_twilio_output_device.terminate() + + for digit, call in zip(digits, mock_twilio_output_device.ws.send_text.call_args_list): + expected_dtmf = DTMFToneGenerator().generate( + digit, sampling_rate=8000, audio_encoding=AudioEncoding.MULAW + ) + media_message = json.loads(call[0][0]) + assert media_message["streamSid"] == mock_twilio_output_device.stream_sid + assert media_message["media"] == { + "payload": base64.b64encode(expected_dtmf).decode("utf-8") + } + + +@pytest.mark.asyncio +async def test_twilio_dtmf_failure( + mocker, mock_env, mock_twilio_phone_conversation, mock_twilio_output_device: TwilioOutputDevice +): + action = TwilioDTMF(action_config=DTMFVocodeActionConfig()) + digits = "****" + twilio_sid = "twilio_sid" + + action.attach_conversation_state_manager( + TwilioPhoneConversationStateManager(mock_twilio_phone_conversation) + ) + action_output = await action.run( action_input=TwilioPhoneConversationActionInput( action_config=DTMFVocodeActionConfig(), @@ -74,4 +152,5 @@ async def test_twilio_dtmf_press_digits(mocker, mock_env): ) ) - assert action_output.response.success is False # Twilio does not support DTMF + assert not action_output.response.success + assert action_output.response.message == "Invalid DTMF buttons, can only accept 0-9" diff --git a/tests/streaming/output_device/test_twilio_output_device.py b/tests/streaming/output_device/test_twilio_output_device.py index a2c4ca3e52..e8cd69f3d5 100644 --- a/tests/streaming/output_device/test_twilio_output_device.py +++ b/tests/streaming/output_device/test_twilio_output_device.py @@ -10,6 +10,8 @@ ChunkFinishedMarkMessage, TwilioOutputDevice, ) +from vocode.streaming.utils.dtmf_utils import DTMFToneGenerator, KeypadEntry +from vocode.streaming.utils.singleton import SingletonMeta from vocode.streaming.utils.worker import InterruptibleEvent @@ -137,3 +139,17 @@ def on_interrupt(): assert audio_chunk.state == ChunkState.INTERRUPTED twilio_output_device.ws.send_text.assert_not_called() + + +def test_dtmf_tone_generator_caches( + twilio_output_device: TwilioOutputDevice, mocker: MockerFixture +): + del SingletonMeta._instances[DTMFToneGenerator] + lin2ulaw_mock = mocker.patch( + "audioop.lin2ulaw", + return_value=b"ulaw_encoded", + ) + + twilio_output_device.send_dtmf_tones([KeypadEntry.ONE, KeypadEntry.ONE]) + + lin2ulaw_mock.assert_called_once() diff --git a/vocode/streaming/action/dtmf.py b/vocode/streaming/action/dtmf.py index 392b8eef6c..33c3a23db3 100644 --- a/vocode/streaming/action/dtmf.py +++ b/vocode/streaming/action/dtmf.py @@ -1,4 +1,4 @@ -from typing import Type +from typing import List, Optional, Type from loguru import logger from pydantic.v1 import BaseModel, Field @@ -9,6 +9,7 @@ ) from vocode.streaming.models.actions import ActionConfig as VocodeActionConfig from vocode.streaming.models.actions import ActionInput, ActionOutput +from vocode.streaming.utils.dtmf_utils import DTMFToneGenerator, KeypadEntry from vocode.streaming.utils.state_manager import ( TwilioPhoneConversationStateManager, VonagePhoneConversationStateManager, @@ -21,6 +22,7 @@ class DTMFParameters(BaseModel): class DTMFResponse(BaseModel): success: bool + message: Optional[str] = None class DTMFVocodeActionConfig(VocodeActionConfig, type="action_dtmf"): # type: ignore @@ -31,7 +33,12 @@ def action_attempt_to_string(self, input: ActionInput) -> str: def action_result_to_string(self, input: ActionInput, output: ActionOutput) -> str: assert isinstance(input.params, DTMFParameters) assert isinstance(output.response, DTMFResponse) - return f"Pressed numbers {list(input.params.buttons)} successfully" + if output.response.success: + return f"Pressed numbers {list(input.params.buttons)} successfully" + else: + return ( + f"Failed to press numbers {list(input.params.buttons)}: {output.response.message}" + ) FUNCTION_DESCRIPTION = "Presses a string numbers using DTMF tones." @@ -76,8 +83,22 @@ def __init__(self, action_config: DTMFVocodeActionConfig): ) async def run(self, action_input: ActionInput[DTMFParameters]) -> ActionOutput[DTMFResponse]: - logger.error("DTMF not yet supported with Twilio") + buttons = action_input.params.buttons + keypad_entries: List[KeypadEntry] + try: + keypad_entries = [KeypadEntry(button) for button in buttons] + except ValueError: + logger.warning(f"Invalid DTMF buttons: {buttons}") + return ActionOutput( + action_type=action_input.action_config.type, + response=DTMFResponse( + success=False, message="Invalid DTMF buttons, can only accept 0-9" + ), + ) + self.conversation_state_manager._twilio_phone_conversation.output_device.send_dtmf_tones( + keypad_entries=keypad_entries + ) return ActionOutput( action_type=action_input.action_config.type, - response=DTMFResponse(success=False), + response=DTMFResponse(success=True), ) diff --git a/vocode/streaming/output_device/twilio_output_device.py b/vocode/streaming/output_device/twilio_output_device.py index 00926e9b0f..a7d1917caf 100644 --- a/vocode/streaming/output_device/twilio_output_device.py +++ b/vocode/streaming/output_device/twilio_output_device.py @@ -1,10 +1,10 @@ from __future__ import annotations import asyncio +import audioop import base64 import json -import uuid -from typing import Optional, Union +from typing import List, Optional, Union from fastapi import WebSocket from fastapi.websockets import WebSocketState @@ -15,6 +15,7 @@ from vocode.streaming.output_device.audio_chunk import AudioChunk, ChunkState from vocode.streaming.telephony.constants import DEFAULT_AUDIO_ENCODING, DEFAULT_SAMPLING_RATE from vocode.streaming.utils.create_task import asyncio_create_task +from vocode.streaming.utils.dtmf_utils import DTMFToneGenerator, KeypadEntry from vocode.streaming.utils.worker import InterruptibleEvent @@ -55,6 +56,20 @@ def interrupt(self): def enqueue_mark_message(self, mark_message: MarkMessage): self._mark_message_queue.put_nowait(mark_message) + def send_dtmf_tones(self, keypad_entries: List[KeypadEntry]): + tone_generator = DTMFToneGenerator() + for keypad_entry in keypad_entries: + logger.info(f"Sending DTMF tone {keypad_entry.value}") + dtmf_tone = tone_generator.generate( + keypad_entry, sampling_rate=self.sampling_rate, audio_encoding=self.audio_encoding + ) + dtmf_message = { + "event": "media", + "streamSid": self.stream_sid, + "media": {"payload": base64.b64encode(dtmf_tone).decode("utf-8")}, + } + self._twilio_events_queue.put_nowait(json.dumps(dtmf_message)) + async def _send_twilio_messages(self): while True: try: diff --git a/vocode/streaming/utils/dtmf_utils.py b/vocode/streaming/utils/dtmf_utils.py new file mode 100644 index 0000000000..34732dbcea --- /dev/null +++ b/vocode/streaming/utils/dtmf_utils.py @@ -0,0 +1,65 @@ +import audioop +from enum import Enum +from typing import Dict, Tuple + +import numpy as np + +from vocode.streaming.models.audio import AudioEncoding +from vocode.streaming.utils.singleton import Singleton + +DEFAULT_DTMF_TONE_LENGTH_SECONDS = 0.3 +MAX_INT = 32767 + + +class KeypadEntry(str, Enum): + ONE = "1" + TWO = "2" + THREE = "3" + FOUR = "4" + FIVE = "5" + SIX = "6" + SEVEN = "7" + EIGHT = "8" + NINE = "9" + ZERO = "0" + + +DTMF_FREQUENCIES = { + KeypadEntry.ONE: (697, 1209), + KeypadEntry.TWO: (697, 1336), + KeypadEntry.THREE: (697, 1477), + KeypadEntry.FOUR: (770, 1209), + KeypadEntry.FIVE: (770, 1336), + KeypadEntry.SIX: (770, 1477), + KeypadEntry.SEVEN: (852, 1209), + KeypadEntry.EIGHT: (852, 1336), + KeypadEntry.NINE: (852, 1477), + KeypadEntry.ZERO: (941, 1336), +} + + +class DTMFToneGenerator(Singleton): + + def __init__(self): + self.tone_cache: Dict[Tuple[KeypadEntry, int, AudioEncoding], bytes] = {} + + def generate( + self, + keypad_entry: KeypadEntry, + sampling_rate: int, + audio_encoding: AudioEncoding, + duration_seconds: float = DEFAULT_DTMF_TONE_LENGTH_SECONDS, + ) -> bytes: + if (keypad_entry, sampling_rate, audio_encoding) in self.tone_cache: + return self.tone_cache[(keypad_entry, sampling_rate, audio_encoding)] + f1, f2 = DTMF_FREQUENCIES[keypad_entry] + t = np.linspace(0, duration_seconds, int(sampling_rate * duration_seconds), endpoint=False) + tone = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t) + tone = tone / np.max(np.abs(tone)) # Normalize to [-1, 1] + pcm = (tone * MAX_INT).astype(np.int16).tobytes() + if audio_encoding == AudioEncoding.MULAW: + output = audioop.lin2ulaw(pcm, 2) + else: + output = pcm + self.tone_cache[(keypad_entry, sampling_rate, audio_encoding)] = output + return output From ad1adc8dc2de7df391dd7b4a5e3eede70d225130 Mon Sep 17 00:00:00 2001 From: jstahlbaum-fibernetics <143650857+jstahlbaum-fibernetics@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:20:53 -0400 Subject: [PATCH 120/148] [Bug #628] correct coding errors in the google synthesiser (#629) * [Bug-628] correct coding errors in the google synthesiser * create_speech --> create_speech_uncached --------- Co-authored-by: Ajay Raj --- vocode/streaming/synthesizer/google_synthesizer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vocode/streaming/synthesizer/google_synthesizer.py b/vocode/streaming/synthesizer/google_synthesizer.py index 225ab2d5d2..acf89d7cea 100644 --- a/vocode/streaming/synthesizer/google_synthesizer.py +++ b/vocode/streaming/synthesizer/google_synthesizer.py @@ -5,7 +5,7 @@ from typing import Any import google.auth -from google.cloud import texttospeech as tts # type: ignore +from google.cloud import texttospeech_v1beta1 as tts # type: ignore from vocode.streaming.models.message import BaseMessage from vocode.streaming.models.synthesizer import GoogleSynthesizerConfig @@ -34,7 +34,7 @@ def __init__( # Select the type of audio file you want returned self.audio_config = tts.AudioConfig( audio_encoding=tts.AudioEncoding.LINEAR16, - sample_rate_hertz=24000, + sample_rate_hertz=synthesizer_config.sampling_rate, speaking_rate=synthesizer_config.speaking_rate, pitch=synthesizer_config.pitch, effects_profile_id=["telephony-class-application"], @@ -56,7 +56,7 @@ def synthesize(self, message: str) -> Any: ) # TODO: make this nonblocking, see speech.TextToSpeechAsyncClient - async def create_speech( + async def create_speech_uncached( self, message: BaseMessage, chunk_size: int, @@ -75,7 +75,7 @@ async def create_speech( in_memory_wav.setnchannels(1) in_memory_wav.setsampwidth(2) in_memory_wav.setframerate(output_sample_rate) - in_memory_wav.writeframes(response.audio_content) + in_memory_wav.writeframes(response.audio_content[44:]) output_bytes_io.seek(0) result = self.create_synthesis_result_from_wav( From 4c196e13d2938f21c0adf11bf8c989f3b8e7c9ee Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 12 Jul 2024 14:53:38 -0700 Subject: [PATCH 121/148] [DOW-119] creates AudioPipeline abstraction (#625) * make terminate async * creates audio pipeline abstraction * fix streaming conversation api * make terminate() invocations in tests async * removes the vector_db.tear_down() call in streaming conversation --- playground/streaming/agent/chat.py | 4 +-- tests/streaming/action/test_dtmf.py | 2 +- tests/streaming/agent/test_base_agent.py | 2 +- ..._rate_limit_interruptions_output_device.py | 2 +- .../test_twilio_output_device.py | 2 +- .../streaming/test_streaming_conversation.py | 10 +++--- vocode/streaming/agent/chat_gpt_agent.py | 5 +++ .../agent/websocket_user_implemented_agent.py | 4 +-- .../output_device/blocking_speaker_output.py | 10 +++--- .../output_device/file_output_device.py | 4 +-- .../streaming/output_device/speaker_output.py | 2 +- vocode/streaming/streaming_conversation.py | 35 ++++++++----------- .../streaming/synthesizer/base_synthesizer.py | 2 +- .../streaming/synthesizer/miniaudio_worker.py | 4 +-- .../transcriber/assembly_ai_transcriber.py | 4 +-- .../transcriber/azure_transcriber.py | 4 +-- .../streaming/transcriber/base_transcriber.py | 12 +++---- .../transcriber/deepgram_transcriber.py | 4 +-- .../transcriber/gladia_transcriber.py | 4 +-- .../transcriber/google_transcriber.py | 4 +-- .../transcriber/rev_ai_transcriber.py | 3 +- .../transcriber/whisper_cpp_transcriber.py | 2 +- vocode/streaming/utils/audio_pipeline.py | 21 +++++++++++ vocode/streaming/utils/worker.py | 4 +-- 24 files changed, 84 insertions(+), 66 deletions(-) create mode 100644 vocode/streaming/utils/audio_pipeline.py diff --git a/playground/streaming/agent/chat.py b/playground/streaming/agent/chat.py index e93b9eeda8..dfcede2dec 100644 --- a/playground/streaming/agent/chat.py +++ b/playground/streaming/agent/chat.py @@ -197,7 +197,7 @@ async def sender(): await asyncio.gather(receiver(), sender()) if actions_worker is not None: - actions_worker.terminate() + await actions_worker.terminate() async def agent_main(): @@ -233,7 +233,7 @@ async def agent_main(): try: await run_agent(agent, interruption_probability=0, backchannel_probability=0) except KeyboardInterrupt: - agent.terminate() + await agent.terminate() if __name__ == "__main__": diff --git a/tests/streaming/action/test_dtmf.py b/tests/streaming/action/test_dtmf.py index 026779c0a3..e65f46cf5e 100644 --- a/tests/streaming/action/test_dtmf.py +++ b/tests/streaming/action/test_dtmf.py @@ -118,7 +118,7 @@ async def test_twilio_dtmf_press_digits( assert False, "Timed out waiting for DTMF tones to be sent" assert action_output.response.success - mock_twilio_output_device.terminate() + await mock_twilio_output_device.terminate() for digit, call in zip(digits, mock_twilio_output_device.ws.send_text.call_args_list): expected_dtmf = DTMFToneGenerator().generate( diff --git a/tests/streaming/agent/test_base_agent.py b/tests/streaming/agent/test_base_agent.py index 26519ad141..e3fe9e5f90 100644 --- a/tests/streaming/agent/test_base_agent.py +++ b/tests/streaming/agent/test_base_agent.py @@ -140,7 +140,7 @@ async def test_generate_responses(mocker: MockerFixture): agent.agent_responses_consumer = agent_consumer agent.start() agent_responses = await _consume_until_end_of_turn(agent_consumer) - agent.terminate() + await agent.terminate() messages = [response.message for response in agent_responses] diff --git a/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py b/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py index 44c6679ab1..66891a420d 100644 --- a/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py +++ b/tests/streaming/output_device/test_rate_limit_interruptions_output_device.py @@ -65,4 +65,4 @@ def uninterruptible_on_play(): await uninterruptible_played_event.wait() assert uninterruptible_audio_chunk.state == ChunkState.PLAYED - output_device.terminate() + await output_device.terminate() diff --git a/tests/streaming/output_device/test_twilio_output_device.py b/tests/streaming/output_device/test_twilio_output_device.py index e8cd69f3d5..c2c26c8d87 100644 --- a/tests/streaming/output_device/test_twilio_output_device.py +++ b/tests/streaming/output_device/test_twilio_output_device.py @@ -57,7 +57,7 @@ def on_play(): assert mark_message["streamSid"] == twilio_output_device.stream_sid assert mark_message["mark"]["name"] == str(audio_chunk.chunk_id) - twilio_output_device.terminate() + await twilio_output_device.terminate() @pytest.mark.asyncio diff --git a/tests/streaming/test_streaming_conversation.py b/tests/streaming/test_streaming_conversation.py index 2266a7e47d..89149994ab 100644 --- a/tests/streaming/test_streaming_conversation.py +++ b/tests/streaming/test_streaming_conversation.py @@ -287,7 +287,7 @@ async def test_transcriptions_worker_ignores_utterances_before_initial_message( backchannel.sender == Sender.HUMAN and backchannel.is_backchannel for backchannel in human_backchannels ) - streaming_conversation.transcriptions_worker.terminate() + await streaming_conversation.transcriptions_worker.terminate() @pytest.mark.asyncio @@ -355,7 +355,7 @@ async def test_transcriptions_worker_ignores_associated_ignored_utterance( "I'm listening.", ] assert streaming_conversation.transcript.event_logs[-1].is_backchannel - streaming_conversation.transcriptions_worker.terminate() + await streaming_conversation.transcriptions_worker.terminate() @pytest.mark.asyncio @@ -405,7 +405,7 @@ async def test_transcriptions_worker_interrupts_on_interim_transcripts( assert streaming_conversation.transcript.event_logs[-1].sender == Sender.BOT assert streaming_conversation.transcript.event_logs[-1].text == "Hi, I was wondering" - streaming_conversation.transcriptions_worker.terminate() + await streaming_conversation.transcriptions_worker.terminate() @pytest.mark.asyncio @@ -460,7 +460,7 @@ async def test_transcriptions_worker_interrupts_immediately_before_bot_has_begun assert await _get_from_consumer_queue_if_exists(transcriptions_worker_consumer) is None assert streaming_conversation.broadcast_interrupt.called - streaming_conversation.transcriptions_worker.terminate() + await streaming_conversation.transcriptions_worker.terminate() def _create_dummy_synthesis_result( @@ -576,7 +576,7 @@ async def chunk_generator(): stop_event.set() streaming_conversation.output_device.interrupt_event.set() message_sent, cut_off = await send_speech_to_output_task - streaming_conversation.output_device.terminate() + await streaming_conversation.output_device.terminate() assert message_sent != "Hi there" assert cut_off diff --git a/vocode/streaming/agent/chat_gpt_agent.py b/vocode/streaming/agent/chat_gpt_agent.py index 4d54eb54a2..0ca8c5c1b9 100644 --- a/vocode/streaming/agent/chat_gpt_agent.py +++ b/vocode/streaming/agent/chat_gpt_agent.py @@ -290,3 +290,8 @@ async def generate_response( message=message, is_interruptible=True, ) + + async def terminate(self): + if hasattr(self, "vector_db") and self.vector_db is not None: + await self.vector_db.tear_down() + return await super().terminate() diff --git a/vocode/streaming/agent/websocket_user_implemented_agent.py b/vocode/streaming/agent/websocket_user_implemented_agent.py index f8233588fb..0faa522544 100644 --- a/vocode/streaming/agent/websocket_user_implemented_agent.py +++ b/vocode/streaming/agent/websocket_user_implemented_agent.py @@ -138,10 +138,10 @@ async def receiver(ws: WebSocketClientProtocol) -> None: await asyncio.gather(sender(ws), receiver(ws)) - def terminate(self): + async def terminate(self): self.agent_responses_consumer.consume_nonblocking( self.interruptible_event_factory.create_interruptible_agent_response_event( AgentResponseStop() ) ) - super().terminate() + await super().terminate() diff --git a/vocode/streaming/output_device/blocking_speaker_output.py b/vocode/streaming/output_device/blocking_speaker_output.py index 4679fb0a72..c872b42801 100644 --- a/vocode/streaming/output_device/blocking_speaker_output.py +++ b/vocode/streaming/output_device/blocking_speaker_output.py @@ -38,9 +38,9 @@ def _run_loop(self): except queue.Empty: continue - def terminate(self): + async def terminate(self): self._ended = True - super().terminate() + await super().terminate() self.stream.close() @@ -65,9 +65,9 @@ def start(self) -> asyncio.Task: self.playback_worker.start() return super().start() - def terminate(self): - self.playback_worker.terminate() - super().terminate() + async def terminate(self): + await self.playback_worker.terminate() + await super().terminate() @classmethod def from_default_device( diff --git a/vocode/streaming/output_device/file_output_device.py b/vocode/streaming/output_device/file_output_device.py index 607fd5b3e1..d2df2aa621 100644 --- a/vocode/streaming/output_device/file_output_device.py +++ b/vocode/streaming/output_device/file_output_device.py @@ -30,6 +30,6 @@ def __init__( async def play(self, chunk: bytes): await asyncio.to_thread(lambda: self.wav.writeframes(chunk)) - def terminate(self): + async def terminate(self): self.wav.close() - super().terminate() + await super().terminate() diff --git a/vocode/streaming/output_device/speaker_output.py b/vocode/streaming/output_device/speaker_output.py index c416c814ef..17acc9e266 100644 --- a/vocode/streaming/output_device/speaker_output.py +++ b/vocode/streaming/output_device/speaker_output.py @@ -53,7 +53,7 @@ def consume_nonblocking(self, chunk): block[:size] = chunk_arr[i : i + size] self.queue.put_nowait(block) - def terminate(self): + async def terminate(self): self.stream.close() @classmethod diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index f6fc02500c..bb13270806 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -24,6 +24,7 @@ from loguru import logger from sentry_sdk.tracing import Span +from vocode import conversation_id as ctx_conversation_id from vocode.streaming.action.worker import ActionsWorker from vocode.streaming.agent.base_agent import ( AgentInput, @@ -61,6 +62,7 @@ enumerate_async_iter, get_chunk_size_per_second, ) +from vocode.streaming.utils.audio_pipeline import AudioPipeline, OutputDeviceType from vocode.streaming.utils.create_task import asyncio_create_task from vocode.streaming.utils.events_manager import EventsManager from vocode.streaming.utils.speed_manager import SpeedManager @@ -107,10 +109,7 @@ LOW_INTERRUPT_SENSITIVITY_BACKCHANNEL_UTTERANCE_LENGTH_THRESHOLD = 3 -OutputDeviceType = TypeVar("OutputDeviceType", bound=AbstractOutputDevice) - - -class StreamingConversation(Generic[OutputDeviceType]): +class StreamingConversation(AudioPipeline[OutputDeviceType]): class QueueingInterruptibleEventFactory(InterruptibleEventFactory): def __init__(self, conversation: "StreamingConversation"): self.conversation = conversation @@ -593,6 +592,8 @@ def __init__( events_manager: Optional[EventsManager] = None, ): self.id = conversation_id or create_conversation_id() + ctx_conversation_id.set(self.id) + self.output_device = output_device self.transcriber = transcriber self.agent = agent @@ -800,8 +801,8 @@ def receive_message(self, message: str): ) self.transcriptions_worker.consume_nonblocking(transcription) - def receive_audio(self, chunk: bytes): - self.transcriber.send_audio(chunk) + def consume_nonblocking(self, item: bytes): + self.transcriber.send_audio(item) def warmup_synthesizer(self): self.synthesizer.ready_synthesizer(self._get_synthesizer_chunk_size()) @@ -1010,29 +1011,23 @@ async def terminate(self): logger.debug("Tearing down synthesizer") await self.synthesizer.tear_down() logger.debug("Terminating agent") - if isinstance(self.agent, ChatGPTAgent) and self.agent.agent_config.vector_db_config: - # Shutting down the vector db should be done in the agent's terminate method, - # but it is done here because `vector_db.tear_down()` is async and - # `agent.terminate()` is not async. - logger.debug("Terminating vector db") - await self.agent.vector_db.tear_down() - self.agent.terminate() + await self.agent.terminate() logger.debug("Terminating output device") - self.output_device.terminate() + await self.output_device.terminate() logger.debug("Terminating speech transcriber") - self.transcriber.terminate() + await self.transcriber.terminate() logger.debug("Terminating transcriptions worker") - self.transcriptions_worker.terminate() + await self.transcriptions_worker.terminate() logger.debug("Terminating final transcriptions worker") - self.agent_responses_worker.terminate() + await self.agent_responses_worker.terminate() logger.debug("Terminating synthesis results worker") - self.synthesis_results_worker.terminate() + await self.synthesis_results_worker.terminate() if self.filler_audio_worker is not None: logger.debug("Terminating filler audio worker") - self.filler_audio_worker.terminate() + await self.filler_audio_worker.terminate() if self.actions_worker is not None: logger.debug("Terminating actions worker") - self.actions_worker.terminate() + await self.actions_worker.terminate() logger.debug("Successfully terminated") def is_active(self): diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index 8ccd6aad25..f6e70aca0b 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -446,7 +446,7 @@ async def send_chunks(): except asyncio.CancelledError: pass finally: - miniaudio_worker.terminate() + await miniaudio_worker.terminate() def _resample_chunk( self, diff --git a/vocode/streaming/synthesizer/miniaudio_worker.py b/vocode/streaming/synthesizer/miniaudio_worker.py index fcba60460b..9cb67e4d74 100644 --- a/vocode/streaming/synthesizer/miniaudio_worker.py +++ b/vocode/streaming/synthesizer/miniaudio_worker.py @@ -96,6 +96,6 @@ def _run_loop(self): current_wav_output_buffer = current_wav_output_buffer[output_buffer_idx:] current_wav_buffer.extend(new_bytes) - def terminate(self): + async def terminate(self): self._ended = True - super().terminate() + await super().terminate() diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index 331810e735..00953bd44d 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -78,9 +78,9 @@ def send_audio(self, chunk): self.consume_nonblocking(self.buffer) self.buffer = bytearray() - def terminate(self): + async def terminate(self): self._ended = True - super().terminate() + await super().terminate() def get_assembly_ai_url(self): url_params = {"sample_rate": self.transcriber_config.sampling_rate} diff --git a/vocode/streaming/transcriber/azure_transcriber.py b/vocode/streaming/transcriber/azure_transcriber.py index 2cc666340f..00a7a7a7f9 100644 --- a/vocode/streaming/transcriber/azure_transcriber.py +++ b/vocode/streaming/transcriber/azure_transcriber.py @@ -141,7 +141,7 @@ def generator(self): yield b"".join(data) - def terminate(self): + async def terminate(self): self._ended = True self.speech.stop_continuous_recognition_async() - super().terminate() + await super().terminate() diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index beea852b15..edd1009d48 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -57,18 +57,14 @@ def send_audio(self, chunk: bytes): def produce_nonblocking(self, item: Transcription): self.consumer.consume_nonblocking(item) - @abstractmethod - def terminate(self): - pass - class BaseAsyncTranscriber(AbstractTranscriber[TranscriberConfigType], AsyncWorker[bytes]): # type: ignore def __init__(self, transcriber_config: TranscriberConfigType): AbstractTranscriber.__init__(self, transcriber_config) AsyncWorker.__init__(self) - def terminate(self): - AsyncWorker.terminate(self) + async def terminate(self): + await AsyncWorker.terminate(self) class BaseThreadAsyncTranscriber( # type: ignore @@ -101,8 +97,8 @@ async def _forward_from_thread(self): def produce_nonblocking(self, item: Transcription): self.output_janus_queue.sync_q.put_nowait(item) - def terminate(self): - ThreadAsyncWorker.terminate(self) + async def terminate(self): + await ThreadAsyncWorker.terminate(self) BaseTranscriber = Union[ diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index 4835d9646e..7f64f4a976 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -177,7 +177,7 @@ async def _run_loop(self): logger.error("Deepgram connection died, not restarting") - def terminate(self): + async def terminate(self): self._track_latency_of_transcription_start() # Put this in logs until we sentry metrics show up # properly on dashboard @@ -192,7 +192,7 @@ def terminate(self): terminate_msg = json.dumps({"type": "CloseStream"}).encode("utf-8") self.consume_nonblocking(terminate_msg) # todo (dow-107): typing self._ended = True - super().terminate() + await super().terminate() def get_input_sample_width(self): encoding = self.transcriber_config.audio_encoding diff --git a/vocode/streaming/transcriber/gladia_transcriber.py b/vocode/streaming/transcriber/gladia_transcriber.py index 1cd8f32b0a..c01b82fc56 100644 --- a/vocode/streaming/transcriber/gladia_transcriber.py +++ b/vocode/streaming/transcriber/gladia_transcriber.py @@ -56,9 +56,9 @@ def send_audio(self, chunk): self.consume_nonblocking(self.buffer) self.buffer = bytearray() - def terminate(self): + async def terminate(self): self._ended = True - super().terminate() + await super().terminate() async def process(self): async with websockets.connect(GLADIA_URL) as ws: diff --git a/vocode/streaming/transcriber/google_transcriber.py b/vocode/streaming/transcriber/google_transcriber.py index 97c2c34b56..0241ee7305 100644 --- a/vocode/streaming/transcriber/google_transcriber.py +++ b/vocode/streaming/transcriber/google_transcriber.py @@ -57,9 +57,9 @@ def _run_loop(self): responses = self.client.streaming_recognize(self.google_streaming_config, requests) self.process_responses_loop(responses) - def terminate(self): + async def terminate(self): self._ended = True - super().terminate() + await super().terminate() def process_responses_loop(self, responses): for response in responses: diff --git a/vocode/streaming/transcriber/rev_ai_transcriber.py b/vocode/streaming/transcriber/rev_ai_transcriber.py index 0684f3dce6..bb5ae4d0c9 100644 --- a/vocode/streaming/transcriber/rev_ai_transcriber.py +++ b/vocode/streaming/transcriber/rev_ai_transcriber.py @@ -135,7 +135,8 @@ async def receiver(ws: WebSocketClientProtocol): await asyncio.gather(sender(ws), receiver(ws)) - def terminate(self): + async def terminate(self): terminate_msg = json.dumps({"type": "CloseStream"}) self.consume_nonblocking(terminate_msg) self.closed = True + await super().terminate() diff --git a/vocode/streaming/transcriber/whisper_cpp_transcriber.py b/vocode/streaming/transcriber/whisper_cpp_transcriber.py index c12c6333c3..f5c0205acc 100644 --- a/vocode/streaming/transcriber/whisper_cpp_transcriber.py +++ b/vocode/streaming/transcriber/whisper_cpp_transcriber.py @@ -78,5 +78,5 @@ def _run_loop(self): if is_final: message_buffer = "" - def terminate(self): + async def terminate(self): pass diff --git a/vocode/streaming/utils/audio_pipeline.py b/vocode/streaming/utils/audio_pipeline.py new file mode 100644 index 0000000000..60fcd2f449 --- /dev/null +++ b/vocode/streaming/utils/audio_pipeline.py @@ -0,0 +1,21 @@ +from abc import abstractmethod +from typing import Generic, TypeVar + +from vocode.streaming.output_device.abstract_output_device import AbstractOutputDevice +from vocode.streaming.utils.events_manager import EventsManager +from vocode.streaming.utils.worker import AbstractWorker + +OutputDeviceType = TypeVar("OutputDeviceType", bound=AbstractOutputDevice) + + +class AudioPipeline(AbstractWorker[bytes], Generic[OutputDeviceType]): + output_device: OutputDeviceType + events_manager: EventsManager + id: str + + def receive_audio(self, chunk: bytes): + self.consume_nonblocking(chunk) + + @abstractmethod + def is_active(self): + raise NotImplementedError diff --git a/vocode/streaming/utils/worker.py b/vocode/streaming/utils/worker.py index d321ea193d..c98e0b653a 100644 --- a/vocode/streaming/utils/worker.py +++ b/vocode/streaming/utils/worker.py @@ -27,7 +27,7 @@ def start(self): def consume_nonblocking(self, item: WorkerInputType): raise NotImplementedError - def terminate(self): + async def terminate(self): pass @@ -66,7 +66,7 @@ def consume_nonblocking(self, item: WorkerInputType): async def _run_loop(self): raise NotImplementedError - def terminate(self): + async def terminate(self): if self.worker_task: return self.worker_task.cancel() From e1cf228944c95aff0125cd2486f4f32d284e43a4 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 12 Jul 2024 15:47:09 -0700 Subject: [PATCH 122/148] update script (#635) --- pull_core_into_upstream.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pull_core_into_upstream.sh b/pull_core_into_upstream.sh index 10c35d5770..8d9493bc97 100755 --- a/pull_core_into_upstream.sh +++ b/pull_core_into_upstream.sh @@ -12,16 +12,13 @@ SUBMODULE_BRANCH="vocodehq-public" USER=$(gh api user | jq -r '.login') DATE=$(date +%Y%m%d%H%M%S) -FEATURE_BRANCH="${USER}/update-${SUBMODULE_BRANCH}-${DATE}" PR_TITLE="Update ${SUBMODULE_BRANCH}" PR_BODY="This PR updates the ${SUBMODULE_BRANCH} branch by merging changes from the main branch." echo "Creating a new branch ${FEATURE_BRANCH}" +git checkout ${SUBMODULE_BRANCH} +git pull origin ${SUBMODULE_BRANCH} git checkout main git pull origin main -git pull origin ${SUBMODULE_BRANCH} -git checkout ${SUBMODULE_BRANCH} -git checkout -b ${FEATURE_BRANCH} -git merge main gh pr create -t "${PR_TITLE}" -b "${PR_BODY}" -B ${SUBMODULE_BRANCH} From 77d6593e218c465b0fcac70db737fc32cc7832af Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 15 Jul 2024 08:45:54 -0700 Subject: [PATCH 123/148] convert logger.error to logger.warning (#636) --- vocode/streaming/telephony/client/twilio_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vocode/streaming/telephony/client/twilio_client.py b/vocode/streaming/telephony/client/twilio_client.py index 97e8a9f7d5..5c8ad9819b 100644 --- a/vocode/streaming/telephony/client/twilio_client.py +++ b/vocode/streaming/telephony/client/twilio_client.py @@ -63,7 +63,7 @@ async def create_call( ) as response: if not response.ok: if response.status == 400: - logger.error( + logger.warning( f"Failed to create call: {response.status} {response.reason} {await response.json()}" ) raise TwilioBadRequestException( From 32f0cb4a76f3f648b2605ed38812e76d17c4d1ab Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 15 Jul 2024 10:18:07 -0700 Subject: [PATCH 124/148] update docs (#639) --- docs/external-actions.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/external-actions.mdx b/docs/external-actions.mdx index 740331f2f8..ee5b6c81f4 100644 --- a/docs/external-actions.mdx +++ b/docs/external-actions.mdx @@ -207,12 +207,12 @@ Vocode expects responses from the user’s API in JSON in the following format: ```python Response { - result: Any + result: Dict[str, Any] agent_message: Optional[str] = None } ``` -- `result` is a payload containing the result of the action on the user’s side, and can be in any format +- `result` is a payload containing the result of the action on the user’s side, and can have any schema - `agent_message` optionally contains a message that will be synthesized into audio and sent back to the phone call (see [Configuring the External Action](/external-actions#configuring-the-external-action) above for more info) In the [Meeting Assistant Example](/external-actions#meeting-assistant-example) below, the user’s API could return back a JSON response that looks like: From 3dc1d49abad7e0afaa7e7c95ec679f344b1c54d4 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 15 Jul 2024 17:15:53 -0700 Subject: [PATCH 125/148] [ESUP-55] adds # and * support and also ability to press multiple buttons in a row (#641) * adds # and * support and also ability to press multiple buttons in a row * fix tests --- tests/streaming/action/test_dtmf.py | 6 +++--- vocode/streaming/utils/dtmf_utils.py | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/streaming/action/test_dtmf.py b/tests/streaming/action/test_dtmf.py index e65f46cf5e..6466aeb8b6 100644 --- a/tests/streaming/action/test_dtmf.py +++ b/tests/streaming/action/test_dtmf.py @@ -32,7 +32,7 @@ async def test_vonage_dtmf_press_digits(mocker, mock_env): action = VonageDTMF(action_config=DTMFVocodeActionConfig()) vonage_uuid = generate_uuid() - digits = "1234" + digits = "1234*#" vonage_phone_conversation_mock = mocker.MagicMock() vonage_config = VonageConfig( @@ -92,7 +92,7 @@ async def test_twilio_dtmf_press_digits( mocker, mock_env, mock_twilio_phone_conversation, mock_twilio_output_device: TwilioOutputDevice ): action = TwilioDTMF(action_config=DTMFVocodeActionConfig()) - digits = "1234" + digits = "1234*#" twilio_sid = "twilio_sid" action.attach_conversation_state_manager( @@ -136,7 +136,7 @@ async def test_twilio_dtmf_failure( mocker, mock_env, mock_twilio_phone_conversation, mock_twilio_output_device: TwilioOutputDevice ): action = TwilioDTMF(action_config=DTMFVocodeActionConfig()) - digits = "****" + digits = "%%%%" twilio_sid = "twilio_sid" action.attach_conversation_state_manager( diff --git a/vocode/streaming/utils/dtmf_utils.py b/vocode/streaming/utils/dtmf_utils.py index 34732dbcea..fbf80eed4a 100644 --- a/vocode/streaming/utils/dtmf_utils.py +++ b/vocode/streaming/utils/dtmf_utils.py @@ -8,6 +8,7 @@ from vocode.streaming.utils.singleton import Singleton DEFAULT_DTMF_TONE_LENGTH_SECONDS = 0.3 +DEFAULT_DTMF_TONE_SILENCE_SECONDS = 0.1 MAX_INT = 32767 @@ -22,6 +23,8 @@ class KeypadEntry(str, Enum): EIGHT = "8" NINE = "9" ZERO = "0" + POUND = "#" + STAR = "*" DTMF_FREQUENCIES = { @@ -35,6 +38,8 @@ class KeypadEntry(str, Enum): KeypadEntry.EIGHT: (852, 1336), KeypadEntry.NINE: (852, 1477), KeypadEntry.ZERO: (941, 1336), + KeypadEntry.STAR: (941, 1209), + KeypadEntry.POUND: (941, 1477), } @@ -49,6 +54,7 @@ def generate( sampling_rate: int, audio_encoding: AudioEncoding, duration_seconds: float = DEFAULT_DTMF_TONE_LENGTH_SECONDS, + silence_seconds: float = DEFAULT_DTMF_TONE_SILENCE_SECONDS, ) -> bytes: if (keypad_entry, sampling_rate, audio_encoding) in self.tone_cache: return self.tone_cache[(keypad_entry, sampling_rate, audio_encoding)] @@ -57,6 +63,7 @@ def generate( tone = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t) tone = tone / np.max(np.abs(tone)) # Normalize to [-1, 1] pcm = (tone * MAX_INT).astype(np.int16).tobytes() + pcm += b"\0" * int(silence_seconds * sampling_rate * 2) if audio_encoding == AudioEncoding.MULAW: output = audioop.lin2ulaw(pcm, 2) else: From 6dee7c589abc17e8e746edfb1329a938a4eaed28 Mon Sep 17 00:00:00 2001 From: Sauhard Jain Date: Thu, 18 Jul 2024 08:35:56 -0700 Subject: [PATCH 126/148] Upgrade cartesia to 1.0.7 and add support for continuations (#646) * feat: upgrade cartesia to 1.0.7 and support for continuations * prevent errors * fix: review comments * Update vocode/streaming/models/synthesizer.py --------- Co-authored-by: Ajay Raj --- poetry.lock | 961 ++++++++---------- pyproject.toml | 2 +- vocode/streaming/models/synthesizer.py | 12 +- .../synthesizer/cartesia_synthesizer.py | 60 +- 4 files changed, 501 insertions(+), 534 deletions(-) diff --git a/poetry.lock b/poetry.lock index 254e7f0840..e6030148a9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -289,29 +289,30 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cachetools" -version = "5.3.3" +version = "5.4.0" description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] [[package]] name = "cartesia" -version = "1.0.3" +version = "1.0.7" description = "The official Python library for the Cartesia API." optional = true python-versions = ">=3.8.0" files = [ - {file = "cartesia-1.0.3-py2.py3-none-any.whl", hash = "sha256:d680c197361507faf11e8ed99a30a0d6ece682298ea306f41a66a0195c08ae37"}, - {file = "cartesia-1.0.3.tar.gz", hash = "sha256:446e7bea274e71c95f790d1efdc4b04a6eec1747f3ae5cc48a4fd68985d0aafc"}, + {file = "cartesia-1.0.7-py2.py3-none-any.whl", hash = "sha256:c4743c0ac6b42fcf77cb5b86afb2ad61f1b6f1fe7d717eb7a8ddac987fc4e550"}, + {file = "cartesia-1.0.7.tar.gz", hash = "sha256:fb0824c22fad9313cad9b4d56e72d907b05797e028a39b0c591e3eaf70b23735"}, ] [package.dependencies] aiohttp = "*" httpx = "*" +iterators = "*" pytest-asyncio = "*" requests = "*" websockets = "*" @@ -322,13 +323,13 @@ dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -521,63 +522,63 @@ files = [ [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -727,13 +728,13 @@ files = [ [[package]] name = "elevenlabs" -version = "1.3.1" +version = "1.4.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.3.1-py3-none-any.whl", hash = "sha256:96cb48d3527393b0f56fb9c6a26ad6520e2999a4c1ac9ca2b525ab7a26ea7342"}, - {file = "elevenlabs-1.3.1.tar.gz", hash = "sha256:23df9b48960bc1d48b9fe13a5dad74144a83ce5ed83708dd7dcf6180f44ce697"}, + {file = "elevenlabs-1.4.1-py3-none-any.whl", hash = "sha256:844fa386822746f2b37e4a4d29d72f42877bcbcaee71a99a140349419160940e"}, + {file = "elevenlabs-1.4.1.tar.gz", hash = "sha256:8df9e252f2bb11b2d0175071661c716238e9074e66eaf5d0c52aeab6b6fd39ad"}, ] [package.dependencies] @@ -760,13 +761,13 @@ idna = ">=2.0.0" [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -797,13 +798,13 @@ probabilistic = ["pyprobables (>=0.6,<0.7)"] [[package]] name = "fastapi" -version = "0.111.0" +version = "0.111.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, - {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, + {file = "fastapi-0.111.1-py3-none-any.whl", hash = "sha256:4f51cfa25d72f9fbc3280832e84b32494cf186f50158d364a8765aabf22587bf"}, + {file = "fastapi-0.111.1.tar.gz", hash = "sha256:ddd1ac34cb1f76c2e2d7f8545a4bcb5463bce4834e81abf0b189e0c359ab2413"}, ] [package.dependencies] @@ -811,12 +812,10 @@ email_validator = ">=2.0.0" fastapi-cli = ">=0.0.2" httpx = ">=0.23.0" jinja2 = ">=2.11.2" -orjson = ">=3.2.1" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" python-multipart = ">=0.0.7" starlette = ">=0.37.2,<0.38.0" typing-extensions = ">=4.8.0" -ujson = ">=4.0.1,<4.0.2 || >4.0.2,<4.1.0 || >4.1.0,<4.2.0 || >4.2.0,<4.3.0 || >4.3.0,<5.0.0 || >5.0.0,<5.1.0 || >5.1.0" uvicorn = {version = ">=0.12.0", extras = ["standard"]} [package.extras] @@ -1013,13 +1012,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.31.0" +version = "2.32.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google-auth-2.31.0.tar.gz", hash = "sha256:87805c36970047247c8afe614d4e3af8eceafc1ebba0c679fe75ddd1d575e871"}, - {file = "google_auth-2.31.0-py2.py3-none-any.whl", hash = "sha256:042c4702efa9f7d3c48d3a69341c209381b125faa6dbf3ebe56bc7e40ae05c23"}, + {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, + {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, ] [package.dependencies] @@ -1036,13 +1035,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.57.0" +version = "1.59.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.57.0.tar.gz", hash = "sha256:113905f100cb0a9ad744a2445a7675f92f28600233ba499614aa704d11a809b7"}, - {file = "google_cloud_aiplatform-1.57.0-py2.py3-none-any.whl", hash = "sha256:ca5391a56e0cc8f4ed39a2beb7be02f51936ff04fd5304775a72a86c345d0e47"}, + {file = "google-cloud-aiplatform-1.59.0.tar.gz", hash = "sha256:2bebb59c0ba3e3b4b568305418ca1b021977988adbee8691a5bed09b037e7e63"}, + {file = "google_cloud_aiplatform-1.59.0-py2.py3-none-any.whl", hash = "sha256:549e6eb1844b0f853043309138ebe2db00de4bbd8197b3bde26804ac163ef52a"}, ] [package.dependencies] @@ -1053,7 +1052,7 @@ google-cloud-bigquery = ">=1.15.0,<3.20.0 || >3.20.0,<4.0.0dev" google-cloud-resource-manager = ">=1.3.3,<3.0.0dev" google-cloud-storage = ">=1.32.0,<3.0.0dev" packaging = ">=14.3" -proto-plus = ">=1.22.0,<2.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" pydantic = "<3" shapely = "<3.0.0dev" @@ -1063,7 +1062,7 @@ autologging = ["mlflow (>=1.27.0,<=2.1.1)"] cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)"] endpoint = ["requests (>=2.28.1)"] -full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] +full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "tenacity (<=8.3)"] langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "tenacity (<=8.3)"] lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] @@ -1072,12 +1071,12 @@ pipelines = ["pyyaml (>=5.3.1,<7)"] prediction = ["docker (>=5.0.3)", "fastapi (>=0.71.0,<=0.109.1)", "httpx (>=0.23.0,<0.25.0)", "starlette (>=0.17.1)", "uvicorn[standard] (>=0.16.0)"] preview = ["cloudpickle (<3.0)", "google-cloud-logging (<4.0)"] private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] -rapid-evaluation = ["nest-asyncio (>=1.0.0,<1.6.0)", "pandas (>=1.0.0,<2.2.0)"] +rapid-evaluation = ["pandas (>=1.0.0,<2.2.0)", "tqdm (>=4.23.0)"] ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "setuptools (<70.0.0)"] ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] reasoningengine = ["cloudpickle (>=3.0,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] -testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nest-asyncio (>=1.0.0,<1.6.0)", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "sentencepiece (>=0.2.0)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] +testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "sentencepiece (>=0.2.0)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] tokenization = ["sentencepiece (>=0.2.0)"] vizier = ["google-vizier (>=0.1.6)"] xai = ["tensorflow (>=2.3.0,<3.0.0dev)"] @@ -1133,13 +1132,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] [[package]] name = "google-cloud-resource-manager" -version = "1.12.3" +version = "1.12.4" description = "Google Cloud Resource Manager API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-resource-manager-1.12.3.tar.gz", hash = "sha256:809851824119834e4f2310b2c4f38621c1d16b2bb14d5b9f132e69c79d355e7f"}, - {file = "google_cloud_resource_manager-1.12.3-py2.py3-none-any.whl", hash = "sha256:92be7d6959927b76d90eafc4028985c37975a46ded5466a018f02e8649e113d4"}, + {file = "google-cloud-resource-manager-1.12.4.tar.gz", hash = "sha256:3eda914a925e92465ef80faaab7e0f7a9312d486dd4e123d2c76e04bac688ff0"}, + {file = "google_cloud_resource_manager-1.12.4-py2.py3-none-any.whl", hash = "sha256:0b6663585f7f862166c0fb4c55fdda721fce4dc2dc1d5b52d03ee4bf2653a85f"}, ] [package.dependencies] @@ -1147,24 +1146,24 @@ google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extr google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" grpc-google-iam-v1 = ">=0.12.4,<1.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<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.0dev" [[package]] name = "google-cloud-speech" -version = "2.26.0" +version = "2.26.1" description = "Google Cloud Speech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-speech-2.26.0.tar.gz", hash = "sha256:d3156a78496aeacff403429408a1b13efe996da6f0544a25567904ad801671d5"}, - {file = "google_cloud_speech-2.26.0-py2.py3-none-any.whl", hash = "sha256:8b61aebcbcc9bd5450933c94c431584a07667e022d12834f9037bb2c0e673c87"}, + {file = "google-cloud-speech-2.26.1.tar.gz", hash = "sha256:12aceb02e34c14ed49eea3102ae7e776dfd8722babdd1466de4db0de8c1f91a9"}, + {file = "google_cloud_speech-2.26.1-py2.py3-none-any.whl", hash = "sha256:51566c55f74288767afa91fd25c9563cfcf61ed417eb3301d4cb58c5ee4abe77"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<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.0dev" [[package]] name = "google-cloud-storage" @@ -1190,20 +1189,20 @@ protobuf = ["protobuf (<5.0.0dev)"] [[package]] name = "google-cloud-texttospeech" -version = "2.16.3" +version = "2.16.4" description = "Google Cloud Texttospeech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.16.3.tar.gz", hash = "sha256:fabc315032d137da0710bb4c268734d336212d8fa8316b23b277dd3a84ce721c"}, - {file = "google_cloud_texttospeech-2.16.3-py2.py3-none-any.whl", hash = "sha256:5d1e23f9270908a5d7ecf2af04105fbd3a7ddde60fe48506e397bd18c1ece499"}, + {file = "google-cloud-texttospeech-2.16.4.tar.gz", hash = "sha256:07b7e2a126e29219d2024dd69e40cb31ff0805bdae4957dcba452c6ad4862405"}, + {file = "google_cloud_texttospeech-2.16.4-py2.py3-none-any.whl", hash = "sha256:431f3b937f6c6150b6ca559ac906f0a6796ca72fe13f8e460755d8318cc9564a"}, ] [package.dependencies] google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" proto-plus = ">=1.22.3,<2.0.0dev" -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<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,<5.0.0dev" +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<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.0dev" [[package]] name = "google-crc32c" @@ -1607,13 +1606,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.4" +version = "0.23.5" 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.23.4-py3-none-any.whl", hash = "sha256:3a0b957aa87150addf0cc7bd71b4d954b78e749850e1e7fb29ebbd2db64ca037"}, - {file = "huggingface_hub-0.23.4.tar.gz", hash = "sha256:35d99016433900e44ae7efe1c209164a5a81dbbcd53a52f99c281dcd7ce22431"}, + {file = "huggingface_hub-0.23.5-py3-none-any.whl", hash = "sha256:d7a7d337615e11a45cc14a0ce5a605db6b038dc24af42866f731684825226e90"}, + {file = "huggingface_hub-0.23.5.tar.gz", hash = "sha256:67a9caba79b71235be3752852ca27da86bd54311d2424ca8afdb8dda056edf98"}, ] [package.dependencies] @@ -1694,6 +1693,17 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] +[[package]] +name = "iterators" +version = "0.2.0" +description = "Iterator utility classes and functions" +optional = true +python-versions = ">=3.6" +files = [ + {file = "iterators-0.2.0-py3-none-any.whl", hash = "sha256:1d7ff03f576c9de0e01bac66209556c066d6b1fc45583a99cfc9f4645be7900e"}, + {file = "iterators-0.2.0.tar.gz", hash = "sha256:e9927a1ea1ef081830fd1512f3916857c36bd4b37272819a6cd29d0f44431b97"}, +] + [[package]] name = "janus" version = "1.0.0" @@ -1833,13 +1843,13 @@ files = [ [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -1850,7 +1860,7 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -1868,19 +1878,19 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.6" +version = "0.2.8" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.6-py3-none-any.whl", hash = "sha256:f86e8a7afd3e56f8eb5ba47f01dd00144fb9fc2f1db9873bd197347be2857aa4"}, - {file = "langchain-0.2.6.tar.gz", hash = "sha256:867f6add370c1e3911b0e87d3dd0e36aec1e8f513bf06131340fe8f151d89dc5"}, + {file = "langchain-0.2.8-py3-none-any.whl", hash = "sha256:53e7dfe50294a14200f33bec22b4e14cb63857ccf0a5500b0d18b0fd51285d58"}, + {file = "langchain-0.2.8.tar.gz", hash = "sha256:7fecb309e3558cde4e5cf7e9ffb7c1ab3f07121c40a7ff3b0c27135f8120c296"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.10,<0.3.0" +langchain-core = ">=0.2.19,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ @@ -1895,36 +1905,36 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-anthropic" -version = "0.1.19" +version = "0.1.20" description = "An integration package connecting AnthropicMessages and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_anthropic-0.1.19-py3-none-any.whl", hash = "sha256:ed0d5823dcf65802c6367a8fada2e82610aa1c96dfaae5400b6920131483707b"}, - {file = "langchain_anthropic-0.1.19.tar.gz", hash = "sha256:7f4b3834947bbefdc43f5dc4ebbaddac4b58253c0c54684ac960af5054acc341"}, + {file = "langchain_anthropic-0.1.20-py3-none-any.whl", hash = "sha256:3a0d89ac6856be98beb3ec63813393bf29af3c5134247979c055938e741b7d9d"}, + {file = "langchain_anthropic-0.1.20.tar.gz", hash = "sha256:cb9607fecfc0f0de49b79dd0fc066790e2877873ef753abd98d2ae38d6e0f5b2"}, ] [package.dependencies] anthropic = ">=0.28.0,<1" defusedxml = ">=0.7.1,<0.8.0" -langchain-core = ">=0.2.10,<0.3" +langchain-core = ">=0.2.17,<0.3" [[package]] name = "langchain-community" -version = "0.2.6" +version = "0.2.7" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.6-py3-none-any.whl", hash = "sha256:758cc800acfe5dd396bf8ba1b57c4792639ead0eab48ed0367f0732ec6ee1f68"}, - {file = "langchain_community-0.2.6.tar.gz", hash = "sha256:40ce09a50ed798aa651ddb34c8978200fa8589b9813c7a28ce8af027bbf249f0"}, + {file = "langchain_community-0.2.7-py3-none-any.whl", hash = "sha256:c236e74249ab68a318c94c95327cbe75a76489b61f7bf93f14117d9233ce70b1"}, + {file = "langchain_community-0.2.7.tar.gz", hash = "sha256:f52659dbb8a8f0c011cc7d634247686d11d768843cc3e5fe9e6f52321cde82c0"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.6,<0.3.0" -langchain-core = ">=0.2.10,<0.3.0" +langchain = ">=0.2.7,<0.3.0" +langchain-core = ">=0.2.12,<0.3.0" langsmith = ">=0.1.0,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1937,13 +1947,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.11" +version = "0.2.20" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.11-py3-none-any.whl", hash = "sha256:c7ca4dc4d88e3c69fd7916c95a7027c2b1a11c2db5a51141c3ceb8afac212208"}, - {file = "langchain_core-0.2.11.tar.gz", hash = "sha256:7a4661b50604eeb20c3373fbfd8a4f1b74482a6ab4e0f9df11e96821ead8ef0c"}, + {file = "langchain_core-0.2.20-py3-none-any.whl", hash = "sha256:16cc4da6f7ebf33accea7af45a70480733dc852ab291030fb6924865bd7caf76"}, + {file = "langchain_core-0.2.20.tar.gz", hash = "sha256:a66c439e085d8c75f822f7650a5551d17bada4003521173c763d875d949e4ed5"}, ] [package.dependencies] @@ -1978,17 +1988,17 @@ anthropic = ["anthropic[vertexai] (>=0.29.0,<1)"] [[package]] name = "langchain-openai" -version = "0.1.14" +version = "0.1.16" description = "An integration package connecting OpenAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.14-py3-none-any.whl", hash = "sha256:fcd34cc5b5713798908a5828d364b4426e3b1afccbd564d344e5477acb86634a"}, - {file = "langchain_openai-0.1.14.tar.gz", hash = "sha256:1f13d6041e8bedddf6eb47ccad7416e05af38fa169324f7f1bdf4f385780f8d8"}, + {file = "langchain_openai-0.1.16-py3-none-any.whl", hash = "sha256:bff90e9d0be786495920a7851ae4d55247fb084d3a11d1b15bfe91904ce1cb0f"}, + {file = "langchain_openai-0.1.16.tar.gz", hash = "sha256:3dedcc785a64a488ad6a313cc59b0dccea025d27413b55cec73a20dcf3ded4da"}, ] [package.dependencies] -langchain-core = ">=0.2.2,<0.3" +langchain-core = ">=0.2.17,<0.3.0" openai = ">=1.32.0,<2.0.0" tiktoken = ">=0.7,<1" @@ -2008,13 +2018,13 @@ langchain-core = ">=0.2.10,<0.3.0" [[package]] name = "langsmith" -version = "0.1.83" +version = "0.1.87" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.83-py3-none-any.whl", hash = "sha256:f54d8cd8479b648b6339f3f735d19292c3516d080f680933ecdca3eab4b67ed3"}, - {file = "langsmith-0.1.83.tar.gz", hash = "sha256:5cdd947212c8ad19adb992c06471c860185a777daa6859bb47150f90daf64bf3"}, + {file = "langsmith-0.1.87-py3-none-any.whl", hash = "sha256:4cd19539c29367f812667e43c0fb0b6d304a078246508df85c38c4ea3df2d0cf"}, + {file = "langsmith-0.1.87.tar.gz", hash = "sha256:d2422099708af5717d01559731c1c62d49aebf05a420015e30f6dca5ed44227c"}, ] [package.dependencies] @@ -2187,63 +2197,71 @@ files = [ [[package]] name = "miniaudio" -version = "1.59" +version = "1.60" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" optional = false python-versions = "*" files = [ - {file = "miniaudio-1.59-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:028d7e8e6d99441340c0bfb60660db7bd5789cae7c95fa599d830344901d6d72"}, - {file = "miniaudio-1.59-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba6f802376f49977e9698740411db46092ea005894ff86d805aeddde7e505c1e"}, - {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f24b44bd28ca631b830bc91bd910cb0209fba005401effa64cee9a8ba580992"}, - {file = "miniaudio-1.59-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8980dda51e92ea750ca8bcfb1d2c198eca7e4c844ab857faac12e20245322aa6"}, - {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e21f56d51c627cef612d1a7bbc73fc7c5e03908f5ebc22c98494951ab8ccd3c8"}, - {file = "miniaudio-1.59-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f6f1665ce8ed46caac48beec64c70e248a0b4e001590c698695cd22c1f634a0"}, - {file = "miniaudio-1.59-cp310-cp310-win32.whl", hash = "sha256:799b393adce56c8df1df16e7dc692a83125888df9ecf8ec0242c4905df6275ef"}, - {file = "miniaudio-1.59-cp310-cp310-win_amd64.whl", hash = "sha256:44c6b48f01d934784da282f7a17c40be9110ee6bc723f5f90916d2b2e729c9cc"}, - {file = "miniaudio-1.59-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a9387e85e6a63d66a873f4208fbaba93179d11423da08dc83c78dd1b68ba504"}, - {file = "miniaudio-1.59-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12fbbe3934856ab54fa8889ab6ec6b62a97faa2f85a8830e286fe5a4e9584ca4"}, - {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4a9a1dc4352af4198f6ca0c20bac8b5b6a89d0d67e3535149ef08420a1ab3c9"}, - {file = "miniaudio-1.59-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eb9eac3f23fd4c94925830fa9c172e98aebfb12cec1dbfa6a7693b9e4c1e555"}, - {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:52882c36126c3a97fcdd8d753e4b1b07934bba9d4d3c431aa7f4914849090cac"}, - {file = "miniaudio-1.59-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6bb6deee6d5969292d22730d31ee85ed0edc2997ca79978db0cca269ab73761"}, - {file = "miniaudio-1.59-cp311-cp311-win32.whl", hash = "sha256:6afe7449d7d593ba3f8bd91085a392d0c6ca3be4c03b62af37cb46f6c0c0d9f4"}, - {file = "miniaudio-1.59-cp311-cp311-win_amd64.whl", hash = "sha256:a22832e449a31620317ae657f7fd20a42466e5768c48373f8f28c53f2b36f5cd"}, - {file = "miniaudio-1.59-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fbfb3c853641c8bd835e0654f49fe0c09b4018b1ecc7e4c2436e02fbaf748c4b"}, - {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45ce3596c693053a578db725848a90ba0dfcc03d1d94124b9fddaa9e50a7533e"}, - {file = "miniaudio-1.59-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d07228047352b655a82711704a635eee41eb3977ceaaf672ee17d64a3ba261b7"}, - {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:586f95f1d10f5d4f58b272c15c601c3ba13128bd34a839bce5bd28a839d5cf3c"}, - {file = "miniaudio-1.59-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7644f19b1dc00bca3ec9e6066eb8879c0e638091955092a1d7085a38d7de6e0f"}, - {file = "miniaudio-1.59-cp37-cp37m-win32.whl", hash = "sha256:055fb3a2e00ddcce2a2809cd2a3d5e68234588a00c70533fa4b68f0178829dce"}, - {file = "miniaudio-1.59-cp37-cp37m-win_amd64.whl", hash = "sha256:e1acea13830a53c026e58d44856ba4951a26eb0d0a2fda2ce6dc7280b6f57f81"}, - {file = "miniaudio-1.59-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a8b6f1d4a2551061721cc7b22fb0eb3839aad9137553e01b4dde1a31c91ca45"}, - {file = "miniaudio-1.59-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:011b2b8d5c57a485a6b86476e24c1c6be4a61ec8c33c456e3052929269857d0d"}, - {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b270e9e1df5ec05d03659febffaa704709d7c9cb0b3597cb0a993875d73be84"}, - {file = "miniaudio-1.59-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab9d0468790109bafc88ce9d1c93454b2d384af0c14a6657620315115390c8d"}, - {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0f0ffa87bef0b3bf932eff60aec97ac90e2adf7373e9170969c6f98ba1c5635"}, - {file = "miniaudio-1.59-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1a03e514b12ba5d93fe48470ddc6a7f4025cd8de5f604233fc899507e5a054c1"}, - {file = "miniaudio-1.59-cp38-cp38-win32.whl", hash = "sha256:19c6406342989a6774305cd214314028553cbb9fcbc5ed43ab17a7f6b43aa46b"}, - {file = "miniaudio-1.59-cp38-cp38-win_amd64.whl", hash = "sha256:239bd4ff17aa7eede52b30a2153a28fe0bf2891aa43617a10348dd90f20d727e"}, - {file = "miniaudio-1.59-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88930514e6a9a6258d3536638da5ceb3aaa1d6643122e0704db7fd08ff924368"}, - {file = "miniaudio-1.59-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6d195800a6162464731ba484580cdab3be5bcc47a366c8440be6015f16d059b1"}, - {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fcd4484eea26629eb9602ebcab0181f515881e736deccb235c2c0d99d7b4215"}, - {file = "miniaudio-1.59-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa0ff716a9eb79799ed623f619ed6b0bc1669046cd1f2070de20d3dc6737a822"}, - {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:878623ffa77c366c76c4202d3095835943bd8f8f604bbdc1872030d646817e4a"}, - {file = "miniaudio-1.59-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aca5d9e9774ddbad5c4a5c65dfb1e7fba9e4570092ba6891f439f7c849d21ed"}, - {file = "miniaudio-1.59-cp39-cp39-win32.whl", hash = "sha256:0e05f09d58ed32e7cdc1bad9342155b81e378ff2101242cf8a8f06cd56dae043"}, - {file = "miniaudio-1.59-cp39-cp39-win_amd64.whl", hash = "sha256:0e51899a148b393e84ee3a201a72c8fa4d19413f5b1b705ff5ae9f8eee956a7a"}, - {file = "miniaudio-1.59-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:07de990f047e693681f15736be2e169e3f53064d1e6a7d0c37837297fa18929c"}, - {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03beea7dabeb2be1a0a4718458e0b85e3c23692563b0f8841164d71ef2c2eef"}, - {file = "miniaudio-1.59-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c2cb1fdc92ace828bceabb602b4d2f52040a361632d71b810144656b8334738"}, - {file = "miniaudio-1.59-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5597384fa7dda1691adca46568ffaabcf39c0a224bf5b9548665a255b86a4f35"}, - {file = "miniaudio-1.59-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d253c994a27062788f60a8fb1f8571320b72ddc44fd4128fdd85634cf38717a4"}, - {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb71fb5d5491335fc565c157a01a8c6907180e113c3c0d9a6c22e28458be5919"}, - {file = "miniaudio-1.59-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21569111381b877d5445c917b00dfe038b434cb9dacaa4c548ca8c6b5e6d5b55"}, - {file = "miniaudio-1.59-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8686712f90189eaa6f9fc3eb503eb3487b09ca52417690fd14ac53306d55a125"}, - {file = "miniaudio-1.59-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4674c49ee2489595f65a8cdc1c48a3e8bc0f577b1eb957d918a942b88480e5a8"}, - {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fa69c55197215dabf85bc8f9f9d7128af08db402f12aea962e16bad1ac4dca8"}, - {file = "miniaudio-1.59-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce2668b03594612dacea4521483e38da56b51ce8a92d06106643f520ce092a82"}, - {file = "miniaudio-1.59-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6117c09da1944a59b7af3009d37c8eb6e0219174f5e00501b797687ddbe9c5a3"}, - {file = "miniaudio-1.59.tar.gz", hash = "sha256:2b68f496a8655497cde827c77aba3c3557f0f2bb7c38a6ecab34090ab4556277"}, + {file = "miniaudio-1.60-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04e30868b470b9fe60ce83065e96070d5929b989b9bde1dfbe365c74ed113ac0"}, + {file = "miniaudio-1.60-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7852cacf53d9ee89dceed22ecc623239ce2d9f9a8ac4426004057670bb465cef"}, + {file = "miniaudio-1.60-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efb3ad034c2d4875b5264480d2053d1c802e0715d6b6d45b9bf9ccf30cb0a8c3"}, + {file = "miniaudio-1.60-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a14cfaf3a0da30fe26b1f59f77837aab03472c6c8ec5652766c8423b374463b"}, + {file = "miniaudio-1.60-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd487e37d98abbef93e2a8c8ebe73eec6defd3009e07fc2886afd9abb7020812"}, + {file = "miniaudio-1.60-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:059dd317330954bd042def228a606d0be77f18f381ffda053f2ff9808c1187a4"}, + {file = "miniaudio-1.60-cp310-cp310-win32.whl", hash = "sha256:144fce160aa3a287b84dfb0af985cd8e0240e25623774a9cf18c3dc39d5c4c48"}, + {file = "miniaudio-1.60-cp310-cp310-win_amd64.whl", hash = "sha256:bc132dae0c0193b85e82f1509eadb74e281e34b73657b4cb09f406e2e3a00c89"}, + {file = "miniaudio-1.60-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:736f783f16dd83cde393cf5e1c2bc0e13a2b2907fff3be5cf8d0e4643fa03d87"}, + {file = "miniaudio-1.60-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2b9060dc806450da7a5c647ab1144562761b44eeec423580cebc941c7034902"}, + {file = "miniaudio-1.60-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebb7fe6a16b99e931a69fb8605b1b4035be7ec9bd676a8fd745bc0e6123b704c"}, + {file = "miniaudio-1.60-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db439671a688a7e123c9cb0055bc4840f81b75fe6b23e6c3bfa358ea5fbdb368"}, + {file = "miniaudio-1.60-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:63d072eaa2ef17a0cae1ee82d0faa3090d226eb0786104d9a0b8c6634962882a"}, + {file = "miniaudio-1.60-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6396059187d03198b40106b212078c90e0cef27d4bc874d85c709fc1afe0030b"}, + {file = "miniaudio-1.60-cp311-cp311-win32.whl", hash = "sha256:fbaae29ddc578e3e0e6f3669504fbdda4e1a52bb6c0acb6e96e571adceba11c0"}, + {file = "miniaudio-1.60-cp311-cp311-win_amd64.whl", hash = "sha256:b2d72cf67184ee0ae24d9c0cf71b43e7523141b1c8b5db6d957d164379ed9130"}, + {file = "miniaudio-1.60-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c097dcb426ac3ef53eeadb9164dc37469a45267952f3b1c378da2d38593fd04a"}, + {file = "miniaudio-1.60-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:060313cdc0e9f9d6415dcf0ed66ba4e469061be3298ee1719fef60f988150ef0"}, + {file = "miniaudio-1.60-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4522c824ed6b1164d1c6f9f0e0c526de14ac7521ab655cc7b92c954392e42e88"}, + {file = "miniaudio-1.60-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5dc9c14b85b77793e98df40662b28a0ce4ac92e0831f52bf9686721efbdb20"}, + {file = "miniaudio-1.60-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a925ac2435649bbb97f52c0170ae849aca1a5b52e73639c425013968a52678c3"}, + {file = "miniaudio-1.60-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2680c05fc5422bc6f6ddeefd388cb9d1c20de38b8e8d0559706712bc10fff3f"}, + {file = "miniaudio-1.60-cp312-cp312-win32.whl", hash = "sha256:d76bb757527e7a87bf20056d9380c4e5c105c82f00c95bff9fa9f3c1ad69ea45"}, + {file = "miniaudio-1.60-cp312-cp312-win_amd64.whl", hash = "sha256:0a7c55fca55a0d47698381cb1b919065d3115f0a5c6e957dcdd6297fbafedb3f"}, + {file = "miniaudio-1.60-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ff2366bb0fb502ca9b2891085793cd58bf9c85e420ae76a1a390a5e6367dde"}, + {file = "miniaudio-1.60-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74ce4c883fa8559e4ec9ee152b49b2856d7a57289c93ccc86c56818c7c73c338"}, + {file = "miniaudio-1.60-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc8691d3710175dd567d2829516445afec182f30f8b50930ed54196b503ed2a"}, + {file = "miniaudio-1.60-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff01436de38a798e91f21bfcdf77df66fb8ce8435f6ac9770adfec245c186cb"}, + {file = "miniaudio-1.60-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c11503d6737b80caad07c2315fb034eae8500e307a087f513c33729885a73c07"}, + {file = "miniaudio-1.60-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d67bf0e1b126926959cc5f6679369a170e0395e561a5b098f8494fd4bd773030"}, + {file = "miniaudio-1.60-cp38-cp38-win32.whl", hash = "sha256:a91b637891736b7a938c54ac4338523948821729b9de199329367e78a42d5959"}, + {file = "miniaudio-1.60-cp38-cp38-win_amd64.whl", hash = "sha256:a4e8a07322e910ad32a3d4a2db01c020a04044b2b269cece63d785947bdd42ff"}, + {file = "miniaudio-1.60-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1a3cb30aa3fbc82b14443939ba6988e57cece87a49fed7bb177d1ce31627d30"}, + {file = "miniaudio-1.60-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96b2ca055b9904c4a5461c10b77512c073254386bff35b4f5f95f3563179dbfb"}, + {file = "miniaudio-1.60-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:289e5b20e490fc5a4be22e5690dee0c43f709f8c599c7ea2c3a135d182a9ed6a"}, + {file = "miniaudio-1.60-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e5d44f868380d5ea0643260c5757b739bdf28d35f34ea6da63c2397d1076d7"}, + {file = "miniaudio-1.60-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:32e6a193bf611997c2bc059b10696f594f480569d367fdcade0d0cb1355e0d44"}, + {file = "miniaudio-1.60-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:953fb4163546241fd04ade2c66fb16dc79d8e072a5a7a5eeb915328f436d8e05"}, + {file = "miniaudio-1.60-cp39-cp39-win32.whl", hash = "sha256:916360f4a61877e7b67175dd985c9df679e102b15efab4ef4b7bc232ed0fec7a"}, + {file = "miniaudio-1.60-cp39-cp39-win_amd64.whl", hash = "sha256:958ad03b797541a698449396e945c005da9a96a6d8bdf1f92ca0b5f460d1d419"}, + {file = "miniaudio-1.60-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1936829a6bcc7d08edee2b01cab70e1e097c57592b6fe9ab0329cb45660e30ba"}, + {file = "miniaudio-1.60-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:932c3b1db06b018fdd7491c7d346abc9ad09b49cf479b08085d130443bd4fbcb"}, + {file = "miniaudio-1.60-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e53bf6dbf74379deeb77da7857247135ee0aeb7a71dc10ac6402edddd84c31f"}, + {file = "miniaudio-1.60-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b15ed148391f96a7b8d2cc35fabe2e48e17443e2b490febfb8a8f86fa4eedc2"}, + {file = "miniaudio-1.60-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:94b46bccaf87358ce78f416de18efdd950369d74f3354338ff760e9964432c77"}, + {file = "miniaudio-1.60-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5e3f8be8871dca8383d040eda4463f763c7f6c13f5f8df60beb74a1515335d65"}, + {file = "miniaudio-1.60-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a9bb3b419aa4c02d639ebd3f6ff86ecde3ee595ace50f03e1ec554ad761a33"}, + {file = "miniaudio-1.60-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d01e5ae889792bd6e1d747c990da78955e7be126ad3b16d701a48e2827b9c4"}, + {file = "miniaudio-1.60-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0facdf9a4821fa057a3c83ef31d064d3473e785d254a1bccfb34136a77e80797"}, + {file = "miniaudio-1.60-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:322da5d24f2d798537d5c8513825f76b5998ea4e17338ede535034997a4cd042"}, + {file = "miniaudio-1.60-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9000df2455fafd35547a52d41fea766953fbe519b47df6be1c8aaa3b2f0e843a"}, + {file = "miniaudio-1.60-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f20fc964fe187825b20ef6853211a91022b87f03b87641c9484b3336dfcd1f9b"}, + {file = "miniaudio-1.60-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206ac8ccd2a0491df9270dc5e408f62fedb8ff0b950d4cc33712a4d49197bbb1"}, + {file = "miniaudio-1.60-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:aa7114c298c3b1d0ad01d828b50b3d9f8a9b9c7e4df8c0ae3d3faa902fbeeca2"}, + {file = "miniaudio-1.60-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:78e34b0ecd8547bea3f410b5df8ff6bc1295cff32b5c6c89f219f966a274323b"}, + {file = "miniaudio-1.60-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d83a17b481bfbb078b15fdb182e6fb1808d4070d2a784095aebc63a3694e84e9"}, + {file = "miniaudio-1.60-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b9de5b75c5d05f3437fa5d33714338fc1eed9dc37a7a402eccb1cb446a4b645"}, + {file = "miniaudio-1.60-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab1b1bd73e82937d1c811f72339a0d0d4e7029bbf97acbe5e4725c73df3bd569"}, + {file = "miniaudio-1.60-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bb4ecb010390369671d44f1deb7da9cf05ed76eb5d51a4a3d408d719c3618ca6"}, + {file = "miniaudio-1.60.tar.gz", hash = "sha256:a89bd70b9d52eb1b787ca3cc4bde990da64e90cf7ad52c13b912b23ccaeec1cb"}, ] [package.dependencies] @@ -2478,13 +2496,13 @@ files = [ [[package]] name = "openai" -version = "1.35.9" +version = "1.35.14" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.9-py3-none-any.whl", hash = "sha256:d73d353bcc0bd46b9516e78a0c6fb1cffaaeb92906c7c7b467c4fa088332a150"}, - {file = "openai-1.35.9.tar.gz", hash = "sha256:4f5c1b90526cf48eaedac7b32d11b5c92fa7064b82617ad8f5f3279cd9ef090d"}, + {file = "openai-1.35.14-py3-none-any.whl", hash = "sha256:adadf8c176e0b8c47ad782ed45dc20ef46438ee1f02c7103c4155cff79c8f68b"}, + {file = "openai-1.35.14.tar.gz", hash = "sha256:394ba1dfd12ecec1d634c50e512d24ff1858bbc2674ffcce309b822785a058de"}, ] [package.dependencies] @@ -2548,7 +2566,7 @@ opentelemetry-api = "1.25.0" name = "orjson" version = "3.10.6" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false +optional = true python-versions = ">=3.8" files = [ {file = "orjson-3.10.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:fb0ee33124db6eaa517d00890fc1a55c3bfe1cf78ba4a8899d71a06f2d6ff5c7"}, @@ -2754,18 +2772,18 @@ files = [ [[package]] name = "pydantic" -version = "2.8.0" +version = "2.8.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e"}, - {file = "pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141"}, + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.20.0" +pydantic-core = "2.20.1" typing-extensions = [ {version = ">=4.6.1", markers = "python_version < \"3.13\""}, {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, @@ -2776,99 +2794,100 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.20.0" +version = "2.20.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9"}, - {file = "pydantic_core-2.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10"}, - {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943"}, - {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7"}, - {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d"}, - {file = "pydantic_core-2.20.0-cp310-none-win32.whl", hash = "sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d"}, - {file = "pydantic_core-2.20.0-cp310-none-win_amd64.whl", hash = "sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279"}, - {file = "pydantic_core-2.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c"}, - {file = "pydantic_core-2.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb"}, - {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175"}, - {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa"}, - {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137"}, - {file = "pydantic_core-2.20.0-cp311-none-win32.whl", hash = "sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e"}, - {file = "pydantic_core-2.20.0-cp311-none-win_amd64.whl", hash = "sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378"}, - {file = "pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17"}, - {file = "pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8"}, - {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608"}, - {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1"}, - {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af"}, - {file = "pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918"}, - {file = "pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d"}, - {file = "pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392"}, - {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c"}, - {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997"}, - {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e"}, - {file = "pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d"}, - {file = "pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c"}, - {file = "pydantic_core-2.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239"}, - {file = "pydantic_core-2.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150"}, - {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7"}, - {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0"}, - {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc"}, - {file = "pydantic_core-2.20.0-cp38-none-win32.whl", hash = "sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2"}, - {file = "pydantic_core-2.20.0-cp38-none-win_amd64.whl", hash = "sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432"}, - {file = "pydantic_core-2.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf"}, - {file = "pydantic_core-2.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4"}, - {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a"}, - {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4"}, - {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab"}, - {file = "pydantic_core-2.20.0-cp39-none-win32.whl", hash = "sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377"}, - {file = "pydantic_core-2.20.0-cp39-none-win_amd64.whl", hash = "sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c"}, - {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef"}, - {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2"}, - {file = "pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, ] [package.dependencies] @@ -3355,110 +3374,110 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {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"}, ] [[package]] @@ -3477,13 +3496,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.7.1" +version = "2.10.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.7.1-py2.py3-none-any.whl", hash = "sha256:ef1b3d54eb715825657cd4bb3cb42bb4dc85087bac14c56b0fd8c21abd968c9a"}, - {file = "sentry_sdk-2.7.1.tar.gz", hash = "sha256:25006c7e68b75aaa5e6b9c6a420ece22e8d7daec4b7a906ffd3a8607b67c037b"}, + {file = "sentry_sdk-2.10.0-py2.py3-none-any.whl", hash = "sha256:87b3d413c87d8e7f816cc9334bff255a83d8b577db2b22042651c30c19c09190"}, + {file = "sentry_sdk-2.10.0.tar.gz", hash = "sha256:545fcc6e36c335faa6d6cda84669b6e17025f31efbf3b2211ec14efe008b75d1"}, ] [package.dependencies] @@ -3528,52 +3547,47 @@ tornado = ["tornado (>=6)"] [[package]] name = "shapely" -version = "2.0.4" +version = "2.0.5" description = "Manipulation and analysis of geometric objects" optional = true python-versions = ">=3.7" files = [ - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58"}, - {file = "shapely-2.0.4-cp310-cp310-win32.whl", hash = "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7"}, - {file = "shapely-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d"}, - {file = "shapely-2.0.4-cp311-cp311-win32.whl", hash = "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879"}, - {file = "shapely-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, - {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, - {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, - {file = "shapely-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113"}, - {file = "shapely-2.0.4-cp37-cp37m-win32.whl", hash = "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53"}, - {file = "shapely-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"}, - {file = "shapely-2.0.4-cp38-cp38-win32.whl", hash = "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7"}, - {file = "shapely-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc"}, - {file = "shapely-2.0.4-cp39-cp39-win32.whl", hash = "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c"}, - {file = "shapely-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398"}, - {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, + {file = "shapely-2.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89d34787c44f77a7d37d55ae821f3a784fa33592b9d217a45053a93ade899375"}, + {file = "shapely-2.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:798090b426142df2c5258779c1d8d5734ec6942f778dab6c6c30cfe7f3bf64ff"}, + {file = "shapely-2.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45211276900c4790d6bfc6105cbf1030742da67594ea4161a9ce6812a6721e68"}, + {file = "shapely-2.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e119444bc27ca33e786772b81760f2028d930ac55dafe9bc50ef538b794a8e1"}, + {file = "shapely-2.0.5-cp310-cp310-win32.whl", hash = "sha256:9a4492a2b2ccbeaebf181e7310d2dfff4fdd505aef59d6cb0f217607cb042fb3"}, + {file = "shapely-2.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5cb5ee72f1bc7ace737c9ecd30dc174a5295fae412972d3879bac2e82c8fae"}, + {file = "shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec"}, + {file = "shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760"}, + {file = "shapely-2.0.5-cp311-cp311-win32.whl", hash = "sha256:35110e80070d664781ec7955c7de557456b25727a0257b354830abb759bf8311"}, + {file = "shapely-2.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, + {file = "shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, + {file = "shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, + {file = "shapely-2.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ff7731fea5face9ec08a861ed351734a79475631b7540ceb0b66fb9732a5f529"}, + {file = "shapely-2.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff9e520af0c5a578e174bca3c18713cd47a6c6a15b6cf1f50ac17dc8bb8db6a2"}, + {file = "shapely-2.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b299b91557b04acb75e9732645428470825061f871a2edc36b9417d66c1fc5"}, + {file = "shapely-2.0.5-cp37-cp37m-win32.whl", hash = "sha256:b5870633f8e684bf6d1ae4df527ddcb6f3895f7b12bced5c13266ac04f47d231"}, + {file = "shapely-2.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:401cb794c5067598f50518e5a997e270cd7642c4992645479b915c503866abed"}, + {file = "shapely-2.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e91ee179af539100eb520281ba5394919067c6b51824e6ab132ad4b3b3e76dd0"}, + {file = "shapely-2.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8af6f7260f809c0862741ad08b1b89cb60c130ae30efab62320bbf4ee9cc71fa"}, + {file = "shapely-2.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5456dd522800306ba3faef77c5ba847ec30a0bd73ab087a25e0acdd4db2514f"}, + {file = "shapely-2.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b714a840402cde66fd7b663bb08cacb7211fa4412ea2a209688f671e0d0631fd"}, + {file = "shapely-2.0.5-cp38-cp38-win32.whl", hash = "sha256:7e8cf5c252fac1ea51b3162be2ec3faddedc82c256a1160fc0e8ddbec81b06d2"}, + {file = "shapely-2.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:4461509afdb15051e73ab178fae79974387f39c47ab635a7330d7fee02c68a3f"}, + {file = "shapely-2.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7545a39c55cad1562be302d74c74586f79e07b592df8ada56b79a209731c0219"}, + {file = "shapely-2.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c83a36f12ec8dee2066946d98d4d841ab6512a6ed7eb742e026a64854019b5f"}, + {file = "shapely-2.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89e640c2cd37378480caf2eeda9a51be64201f01f786d127e78eaeff091ec897"}, + {file = "shapely-2.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06efe39beafde3a18a21dde169d32f315c57da962826a6d7d22630025200c5e6"}, + {file = "shapely-2.0.5-cp39-cp39-win32.whl", hash = "sha256:8203a8b2d44dcb366becbc8c3d553670320e4acf0616c39e218c9561dd738d92"}, + {file = "shapely-2.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:7fed9dbfbcfec2682d9a047b9699db8dcc890dfca857ecba872c42185fc9e64e"}, + {file = "shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, ] [package.dependencies] @@ -3753,13 +3767,13 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 [[package]] name = "tenacity" -version = "8.4.2" +version = "8.5.0" description = "Retry code until it succeeds" optional = true 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] @@ -4068,13 +4082,13 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20240622" +version = "2.32.0.20240712" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240622.tar.gz", hash = "sha256:ed5e8a412fcc39159d6319385c009d642845f250c63902718f605cd90faade31"}, - {file = "types_requests-2.32.0.20240622-py3-none-any.whl", hash = "sha256:97bac6b54b5bd4cf91d407e62f0932a74821bc2211f22116d9ee1dd643826caf"}, + {file = "types-requests-2.32.0.20240712.tar.gz", hash = "sha256:90c079ff05e549f6bf50e02e910210b98b8ff1ebdd18e19c873cd237737c1358"}, + {file = "types_requests-2.32.0.20240712-py3-none-any.whl", hash = "sha256:f754283e152c752e46e70942fa2a146b5bc70393522257bb85bd1ef7e019dcc3"}, ] [package.dependencies] @@ -4082,13 +4096,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "70.1.0.20240627" +version = "70.3.0.20240710" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-70.1.0.20240627.tar.gz", hash = "sha256:385907a47b5cf302b928ce07953cd91147d5de6f3da604c31905fdf0ec309e83"}, - {file = "types_setuptools-70.1.0.20240627-py3-none-any.whl", hash = "sha256:c7bdf05cd0a8b66868b4774c7b3c079d01ae025d8c9562bfc8bf2ff44d263c9c"}, + {file = "types-setuptools-70.3.0.20240710.tar.gz", hash = "sha256:842cbf399812d2b65042c9d6ff35113bbf282dee38794779aa1f94e597bafc35"}, + {file = "types_setuptools-70.3.0.20240710-py3-none-any.whl", hash = "sha256:bd0db2a4b9f2c49ac5564be4e0fb3125c4c46b1f73eafdcbceffa5b005cceca4"}, ] [[package]] @@ -4117,93 +4131,6 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" -[[package]] -name = "ujson" -version = "5.10.0" -description = "Ultra fast JSON encoder and decoder for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, - {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, - {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, - {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, - {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, - {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, - {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, - {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, - {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, - {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, - {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, - {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, - {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, - {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, - {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, -] - [[package]] name = "urllib3" version = "2.2.2" @@ -4729,4 +4656,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "f2d5fe214311ec582efd7760aa25147f11567ddfa1b4ca8ee8088e5798336d8f" +content-hash = "645eeaebdbc1191899f3c62d06923897d88986d7f3f0010724f974bee266a9f8" diff --git a/pyproject.toml b/pyproject.toml index eec09a2715..edf1dc4ba0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ groq = { version = "^0.9.0", optional = true } # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } pvkoala = { version = "^2.0.1", optional = true } -cartesia = { version = "^1.0.3", optional = true } +cartesia = { version = "^1.0.7", optional = true } # Transcribers google-cloud-speech = { version = "^2.26.0", optional = true } diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index ce8af4babb..df0a2f3ae9 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, TypedDict from pydantic.v1 import validator @@ -230,10 +230,18 @@ class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value DEFAULT_CARTESIA_MODEL_ID = "sonic-english" -DEFAULT_CARTESIA_VOICE_ID = "5345cf08-6f37-424d-a5d9-8ae1101b9377" +DEFAULT_CARTESIA_VOICE_ID = "829ccd10-f8b3-43cd-b8a0-4aeaa81f3b30" + + +class CartesiaVoiceControls(TypedDict): + """See https://docs.cartesia.ai/user-guides/voice-control""" + + speed: str + emotion: List[str] class CartesiaSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.CARTESIA.value): # type: ignore api_key: Optional[str] = None model_id: str = DEFAULT_CARTESIA_MODEL_ID voice_id: str = DEFAULT_CARTESIA_VOICE_ID + _experimental_voice_controls: Optional[CartesiaVoiceControls] = None diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index 7458f7f7ff..445ab03a7d 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -1,6 +1,4 @@ import hashlib -import io -import wave from vocode import getenv from vocode.streaming.models.audio import AudioEncoding, SamplingRate @@ -20,7 +18,7 @@ def __init__( try: from cartesia import AsyncCartesia except ImportError as e: - raise ImportError(f"Missing required dependancies for CartesiaSynthesizer") from e + raise ImportError("Missing required dependancies for CartesiaSynthesizer") from e self.api_key = synthesizer_config.api_key or getenv("CARTESIA_API_KEY") if not self.api_key: @@ -28,8 +26,16 @@ def __init__( self.cartesia_tts = AsyncCartesia + self._experimental_voice_controls = synthesizer_config._experimental_voice_controls + if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: match synthesizer_config.sampling_rate: + case SamplingRate.RATE_48000: + self.output_format = { + "sample_rate": 48000, + "encoding": "pcm_s16le", + "container": "raw", + } case SamplingRate.RATE_44100: self.output_format = { "sample_rate": 44100, @@ -69,12 +75,20 @@ def __init__( raise ValueError(f"Unsupported audio encoding {synthesizer_config.audio_encoding}") if not isinstance(self.output_format["sample_rate"], int): - raise ValueError(f"Invalid type for sample_rate") + raise ValueError("Invalid type for sample_rate") self.sampling_rate = self.output_format["sample_rate"] self.num_channels = 1 self.model_id = synthesizer_config.model_id self.voice_id = synthesizer_config.voice_id self.client = self.cartesia_tts(api_key=self.api_key) + self.ws = None + self.ctx = None + + async def initialize_ws(self): + if self.ws is None: + self.ws = await self.client.tts.websocket() + if self.ctx is None or self.ctx.is_closed(): + self.ctx = self.ws.context() async def create_speech_uncached( self, @@ -83,17 +97,32 @@ async def create_speech_uncached( is_first_text_chunk: bool = False, is_sole_text_chunk: bool = False, ) -> SynthesisResult: - generator = await self.client.tts.sse( - model_id=self.model_id, - transcript=message.text, - voice_id=self.voice_id, - stream=True, - output_format=self.output_format, - ) + await self.initialize_ws() + + if is_first_text_chunk and self.ws and self.ctx: + await self.ctx.no_more_inputs() + self.ctx = self.ws.context() + + transcript = message.text + + if not message.text.endswith(" "): + transcript = message.text + " " + + if self.ctx is not None: + await self.ctx.send( + model_id=self.model_id, + transcript=transcript, + voice_id=self.voice_id, + continue_=not is_sole_text_chunk, + output_format=self.output_format, + _experimental_voice_controls=self._experimental_voice_controls, + ) - async def chunk_generator(sse): + async def chunk_generator(context): buffer = bytearray() - async for event in sse: + if context.is_closed(): + return + async for event in context.receive(): audio = event.get("audio") buffer.extend(audio) while len(buffer) >= chunk_size: @@ -104,7 +133,7 @@ async def chunk_generator(sse): yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) return SynthesisResult( - chunk_generator=chunk_generator(generator), + chunk_generator=chunk_generator(self.ctx), get_message_up_to=lambda seconds: self.get_message_cutoff_from_voice_speed( message, seconds ), @@ -125,4 +154,7 @@ def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): async def tear_down(self): await super().tear_down() + if self.ctx: + self.ctx._close() + await self.ws.close() await self.client.close() From 1ac820fdeb3bd9cfd2fda2723348bc4db1fa17d1 Mon Sep 17 00:00:00 2001 From: "Peter T. Walker" <108812366+petertimwalker@users.noreply.github.com> Date: Fri, 19 Jul 2024 14:02:57 -0400 Subject: [PATCH 127/148] Typo in the word using (#647) --- docs/walkthrough_intro.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/walkthrough_intro.mdx b/docs/walkthrough_intro.mdx index 7cb3ab26a0..a1caebe343 100644 --- a/docs/walkthrough_intro.mdx +++ b/docs/walkthrough_intro.mdx @@ -6,7 +6,7 @@ description: "Setting up a simple receptionist agent" Welcome to the Vocode API! We've got a lot of powerful features that we're going to illustrate by setting up a receptionist agent that can take calls and book calendar appointments. -We'll cover how to do it step-by-step entirely via API or you could also follow along usig our +We'll cover how to do it step-by-step entirely via API or you could also follow along using our [Dashboard]("https://dashboard.vocode.dev). In particular, we'll go through the following steps: From 821fe264fc10286c3cd8937f2a52bd7bbdca5811 Mon Sep 17 00:00:00 2001 From: Yerzhan <19510938+tashbenbetov@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:03:59 +0200 Subject: [PATCH 128/148] Remove unnecessary quotation marks (#644) Co-authored-by: Ajay Raj --- docs/configuring-number.mdx | 2 +- docs/walkthrough_intro.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuring-number.mdx b/docs/configuring-number.mdx index 15f1844d44..24febbdda5 100644 --- a/docs/configuring-number.mdx +++ b/docs/configuring-number.mdx @@ -16,7 +16,7 @@ by modifying: ### Voice -First, let's create a new voice via [ElevenLabs]("https://elevenlabs.io) and grab the voice ID. +First, let's create a new voice via [ElevenLabs](https://elevenlabs.io) and grab the voice ID. ``` voice = vocode_client.voices.create_voice( diff --git a/docs/walkthrough_intro.mdx b/docs/walkthrough_intro.mdx index a1caebe343..3e65904e9d 100644 --- a/docs/walkthrough_intro.mdx +++ b/docs/walkthrough_intro.mdx @@ -7,7 +7,7 @@ Welcome to the Vocode API! We've got a lot of powerful features that we're going by setting up a receptionist agent that can take calls and book calendar appointments. We'll cover how to do it step-by-step entirely via API or you could also follow along using our -[Dashboard]("https://dashboard.vocode.dev). +[Dashboard](https://dashboard.vocode.dev). In particular, we'll go through the following steps: From a971ebc7ad3a56272432f91664abe9cfb2bd45f6 Mon Sep 17 00:00:00 2001 From: Yerzhan <19510938+tashbenbetov@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:05:50 +0200 Subject: [PATCH 129/148] Fix the error in the URL (#643) * Fix the error in the URL * Update docs/hosted-quickstart.mdx --------- Co-authored-by: Ajay Raj --- docs/hosted-quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hosted-quickstart.mdx b/docs/hosted-quickstart.mdx index 016fde2a0c..76c56af60e 100644 --- a/docs/hosted-quickstart.mdx +++ b/docs/hosted-quickstart.mdx @@ -81,5 +81,5 @@ If you'd prefer to hit our API directly, take a look at our [API Reference](/api # Hosted Walkthrough -Once you have Vocode installed, we suggest going through the [Hosted Walkthrough](/getting-number) which will +Once you have Vocode installed, we suggest going through the [Hosted Walkthrough](/walkthrough_intro) which will show you how to start interacting with the API. From eaafc1b3af0e0ff98b9aa85d2e6c79d98c4ddd8f Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 24 Jul 2024 15:10:43 -0700 Subject: [PATCH 130/148] support additional headers in external actions requester (#661) * support additional headers in external actions requester * adds test for headers * assert headers dont get overwritten --- tests/streaming/action/test_external_actions_requester.py | 4 ++++ vocode/streaming/action/external_actions_requester.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/tests/streaming/action/test_external_actions_requester.py b/tests/streaming/action/test_external_actions_requester.py index 626d5db938..86681928cd 100644 --- a/tests/streaming/action/test_external_actions_requester.py +++ b/tests/streaming/action/test_external_actions_requester.py @@ -66,9 +66,13 @@ async def test_send_request_responses( JSON_SCHEMA, base64.b64encode(os.urandom(32)).decode(), additional_payload_values={"call_id": "call_id"}, + additional_headers={"x-vocode-test": "test"}, transport=httpx.AsyncHTTPTransport(retries=3, verify=True), ) + assert httpx_mock.get_request().headers["x-vocode-test"] == "test" + assert "x-vocode-signature" in httpx_mock.get_request().headers + assert response.success is expected_success diff --git a/vocode/streaming/action/external_actions_requester.py b/vocode/streaming/action/external_actions_requester.py index 658192e7b4..76aecd9e5a 100644 --- a/vocode/streaming/action/external_actions_requester.py +++ b/vocode/streaming/action/external_actions_requester.py @@ -52,6 +52,7 @@ async def send_request( payload: Dict[str, Any], signature_secret: str, additional_payload_values: Dict[str, Any] = {}, + additional_headers: Dict[str, str] = {}, transport: httpx.AsyncHTTPTransport = httpx.AsyncHTTPTransport(retries=2), ) -> ExternalActionResponse: encoded_payload = json.dumps({"payload": payload} | additional_payload_values).encode( @@ -62,6 +63,7 @@ async def send_request( "Accept": "application/json", "Content-Type": "application/json", "x-vocode-signature": self._encode_payload(encoded_payload, signature_secret), + **additional_headers, } async with httpx.AsyncClient( From d8f8aca9122d126d7b766505bf7370a4f156afdb Mon Sep 17 00:00:00 2001 From: Adnaan Sachidanandan Date: Mon, 29 Jul 2024 13:21:59 -0700 Subject: [PATCH 131/148] Custom provider errors and add StreamingConversation to transcriber and synthesizer (#626) --- vocode/streaming/streaming_conversation.py | 2 ++ .../synthesizer/azure_synthesizer.py | 15 ++++++++++++++ .../streaming/synthesizer/base_synthesizer.py | 18 ++++++++++++++++- .../synthesizer/eleven_labs_synthesizer.py | 9 +++++++-- .../synthesizer/play_ht_synthesizer.py | 20 +++++++++++++++---- .../streaming/synthesizer/rime_synthesizer.py | 11 +++++++--- .../streaming/transcriber/base_transcriber.py | 6 +++++- 7 files changed, 70 insertions(+), 11 deletions(-) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index bb13270806..dffb154203 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -687,9 +687,11 @@ def create_state_manager(self) -> ConversationStateManager: async def start(self, mark_ready: Optional[Callable[[], Awaitable[None]]] = None): self.transcriber.start() + self.transcriber.streaming_conversation = self self.transcriptions_worker.start() self.agent_responses_worker.start() self.synthesis_results_worker.start() + self.synthesizer.streaming_conversation = self self.output_device.start() if self.filler_audio_worker is not None: self.filler_audio_worker.start() diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index eee831e296..11c4c03649 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -32,6 +32,10 @@ _AZURE_INSIDE_VOICE_REGEX = r"]*>(.*?)<\/voice>" +class AzureSynthesizerException(Exception): + pass + + class WordBoundaryEventPool: def __init__(self): self.events = [] @@ -231,6 +235,15 @@ def get_message_up_to( return ssml_fragment.split(">")[-1] return message + async def _check_stream_for_errors(self, audio_data_stream: speechsdk.AudioDataStream): + if ( + audio_data_stream.cancellation_details + and audio_data_stream.cancellation_details.reason == speechsdk.CancellationReason.Error + ): + raise AzureSynthesizerException( + f"Azure Synthesizer Error: {audio_data_stream.cancellation_details.error_details}" + ) + async def create_speech_uncached( self, message: BaseMessage, @@ -259,6 +272,8 @@ async def chunk_generator( self.thread_pool_executor, lambda: audio_data_stream.read_data(audio_buffer), ) + + await self._check_stream_for_errors(audio_data_stream) if filled_size != chunk_size: yield SynthesisResult.ChunkResult(chunk_transform(audio_buffer[offset:]), True) return diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index f6e70aca0b..b41c30db74 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -4,7 +4,18 @@ import math import os import wave -from typing import Any, AsyncGenerator, Callable, Generic, List, Optional, Tuple, TypeVar, Union +from typing import ( + TYPE_CHECKING, + Any, + AsyncGenerator, + Callable, + Generic, + List, + Optional, + Tuple, + TypeVar, + Union, +) import aiohttp from loguru import logger @@ -24,6 +35,9 @@ from vocode.streaming.utils.create_task import asyncio_create_task from vocode.streaming.utils.worker import QueueConsumer +if TYPE_CHECKING: + from vocode.streaming.streaming_conversation import StreamingConversation + FILLER_PHRASES = [ BaseMessage(text="Um..."), BaseMessage(text="Uh..."), @@ -224,6 +238,8 @@ def create_synthesis_result(self, chunk_size) -> SynthesisResult: class BaseSynthesizer(Generic[SynthesizerConfigType]): + streaming_conversation: "StreamingConversation" + def __init__( self, synthesizer_config: SynthesizerConfigType, diff --git a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py index 1ccd435475..8beb31bf44 100644 --- a/vocode/streaming/synthesizer/eleven_labs_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_synthesizer.py @@ -16,6 +16,10 @@ STREAMED_CHUNK_SIZE = 16000 * 2 // 4 # 1/8 of a second of 16kHz audio with 16-bit samples +class ElevenlabsException(Exception): + pass + + class ElevenLabsSynthesizer(BaseSynthesizer[ElevenLabsSynthesizerConfig]): def __init__( self, @@ -144,8 +148,9 @@ async def get_chunks( if not stream.is_success: error = await stream.aread() - logger.error(f"ElevenLabs API failed: {stream.status_code} {error.decode('utf-8')}") - raise Exception(f"ElevenLabs API returned {stream.status_code} status code") + raise ElevenlabsException( + f"ElevenLabs API returned {stream.status_code} status code and the following details: {error.decode('utf-8')}" + ) async for chunk in stream.aiter_bytes(chunk_size): if self.upsample: chunk = self._resample_chunk( diff --git a/vocode/streaming/synthesizer/play_ht_synthesizer.py b/vocode/streaming/synthesizer/play_ht_synthesizer.py index 05405af9d3..46c361bc47 100644 --- a/vocode/streaming/synthesizer/play_ht_synthesizer.py +++ b/vocode/streaming/synthesizer/play_ht_synthesizer.py @@ -12,6 +12,10 @@ TTS_ENDPOINT = "https://play.ht/api/v2/tts/stream" +class PlayHTV1APIError(Exception): + pass + + class PlayHtSynthesizer(BaseSynthesizer[PlayHtSynthesizerConfig]): def __init__( self, @@ -78,15 +82,23 @@ async def create_speech_uncached( timeout=ClientTimeout(total=15), ) if not response.ok: - raise Exception(f"Play.ht API error status code {response.status}") + response_json = await response.json() + if response_json and "error_message" in response_json: + error_message = response_json["error_message"] + else: + error_message = ( + f"Request to Play.HT failed with status code {str(response.status)}" + ) + + raise PlayHTV1APIError( + f"Play.ht API error status code {response.status}", + error_message, + ) if response.status == 429 and attempt < max_backoff_retries - 1: await asyncio.sleep(backoff_retry_delay) backoff_retry_delay *= 2 # Exponentially increase delay continue - if not response.ok: - raise Exception(f"Play.ht API error status code {response.status}") - if self.experimental_streaming: return SynthesisResult( self.experimental_mp3_streaming_output_generator( diff --git a/vocode/streaming/synthesizer/rime_synthesizer.py b/vocode/streaming/synthesizer/rime_synthesizer.py index f776da4a81..b00cd872b3 100644 --- a/vocode/streaming/synthesizer/rime_synthesizer.py +++ b/vocode/streaming/synthesizer/rime_synthesizer.py @@ -25,6 +25,10 @@ WAV_HEADER_LENGTH = 44 +class RimeError(Exception): + pass + + class RimeSynthesizer(BaseSynthesizer[RimeSynthesizerConfig]): def __init__( self, @@ -73,7 +77,7 @@ async def create_speech_uncached( timeout=aiohttp.ClientTimeout(total=15), ) as response: if not response.ok: - raise Exception(f"Rime API error: {response.status}, {await response.text()}") + raise RimeError(f"Rime API error: {response.status}, {await response.text()}") data = json.loads(await response.text()) audio_content = data.get("audioContent") @@ -117,8 +121,9 @@ async def get_chunks( ) if not stream.is_success: error = await stream.aread() - logger.error(f"Rime API failed: {stream.status_code} {error.decode('utf-8')}") - raise Exception(f"Rime API returned {stream.status_code} status code") + raise RimeError( + f"Rime API returned {stream.status_code} status code with the following details: {error.decode('utf-8')}" + ) async for chunk in stream.aiter_bytes(chunk_size): chunk_queue.put_nowait(chunk) except asyncio.CancelledError: diff --git a/vocode/streaming/transcriber/base_transcriber.py b/vocode/streaming/transcriber/base_transcriber.py index edd1009d48..2f05b28446 100644 --- a/vocode/streaming/transcriber/base_transcriber.py +++ b/vocode/streaming/transcriber/base_transcriber.py @@ -3,18 +3,22 @@ import asyncio import audioop from abc import ABC, abstractmethod -from typing import Generic, Optional, TypeVar, Union +from typing import TYPE_CHECKING, Generic, Optional, TypeVar, Union from vocode.streaming.models.audio import AudioEncoding from vocode.streaming.models.transcriber import TranscriberConfig, Transcription from vocode.streaming.utils.speed_manager import SpeedManager from vocode.streaming.utils.worker import AbstractWorker, AsyncWorker, ThreadAsyncWorker +if TYPE_CHECKING: + from vocode.streaming.streaming_conversation import StreamingConversation + TranscriberConfigType = TypeVar("TranscriberConfigType", bound=TranscriberConfig) class AbstractTranscriber(Generic[TranscriberConfigType], AbstractWorker[bytes]): consumer: AbstractWorker[Transcription] + streaming_conversation: "StreamingConversation" def __init__(self, transcriber_config: TranscriberConfigType): AbstractWorker.__init__(self) From 11e8d24eafefb9092e4c7a560995ed06ba180a29 Mon Sep 17 00:00:00 2001 From: Sauhard Jain Date: Mon, 29 Jul 2024 13:54:42 -0700 Subject: [PATCH 132/148] Improve Cartesia Synthesizer error handling (#663) * feat: upgrade cartesia to 1.0.7 and support for continuations * prevent errors * fix: review comments * Update vocode/streaming/models/synthesizer.py * fix: improve error handling * fix: intialize ctx * chore: lint fix --------- Co-authored-by: Ajay Raj --- .../synthesizer/cartesia_synthesizer.py | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index 445ab03a7d..e9ea6ac210 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -1,5 +1,7 @@ import hashlib +from loguru import logger + from vocode import getenv from vocode.streaming.models.audio import AudioEncoding, SamplingRate from vocode.streaming.models.message import BaseMessage @@ -87,8 +89,15 @@ def __init__( async def initialize_ws(self): if self.ws is None: self.ws = await self.client.tts.websocket() + + async def initialize_ctx(self, is_first_text_chunk: bool): if self.ctx is None or self.ctx.is_closed(): - self.ctx = self.ws.context() + if self.ws: + self.ctx = self.ws.context() + else: + if is_first_text_chunk: + await self.ctx.no_more_inputs() + self.ctx = self.ws.context() async def create_speech_uncached( self, @@ -98,10 +107,7 @@ async def create_speech_uncached( is_sole_text_chunk: bool = False, ) -> SynthesisResult: await self.initialize_ws() - - if is_first_text_chunk and self.ws and self.ctx: - await self.ctx.no_more_inputs() - self.ctx = self.ws.context() + await self.initialize_ctx(is_first_text_chunk) transcript = message.text @@ -122,15 +128,22 @@ async def chunk_generator(context): buffer = bytearray() if context.is_closed(): return - async for event in context.receive(): - audio = event.get("audio") - buffer.extend(audio) - while len(buffer) >= chunk_size: - yield SynthesisResult.ChunkResult( - chunk=buffer[:chunk_size], is_last_chunk=False - ) - buffer = buffer[chunk_size:] - yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) + try: + async for event in context.receive(): + audio = event.get("audio") + buffer.extend(audio) + while len(buffer) >= chunk_size: + yield SynthesisResult.ChunkResult( + chunk=buffer[:chunk_size], is_last_chunk=False + ) + buffer = buffer[chunk_size:] + except Exception as e: + logger.info( + f"Caught error while receiving audio chunks from CartesiaSynthesizer: {e}" + ) + self.ctx._close() + if buffer: + yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) return SynthesisResult( chunk_generator=chunk_generator(self.ctx), From 3bc8f8d762a9cdbcb8644593515c153267b2e9b4 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 29 Jul 2024 14:10:54 -0700 Subject: [PATCH 133/148] Update agents.mdx (#664) --- docs/agents.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/agents.mdx b/docs/agents.mdx index 6dc809afae..f0fbc935c7 100644 --- a/docs/agents.mdx +++ b/docs/agents.mdx @@ -29,6 +29,6 @@ agent behavior: - `language` sets the agent language (for more context see [Multilingual Agents](/multilingual)) - `initial_message` controls the agents first utterance. - `initial_message_delay` adds a delay to the initial message from when the call begins -- `ask_if_human_present_on_idle` allows the agent to speak when there is more than 4s of silence on the call +- `ask_if_human_present_on_idle` allows the agent to speak when there is more than 15s of silence on the call - `llm_temperature` controls the behavior of the underlying language model. Values can range from 0 to 1, with higher values leading to more diverse and creative results. Lower values generate more consistent outputs. From adf0d87eede754644c51e8a364988efd72932f54 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Mon, 29 Jul 2024 17:48:18 -0700 Subject: [PATCH 134/148] poetry version prerelease (#665) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index edf1dc4ba0..0a5184e45f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.114a0" +version = "0.1.114a1" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From 2ecc631c690d727d3aa0e741292207dee98f6b7b Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 7 Aug 2024 10:24:11 -0700 Subject: [PATCH 135/148] fix pinecone lint (#679) --- vocode/streaming/vector_db/pinecone.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vocode/streaming/vector_db/pinecone.py b/vocode/streaming/vector_db/pinecone.py index 26cd048f36..ba40fda5c2 100644 --- a/vocode/streaming/vector_db/pinecone.py +++ b/vocode/streaming/vector_db/pinecone.py @@ -16,6 +16,8 @@ def __init__(self, config: PineconeConfig, *args, **kwargs) -> None: self.index_name = self.config.index self.pinecone_api_key = getenv("PINECONE_API_KEY") or self.config.api_key + if not self.pinecone_api_key: + raise ValueError("Pinecone API key not set") self.pinecone_environment = getenv("PINECONE_ENVIRONMENT") or self.config.api_environment self.pinecone_url = f"https://{self.index_name}.svc.{self.pinecone_environment}.pinecone.io" self._text_key = "text" From c1148e3985d026d47ecfdfba4259e1b91107f52a Mon Sep 17 00:00:00 2001 From: Sauhard Jain Date: Wed, 7 Aug 2024 11:01:29 -0700 Subject: [PATCH 136/148] Include cartesia's voice controls on docs + update synthesizer (#674) * docs: include cartesia's voice controls * fix lint and add padding * fix: end of sentence issues * lint and upgrade cartesia * fix: pydantic casting issue * lockfile * fix pinecone lint --- docs/open-source/using-synthesizers.mdx | 48 +- poetry.lock | 1879 +++++++++-------- pyproject.toml | 2 +- roadmap.md | 1 + vocode/streaming/models/synthesizer.py | 12 +- .../synthesizer/cartesia_synthesizer.py | 39 +- vocode/streaming/vector_db/pinecone.py | 13 +- 7 files changed, 1068 insertions(+), 926 deletions(-) diff --git a/docs/open-source/using-synthesizers.mdx b/docs/open-source/using-synthesizers.mdx index 013ce23729..6bbb57c0b6 100644 --- a/docs/open-source/using-synthesizers.mdx +++ b/docs/open-source/using-synthesizers.mdx @@ -13,13 +13,14 @@ Vocode currently supports the following synthesizers: 1. Azure (Microsoft) 2. Google -3. Eleven Labs -4. Rime -5. Play.ht -6. GTTS (Google Text-to-Speech) -7. Stream Elements -8. Bark -9. Amazon Polly +3. Cartesia +4. Eleven Labs +5. Rime +6. Play.ht +7. GTTS (Google Text-to-Speech) +8. Stream Elements +9. Bark +10. Amazon Polly These synthesizers are defined using their respective configuration classes, which are subclasses of the `SynthesizerConfig` class. @@ -83,7 +84,38 @@ synthesizer_config=PlayHtSynthesizerConfig.from_telephone_output_device( ... ``` -### Example 2: Using Azure in StreamingConversation locally +### Example 2: Using Cartesia's streaming synthesizer + +We support Cartesia's [low-latency streaming API](https://docs.cartesia.ai/api-reference/endpoints/stream-speech-websocket) enabled by WebSockets. You can use the `CartesiaSynthesizer` with the `CartesiaSynthesizerConfig` to enable this feature. + +#### Telephony + +```python +synthesizer_config=CartesiaSynthesizerConfig.from_telephone_output_device( + api_key=os.getenv("CARTESIA_API_KEY"), + voice_id=os.getenv("CARTESIA_VOICE_ID"), +) +``` + +In this example, the `CartesiaSynthesizerConfig.from_output_device()` method is used to create a configuration object for the Cartesia synthesizer. +The method takes a `speaker_output` object as an argument, and extracts the `sampling_rate` and `audio_encoding` from the output device. + +#### Controlling Speed & Emotions + +You can set the `speed` and `emotion` parameters in the `CartesiaSynthesizerConfig` object to control the speed and emotions of the agent's voice! See [this page](https://docs.cartesia.ai/user-guides/voice-control) for more details. + +```python +CartesiaSynthesizerConfig( + api_key=os.getenv("CARTESIA_API_KEY"), + voice_id=os.getenv("CARTESIA_VOICE_ID"), + experimental_voice_controls={ + "speed": "slow", + "emotion": "positivity: high" + } +) +``` + +### Example 3: Using Azure in StreamingConversation locally ```python from vocode.streaming.models.synthesizer import AzureSynthesizerConfig diff --git a/poetry.lock b/poetry.lock index e6030148a9..e9caa21b30 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,91 +1,103 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "aiohappyeyeballs" +version = "2.3.5" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, + {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, +] + [[package]] name = "aiohttp" -version = "3.9.5" +version = "3.10.1" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, - {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, - {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, - {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, - {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, - {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, - {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, - {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, - {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, - {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, - {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, - {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, - {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, - {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, - {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, - {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, - {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, - {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, - {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, - {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, - {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, - {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, - {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, - {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, - {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, - {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, - {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, + {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:47b4c2412960e64d97258f40616efddaebcb34ff664c8a972119ed38fac2a62c"}, + {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7dbf637f87dd315fa1f36aaed8afa929ee2c607454fb7791e74c88a0d94da59"}, + {file = "aiohttp-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8fb76214b5b739ce59e2236a6489d9dc3483649cfd6f563dbf5d8e40dbdd57d"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c577cdcf8f92862363b3d598d971c6a84ed8f0bf824d4cc1ce70c2fb02acb4a"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:777e23609899cb230ad2642b4bdf1008890f84968be78de29099a8a86f10b261"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b07286a1090483799599a2f72f76ac396993da31f6e08efedb59f40876c144fa"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9db600a86414a9a653e3c1c7f6a2f6a1894ab8f83d11505247bd1b90ad57157"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c3f1eb280008e51965a8d160a108c333136f4a39d46f516c64d2aa2e6a53f2"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f5dd109a925fee4c9ac3f6a094900461a2712df41745f5d04782ebcbe6479ccb"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8c81ff4afffef9b1186639506d70ea90888218f5ddfff03870e74ec80bb59970"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2a384dfbe8bfebd203b778a30a712886d147c61943675f4719b56725a8bbe803"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b9fb6508893dc31cfcbb8191ef35abd79751db1d6871b3e2caee83959b4d91eb"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:88596384c3bec644a96ae46287bb646d6a23fa6014afe3799156aef42669c6bd"}, + {file = "aiohttp-3.10.1-cp310-cp310-win32.whl", hash = "sha256:68164d43c580c2e8bf8e0eb4960142919d304052ccab92be10250a3a33b53268"}, + {file = "aiohttp-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:d6bbe2c90c10382ca96df33b56e2060404a4f0f88673e1e84b44c8952517e5f3"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6979b4f20d3e557a867da9d9227de4c156fcdcb348a5848e3e6190fd7feb972"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03c0c380c83f8a8d4416224aafb88d378376d6f4cadebb56b060688251055cd4"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c2b104e81b3c3deba7e6f5bc1a9a0e9161c380530479970766a6655b8b77c7c"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b023b68c61ab0cd48bd38416b421464a62c381e32b9dc7b4bdfa2905807452a4"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a07c76a82390506ca0eabf57c0540cf5a60c993c442928fe4928472c4c6e5e6"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41d8dab8c64ded1edf117d2a64f353efa096c52b853ef461aebd49abae979f16"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615348fab1a9ef7d0960a905e83ad39051ae9cb0d2837da739b5d3a7671e497a"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:256ee6044214ee9d66d531bb374f065ee94e60667d6bbeaa25ca111fc3997158"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d5bb926805022508b7ddeaad957f1fce7a8d77532068d7bdb431056dc630cd"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:028faf71b338f069077af6315ad54281612705d68889f5d914318cbc2aab0d50"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5c12310d153b27aa630750be44e79313acc4e864c421eb7d2bc6fa3429c41bf8"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:de1a91d5faded9054957ed0a9e01b9d632109341942fc123947ced358c5d9009"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9c186b270979fb1dee3ababe2d12fb243ed7da08b30abc83ebac3a928a4ddb15"}, + {file = "aiohttp-3.10.1-cp311-cp311-win32.whl", hash = "sha256:4a9ce70f5e00380377aac0e568abd075266ff992be2e271765f7b35d228a990c"}, + {file = "aiohttp-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:a77c79bac8d908d839d32c212aef2354d2246eb9deb3e2cb01ffa83fb7a6ea5d"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2212296cdb63b092e295c3e4b4b442e7b7eb41e8a30d0f53c16d5962efed395d"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4dcb127ca3eb0a61205818a606393cbb60d93b7afb9accd2fd1e9081cc533144"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb8b79a65332e1a426ccb6290ce0409e1dc16b4daac1cc5761e059127fa3d134"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc24f707ed9cb961f6ee04020ca01de2c89b2811f3cf3361dc7c96a14bfbcc"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cb54f5725b4b37af12edf6c9e834df59258c82c15a244daa521a065fbb11717"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d03e948e53b3639ce4d438f3d1d8202898ec6655cadcc09ec99229d4adc2a9"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786299d719eb5d868f161aeec56d589396b053925b7e0ce36e983d30d0a3e55c"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abda4009a30d51d3f06f36bc7411a62b3e647fa6cc935ef667e3e3d3a7dd09b1"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67f7639424c313125213954e93a6229d3a1d386855d70c292a12628f600c7150"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e5a26d7aac4c0d8414a347da162696eea0629fdce939ada6aedf951abb1d745"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:120548d89f14b76a041088b582454d89389370632ee12bf39d919cc5c561d1ca"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f5293726943bdcea24715b121d8c4ae12581441d22623b0e6ab12d07ce85f9c4"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f8605e573ed6c44ec689d94544b2c4bb1390aaa723a8b5a2cc0a5a485987a68"}, + {file = "aiohttp-3.10.1-cp312-cp312-win32.whl", hash = "sha256:e7168782621be4448d90169a60c8b37e9b0926b3b79b6097bc180c0a8a119e73"}, + {file = "aiohttp-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fbf8c0ded367c5c8eaf585f85ca8dd85ff4d5b73fb8fe1e6ac9e1b5e62e11f7"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:54b7f4a20d7cc6bfa4438abbde069d417bb7a119f870975f78a2b99890226d55"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fa643ca990323db68911b92f3f7a0ca9ae300ae340d0235de87c523601e58d9"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8311d0d690487359fe2247ec5d2cac9946e70d50dced8c01ce9e72341c21151"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222821c60b8f6a64c5908cb43d69c0ee978a1188f6a8433d4757d39231b42cdb"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7b55d9ede66af7feb6de87ff277e0ccf6d51c7db74cc39337fe3a0e31b5872d"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a95151a5567b3b00368e99e9c5334a919514f60888a6b6d2054fea5e66e527e"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9e9171d2fe6bfd9d3838a6fe63b1e91b55e0bf726c16edf265536e4eafed19"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a57e73f9523e980f6101dc9a83adcd7ac0006ea8bf7937ca3870391c7bb4f8ff"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0df51a3d70a2bfbb9c921619f68d6d02591f24f10e9c76de6f3388c89ed01de6"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b0de63ff0307eac3961b4af74382d30220d4813f36b7aaaf57f063a1243b4214"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8db9b749f589b5af8e4993623dbda6716b2b7a5fcb0fa2277bf3ce4b278c7059"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6b14c19172eb53b63931d3e62a9749d6519f7c121149493e6eefca055fcdb352"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cd57ad998e3038aa87c38fe85c99ed728001bf5dde8eca121cadee06ee3f637"}, + {file = "aiohttp-3.10.1-cp38-cp38-win32.whl", hash = "sha256:df31641e3f02b77eb3c5fb63c0508bee0fc067cf153da0e002ebbb0db0b6d91a"}, + {file = "aiohttp-3.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:93094eba50bc2ad4c40ff4997ead1fdcd41536116f2e7d6cfec9596a8ecb3615"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:440954ddc6b77257e67170d57b1026aa9545275c33312357472504eef7b4cc0b"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9f8beed277488a52ee2b459b23c4135e54d6a819eaba2e120e57311015b58e9"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8a8221a63602008550022aa3a4152ca357e1dde7ab3dd1da7e1925050b56863"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a702bd3663b5cbf3916e84bf332400d24cdb18399f0877ca6b313ce6c08bfb43"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1988b370536eb14f0ce7f3a4a5b422ab64c4e255b3f5d7752c5f583dc8c967fc"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ccf1f0a304352c891d124ac1a9dea59b14b2abed1704aaa7689fc90ef9c5be1"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3ea6ef2a83edad84bbdb5d96e22f587b67c68922cd7b6f9d8f24865e655bcf"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b47c125ab07f0831803b88aeb12b04c564d5f07a1c1a225d4eb4d2f26e8b5e"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21778552ef3d44aac3278cc6f6d13a6423504fa5f09f2df34bfe489ed9ded7f5"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bde0693073fd5e542e46ea100aa6c1a5d36282dbdbad85b1c3365d5421490a92"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bf66149bb348d8e713f3a8e0b4f5b952094c2948c408e1cfef03b49e86745d60"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:587237571a85716d6f71f60d103416c9df7d5acb55d96d3d3ced65f39bff9c0c"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bfe33cba6e127d0b5b417623c9aa621f0a69f304742acdca929a9fdab4593693"}, + {file = "aiohttp-3.10.1-cp39-cp39-win32.whl", hash = "sha256:9fbff00646cf8211b330690eb2fd64b23e1ce5b63a342436c1d1d6951d53d8dd"}, + {file = "aiohttp-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:5951c328f9ac42d7bce7a6ded535879bc9ae13032818d036749631fa27777905"}, + {file = "aiohttp-3.10.1.tar.gz", hash = "sha256:8b0d058e4e425d3b45e8ec70d49b402f4d6b21041e674798b1f91ba027c73f28"}, ] [package.dependencies] +aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" @@ -94,7 +106,7 @@ multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "brotlicffi"] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] [[package]] name = "aiohttp-retry" @@ -209,22 +221,22 @@ files = [ [[package]] name = "attrs" -version = "23.2.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "azure-cognitiveservices-speech" @@ -243,33 +255,33 @@ files = [ [[package]] name = "black" -version = "24.4.2" +version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -300,13 +312,13 @@ files = [ [[package]] name = "cartesia" -version = "1.0.7" +version = "1.0.10" description = "The official Python library for the Cartesia API." optional = true python-versions = ">=3.8.0" files = [ - {file = "cartesia-1.0.7-py2.py3-none-any.whl", hash = "sha256:c4743c0ac6b42fcf77cb5b86afb2ad61f1b6f1fe7d717eb7a8ddac987fc4e550"}, - {file = "cartesia-1.0.7.tar.gz", hash = "sha256:fb0824c22fad9313cad9b4d56e72d907b05797e028a39b0c591e3eaf70b23735"}, + {file = "cartesia-1.0.10-py2.py3-none-any.whl", hash = "sha256:99a25ca4e00a7104f4395d3dda9b1d04bb9112e51eea8a1756172877b9f2e889"}, + {file = "cartesia-1.0.10.tar.gz", hash = "sha256:b9d839e0fe7db4daacd3da858f6ef2c82c70daf18828c38e10dbc70dd9c060cd"}, ] [package.dependencies] @@ -334,63 +346,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -522,63 +549,83 @@ files = [ [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, - {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, - {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, - {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, - {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, - {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, - {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, - {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, - {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, - {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -589,43 +636,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.8" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e"}, - {file = "cryptography-42.0.8-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949"}, - {file = "cryptography-42.0.8-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b"}, - {file = "cryptography-42.0.8-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7"}, - {file = "cryptography-42.0.8-cp37-abi3-win32.whl", hash = "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2"}, - {file = "cryptography-42.0.8-cp37-abi3-win_amd64.whl", hash = "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba"}, - {file = "cryptography-42.0.8-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c"}, - {file = "cryptography-42.0.8-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1"}, - {file = "cryptography-42.0.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14"}, - {file = "cryptography-42.0.8-cp39-abi3-win32.whl", hash = "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c"}, - {file = "cryptography-42.0.8-cp39-abi3-win_amd64.whl", hash = "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71"}, - {file = "cryptography-42.0.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648"}, - {file = "cryptography-42.0.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad"}, - {file = "cryptography-42.0.8.tar.gz", hash = "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -638,7 +680,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -728,18 +770,19 @@ files = [ [[package]] name = "elevenlabs" -version = "1.4.1" +version = "1.6.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.4.1-py3-none-any.whl", hash = "sha256:844fa386822746f2b37e4a4d29d72f42877bcbcaee71a99a140349419160940e"}, - {file = "elevenlabs-1.4.1.tar.gz", hash = "sha256:8df9e252f2bb11b2d0175071661c716238e9074e66eaf5d0c52aeab6b6fd39ad"}, + {file = "elevenlabs-1.6.1-py3-none-any.whl", hash = "sha256:1017f3c85b31995fab0ca02958b980bbc09590f0a29bf76db4c043ac93850d5e"}, + {file = "elevenlabs-1.6.1.tar.gz", hash = "sha256:59128170ee710bb6248de34e6a48d707e8044dc48a0229774efc29faae4a86d3"}, ] [package.dependencies] httpx = ">=0.21.2" pydantic = ">=1.9.2" +pydantic-core = ">=2.18.2,<3.0.0" requests = ">=2.20" typing_extensions = ">=4.0.0" websockets = ">=11.0" @@ -775,13 +818,13 @@ test = ["pytest (>=6)"] [[package]] name = "fakeredis" -version = "2.23.3" +version = "2.23.5" description = "Python implementation of redis API, can be used for testing purposes." optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "fakeredis-2.23.3-py3-none-any.whl", hash = "sha256:4779be828f4ebf53e1a286fd11e2ffe0f510d3e5507f143d644e67a07387d759"}, - {file = "fakeredis-2.23.3.tar.gz", hash = "sha256:0c67caa31530114f451f012eca920338c5eb83fa7f1f461dd41b8d2488a99cba"}, + {file = "fakeredis-2.23.5-py3-none-any.whl", hash = "sha256:4d85b1b6b3a80cbbb3a8967f8686f7bf6ddf5bd7cd5ac7ac90b3561d8c3a7ddb"}, + {file = "fakeredis-2.23.5.tar.gz", hash = "sha256:edffc79fdce0f1d83cbb20b52694a9cba4a5fe5beb627c11722a42aa0fa44f52"}, ] [package.dependencies] @@ -823,20 +866,21 @@ all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" [[package]] name = "fastapi-cli" -version = "0.0.4" +version = "0.0.5" description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, - {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, + {file = "fastapi_cli-0.0.5-py3-none-any.whl", hash = "sha256:e94d847524648c748a5350673546bbf9bcaeb086b33c24f2e82e021436866a46"}, + {file = "fastapi_cli-0.0.5.tar.gz", hash = "sha256:d30e1239c6f46fcb95e606f02cdda59a1e2fa778a54b64686b3ff27f6211ff9f"}, ] [package.dependencies] typer = ">=0.12.3" +uvicorn = {version = ">=0.15.0", extras = ["standard"]} [package.extras] -standard = ["fastapi", "uvicorn[standard] (>=0.15.0)"] +standard = ["uvicorn[standard] (>=0.15.0)"] [[package]] name = "filelock" @@ -1012,13 +1056,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.32.0" +version = "2.33.0" description = "Google Authentication Library" optional = true python-versions = ">=3.7" files = [ - {file = "google_auth-2.32.0-py2.py3-none-any.whl", hash = "sha256:53326ea2ebec768070a94bee4e1b9194c9646ea0c2bd72422785bd0f9abfad7b"}, - {file = "google_auth-2.32.0.tar.gz", hash = "sha256:49315be72c55a6a37d62819e3573f6b416aca00721f7e3e31a008d928bf64022"}, + {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, + {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, ] [package.dependencies] @@ -1035,13 +1079,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-aiplatform" -version = "1.59.0" +version = "1.60.0" description = "Vertex AI API client library" optional = true python-versions = ">=3.8" files = [ - {file = "google-cloud-aiplatform-1.59.0.tar.gz", hash = "sha256:2bebb59c0ba3e3b4b568305418ca1b021977988adbee8691a5bed09b037e7e63"}, - {file = "google_cloud_aiplatform-1.59.0-py2.py3-none-any.whl", hash = "sha256:549e6eb1844b0f853043309138ebe2db00de4bbd8197b3bde26804ac163ef52a"}, + {file = "google-cloud-aiplatform-1.60.0.tar.gz", hash = "sha256:782c7f1ec0e77a7c7daabef3b65bfd506ed2b4b1dc2186753c43cd6faf8dd04e"}, + {file = "google_cloud_aiplatform-1.60.0-py2.py3-none-any.whl", hash = "sha256:5f14159c9575f4b46335027e3ceb8fa57bd5eaa76a07f858105b8c6c034ec0d6"}, ] [package.dependencies] @@ -1063,8 +1107,8 @@ cloud-profiler = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow datasets = ["pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)"] endpoint = ["requests (>=2.28.1)"] full = ["cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)"] -langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "tenacity (<=8.3)"] -langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.2)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "tenacity (<=8.3)"] +langchain = ["langchain (>=0.1.16,<0.3)", "langchain-core (<0.3)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "tenacity (<=8.3)"] +langchain-testing = ["absl-py", "cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "langchain (>=0.1.16,<0.3)", "langchain-core (<0.3)", "langchain-google-vertexai (<2)", "openinference-instrumentation-langchain (>=0.1.19,<0.2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)", "pytest-xdist", "tenacity (<=8.3)"] lit = ["explainable-ai-sdk (>=1.0.0)", "lit-nlp (==0.4.0)", "pandas (>=1.0.0)", "tensorflow (>=2.3.0,<3.0.0dev)"] metadata = ["numpy (>=1.15.0)", "pandas (>=1.0.0)"] pipelines = ["pyyaml (>=5.3.1,<7)"] @@ -1074,7 +1118,7 @@ private-endpoints = ["requests (>=2.28.1)", "urllib3 (>=1.21.1,<1.27)"] rapid-evaluation = ["pandas (>=1.0.0,<2.2.0)", "tqdm (>=4.23.0)"] ray = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "setuptools (<70.0.0)"] ray-testing = ["google-cloud-bigquery", "google-cloud-bigquery-storage", "immutabledict", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pytest-xdist", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "ray[train] (==2.9.3)", "scikit-learn", "setuptools (<70.0.0)", "tensorflow", "torch (>=2.0.0,<2.1.0)", "xgboost", "xgboost-ray"] -reasoningengine = ["cloudpickle (>=3.0,<4.0)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] +reasoningengine = ["cloudpickle (>=3.0,<4.0)", "google-cloud-trace (<2)", "opentelemetry-exporter-gcp-trace (<2)", "opentelemetry-sdk (<2)", "pydantic (>=2.6.3,<3)"] tensorboard = ["tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "werkzeug (>=2.0.0,<2.1.0dev)"] testing = ["bigframes", "cloudpickle (<3.0)", "docker (>=5.0.3)", "explainable-ai-sdk (>=1.0.0)", "fastapi (>=0.71.0,<=0.109.1)", "google-api-core (>=2.11,<3.0.0)", "google-cloud-bigquery", "google-cloud-bigquery-storage", "google-cloud-logging (<4.0)", "google-vizier (>=0.1.6)", "grpcio-testing", "httpx (>=0.23.0,<0.25.0)", "immutabledict", "ipython", "kfp (>=2.6.0,<3.0.0)", "lit-nlp (==0.4.0)", "mlflow (>=1.27.0,<=2.1.1)", "nltk", "numpy (>=1.15.0)", "pandas (>=1.0.0)", "pandas (>=1.0.0,<2.2.0)", "pyarrow (>=10.0.1)", "pyarrow (>=14.0.0)", "pyarrow (>=3.0.0,<8.0dev)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyfakefs", "pytest-asyncio", "pytest-xdist", "pyyaml (>=5.3.1,<7)", "ray[default] (>=2.4,<2.5.dev0 || >2.9.0,!=2.9.1,!=2.9.2,<=2.9.3)", "ray[default] (>=2.5,<=2.9.3)", "requests (>=2.28.1)", "requests-toolbelt (<1.0.0)", "scikit-learn", "sentencepiece (>=0.2.0)", "setuptools (<70.0.0)", "starlette (>=0.17.1)", "tensorboard-plugin-profile (>=2.4.0,<3.0.0dev)", "tensorflow (==2.13.0)", "tensorflow (==2.16.1)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.3.0,<3.0.0dev)", "tensorflow (>=2.4.0,<3.0.0dev)", "torch (>=2.0.0,<2.1.0)", "torch (>=2.2.0)", "tqdm (>=4.23.0)", "urllib3 (>=1.21.1,<1.27)", "uvicorn[standard] (>=0.16.0)", "werkzeug (>=2.0.0,<2.1.0dev)", "xgboost"] tokenization = ["sentencepiece (>=0.2.0)"] @@ -1132,13 +1176,13 @@ grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] [[package]] name = "google-cloud-resource-manager" -version = "1.12.4" +version = "1.12.5" description = "Google Cloud Resource Manager API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-resource-manager-1.12.4.tar.gz", hash = "sha256:3eda914a925e92465ef80faaab7e0f7a9312d486dd4e123d2c76e04bac688ff0"}, - {file = "google_cloud_resource_manager-1.12.4-py2.py3-none-any.whl", hash = "sha256:0b6663585f7f862166c0fb4c55fdda721fce4dc2dc1d5b52d03ee4bf2653a85f"}, + {file = "google_cloud_resource_manager-1.12.5-py2.py3-none-any.whl", hash = "sha256:2708a718b45c79464b7b21559c701b5c92e6b0b1ab2146d0a256277a623dc175"}, + {file = "google_cloud_resource_manager-1.12.5.tar.gz", hash = "sha256:b7af4254401ed4efa3aba3a929cb3ddb803fa6baf91a78485e45583597de5891"}, ] [package.dependencies] @@ -1150,13 +1194,13 @@ protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4 [[package]] name = "google-cloud-speech" -version = "2.26.1" +version = "2.27.0" description = "Google Cloud Speech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-speech-2.26.1.tar.gz", hash = "sha256:12aceb02e34c14ed49eea3102ae7e776dfd8722babdd1466de4db0de8c1f91a9"}, - {file = "google_cloud_speech-2.26.1-py2.py3-none-any.whl", hash = "sha256:51566c55f74288767afa91fd25c9563cfcf61ed417eb3301d4cb58c5ee4abe77"}, + {file = "google_cloud_speech-2.27.0-py2.py3-none-any.whl", hash = "sha256:993b6e71e8ff91f614edc909d08df4638a19a58834725dd84553bfc024204b69"}, + {file = "google_cloud_speech-2.27.0.tar.gz", hash = "sha256:6174d321cc81a58b36bde6e8399d7531d5012393953872a468cb664e42868385"}, ] [package.dependencies] @@ -1167,13 +1211,13 @@ protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4 [[package]] name = "google-cloud-storage" -version = "2.17.0" +version = "2.18.1" description = "Google Cloud Storage API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-storage-2.17.0.tar.gz", hash = "sha256:49378abff54ef656b52dca5ef0f2eba9aa83dc2b2c72c78714b03a1a95fe9388"}, - {file = "google_cloud_storage-2.17.0-py2.py3-none-any.whl", hash = "sha256:5b393bc766b7a3bc6f5407b9e665b2450d36282614b7945e570b3480a456d1e1"}, + {file = "google_cloud_storage-2.18.1-py2.py3-none-any.whl", hash = "sha256:9d8db6bde3a979cca7150511cd0e4cb363e5f69d31259d890ba1124fa109418c"}, + {file = "google_cloud_storage-2.18.1.tar.gz", hash = "sha256:6707a6f30a05aee36faca81296419ca2907ac750af1c0457f278bc9a6fb219ad"}, ] [package.dependencies] @@ -1185,17 +1229,18 @@ google-resumable-media = ">=2.6.0" requests = ">=2.18.0,<3.0.0dev" [package.extras] -protobuf = ["protobuf (<5.0.0dev)"] +protobuf = ["protobuf (<6.0.0dev)"] +tracing = ["opentelemetry-api (>=1.1.0)"] [[package]] name = "google-cloud-texttospeech" -version = "2.16.4" +version = "2.16.5" description = "Google Cloud Texttospeech API client library" optional = true python-versions = ">=3.7" files = [ - {file = "google-cloud-texttospeech-2.16.4.tar.gz", hash = "sha256:07b7e2a126e29219d2024dd69e40cb31ff0805bdae4957dcba452c6ad4862405"}, - {file = "google_cloud_texttospeech-2.16.4-py2.py3-none-any.whl", hash = "sha256:431f3b937f6c6150b6ca559ac906f0a6796ca72fe13f8e460755d8318cc9564a"}, + {file = "google_cloud_texttospeech-2.16.5-py2.py3-none-any.whl", hash = "sha256:3f987ad64dbbf6140ec08d0e5bc53987951f72495416b973e7e51bfa216368b8"}, + {file = "google_cloud_texttospeech-2.16.5.tar.gz", hash = "sha256:98a1fe49cce1726f071c779a3b2d73c9878c768f1cd9bf00d00610e03c543667"}, ] [package.dependencies] @@ -1428,76 +1473,76 @@ protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4 [[package]] name = "grpcio" -version = "1.64.1" +version = "1.65.4" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, - {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, - {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, - {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, - {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, - {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, - {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, - {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, - {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, - {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, - {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, - {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, - {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, - {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, - {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, - {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, - {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, - {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, - {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, - {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, - {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, + {file = "grpcio-1.65.4-cp310-cp310-linux_armv7l.whl", hash = "sha256:0e85c8766cf7f004ab01aff6a0393935a30d84388fa3c58d77849fcf27f3e98c"}, + {file = "grpcio-1.65.4-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e4a795c02405c7dfa8affd98c14d980f4acea16ea3b539e7404c645329460e5a"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d7b984a8dd975d949c2042b9b5ebcf297d6d5af57dcd47f946849ee15d3c2fb8"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644a783ce604a7d7c91412bd51cf9418b942cf71896344b6dc8d55713c71ce82"}, + {file = "grpcio-1.65.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5764237d751d3031a36fafd57eb7d36fd2c10c658d2b4057c516ccf114849a3e"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ee40d058cf20e1dd4cacec9c39e9bce13fedd38ce32f9ba00f639464fcb757de"}, + {file = "grpcio-1.65.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4482a44ce7cf577a1f8082e807a5b909236bce35b3e3897f839f2fbd9ae6982d"}, + {file = "grpcio-1.65.4-cp310-cp310-win32.whl", hash = "sha256:66bb051881c84aa82e4f22d8ebc9d1704b2e35d7867757f0740c6ef7b902f9b1"}, + {file = "grpcio-1.65.4-cp310-cp310-win_amd64.whl", hash = "sha256:870370524eff3144304da4d1bbe901d39bdd24f858ce849b7197e530c8c8f2ec"}, + {file = "grpcio-1.65.4-cp311-cp311-linux_armv7l.whl", hash = "sha256:85e9c69378af02e483bc626fc19a218451b24a402bdf44c7531e4c9253fb49ef"}, + {file = "grpcio-1.65.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2bd672e005afab8bf0d6aad5ad659e72a06dd713020554182a66d7c0c8f47e18"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:abccc5d73f5988e8f512eb29341ed9ced923b586bb72e785f265131c160231d8"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:886b45b29f3793b0c2576201947258782d7e54a218fe15d4a0468d9a6e00ce17"}, + {file = "grpcio-1.65.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be952436571dacc93ccc7796db06b7daf37b3b56bb97e3420e6503dccfe2f1b4"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8dc9ddc4603ec43f6238a5c95400c9a901b6d079feb824e890623da7194ff11e"}, + {file = "grpcio-1.65.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ade1256c98cba5a333ef54636095f2c09e6882c35f76acb04412f3b1aa3c29a5"}, + {file = "grpcio-1.65.4-cp311-cp311-win32.whl", hash = "sha256:280e93356fba6058cbbfc6f91a18e958062ef1bdaf5b1caf46c615ba1ae71b5b"}, + {file = "grpcio-1.65.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2b819f9ee27ed4e3e737a4f3920e337e00bc53f9e254377dd26fc7027c4d558"}, + {file = "grpcio-1.65.4-cp312-cp312-linux_armv7l.whl", hash = "sha256:926a0750a5e6fb002542e80f7fa6cab8b1a2ce5513a1c24641da33e088ca4c56"}, + {file = "grpcio-1.65.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2a1d4c84d9e657f72bfbab8bedf31bdfc6bfc4a1efb10b8f2d28241efabfaaf2"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:17de4fda50967679677712eec0a5c13e8904b76ec90ac845d83386b65da0ae1e"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3dee50c1b69754a4228e933696408ea87f7e896e8d9797a3ed2aeed8dbd04b74"}, + {file = "grpcio-1.65.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74c34fc7562bdd169b77966068434a93040bfca990e235f7a67cdf26e1bd5c63"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:24a2246e80a059b9eb981e4c2a6d8111b1b5e03a44421adbf2736cc1d4988a8a"}, + {file = "grpcio-1.65.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18c10f0d054d2dce34dd15855fcca7cc44ec3b811139437543226776730c0f28"}, + {file = "grpcio-1.65.4-cp312-cp312-win32.whl", hash = "sha256:d72962788b6c22ddbcdb70b10c11fbb37d60ae598c51eb47ec019db66ccfdff0"}, + {file = "grpcio-1.65.4-cp312-cp312-win_amd64.whl", hash = "sha256:7656376821fed8c89e68206a522522317787a3d9ed66fb5110b1dff736a5e416"}, + {file = "grpcio-1.65.4-cp38-cp38-linux_armv7l.whl", hash = "sha256:4934077b33aa6fe0b451de8b71dabde96bf2d9b4cb2b3187be86e5adebcba021"}, + {file = "grpcio-1.65.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0cef8c919a3359847c357cb4314e50ed1f0cca070f828ee8f878d362fd744d52"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a925446e6aa12ca37114840d8550f308e29026cdc423a73da3043fd1603a6385"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf53e6247f1e2af93657e62e240e4f12e11ee0b9cef4ddcb37eab03d501ca864"}, + {file = "grpcio-1.65.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb34278e4ceb224c89704cd23db0d902e5e3c1c9687ec9d7c5bb4c150f86816"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e6cbdd107e56bde55c565da5fd16f08e1b4e9b0674851d7749e7f32d8645f524"}, + {file = "grpcio-1.65.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:626319a156b1f19513156a3b0dbfe977f5f93db63ca673a0703238ebd40670d7"}, + {file = "grpcio-1.65.4-cp38-cp38-win32.whl", hash = "sha256:3d1bbf7e1dd1096378bd83c83f554d3b93819b91161deaf63e03b7022a85224a"}, + {file = "grpcio-1.65.4-cp38-cp38-win_amd64.whl", hash = "sha256:a99e6dffefd3027b438116f33ed1261c8d360f0dd4f943cb44541a2782eba72f"}, + {file = "grpcio-1.65.4-cp39-cp39-linux_armv7l.whl", hash = "sha256:874acd010e60a2ec1e30d5e505b0651ab12eb968157cd244f852b27c6dbed733"}, + {file = "grpcio-1.65.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b07f36faf01fca5427d4aa23645e2d492157d56c91fab7e06fe5697d7e171ad4"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:b81711bf4ec08a3710b534e8054c7dcf90f2edc22bebe11c1775a23f145595fe"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88fcabc332a4aef8bcefadc34a02e9ab9407ab975d2c7d981a8e12c1aed92aa1"}, + {file = "grpcio-1.65.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ba3e63108a8749994f02c7c0e156afb39ba5bdf755337de8e75eb685be244b"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8eb485801957a486bf5de15f2c792d9f9c897a86f2f18db8f3f6795a094b4bb2"}, + {file = "grpcio-1.65.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075f3903bc1749ace93f2b0664f72964ee5f2da5c15d4b47e0ab68e4f442c257"}, + {file = "grpcio-1.65.4-cp39-cp39-win32.whl", hash = "sha256:0a0720299bdb2cc7306737295d56e41ce8827d5669d4a3cd870af832e3b17c4d"}, + {file = "grpcio-1.65.4-cp39-cp39-win_amd64.whl", hash = "sha256:a146bc40fa78769f22e1e9ff4f110ef36ad271b79707577bf2a31e3e931141b9"}, + {file = "grpcio-1.65.4.tar.gz", hash = "sha256:2a4f476209acffec056360d3e647ae0e14ae13dcf3dfb130c227ae1c594cbe39"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.65.4)"] [[package]] name = "grpcio-status" -version = "1.62.2" +version = "1.62.3" description = "Status proto mapping for gRPC" optional = true python-versions = ">=3.6" files = [ - {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, - {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, + {file = "grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485"}, + {file = "grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8"}, ] [package.dependencies] googleapis-common-protos = ">=1.5.5" -grpcio = ">=1.62.2" +grpcio = ">=1.62.3" protobuf = ">=4.21.6" [[package]] @@ -1606,13 +1651,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.23.5" +version = "0.24.5" 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.23.5-py3-none-any.whl", hash = "sha256:d7a7d337615e11a45cc14a0ce5a605db6b038dc24af42866f731684825226e90"}, - {file = "huggingface_hub-0.23.5.tar.gz", hash = "sha256:67a9caba79b71235be3752852ca27da86bd54311d2424ca8afdb8dda056edf98"}, + {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, + {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, ] [package.dependencies] @@ -1625,17 +1670,17 @@ 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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +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.3.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", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["safetensors", "torch"] +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]] @@ -1651,22 +1696,22 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.1.0" +version = "8.0.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, - {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, + {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, + {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "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)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "iniconfig" @@ -1878,19 +1923,19 @@ referencing = ">=0.31.0" [[package]] name = "langchain" -version = "0.2.8" +version = "0.2.12" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain-0.2.8-py3-none-any.whl", hash = "sha256:53e7dfe50294a14200f33bec22b4e14cb63857ccf0a5500b0d18b0fd51285d58"}, - {file = "langchain-0.2.8.tar.gz", hash = "sha256:7fecb309e3558cde4e5cf7e9ffb7c1ab3f07121c40a7ff3b0c27135f8120c296"}, + {file = "langchain-0.2.12-py3-none-any.whl", hash = "sha256:565d2f5df1c06815d1c684400218ec4ae5e1027887aad343226fad846c54e726"}, + {file = "langchain-0.2.12.tar.gz", hash = "sha256:fe7bd409c133017446fec54c38a5e7cb14f74e020090d7b5065374badf71e6d1"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.19,<0.3.0" +langchain-core = ">=0.2.27,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ @@ -1905,36 +1950,36 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-anthropic" -version = "0.1.20" +version = "0.1.22" description = "An integration package connecting AnthropicMessages and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_anthropic-0.1.20-py3-none-any.whl", hash = "sha256:3a0d89ac6856be98beb3ec63813393bf29af3c5134247979c055938e741b7d9d"}, - {file = "langchain_anthropic-0.1.20.tar.gz", hash = "sha256:cb9607fecfc0f0de49b79dd0fc066790e2877873ef753abd98d2ae38d6e0f5b2"}, + {file = "langchain_anthropic-0.1.22-py3-none-any.whl", hash = "sha256:149c4056efbdeddde901c9ff301b0d30ea4fd6bb951f9469ac74cd5efcc86bff"}, + {file = "langchain_anthropic-0.1.22.tar.gz", hash = "sha256:8d46ea715e2f80911ceca299b4249e01461f36c22cda82e08f49bdb07a785b1d"}, ] [package.dependencies] anthropic = ">=0.28.0,<1" defusedxml = ">=0.7.1,<0.8.0" -langchain-core = ">=0.2.17,<0.3" +langchain-core = ">=0.2.26,<0.3.0" [[package]] name = "langchain-community" -version = "0.2.7" +version = "0.2.11" description = "Community contributed LangChain integrations." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_community-0.2.7-py3-none-any.whl", hash = "sha256:c236e74249ab68a318c94c95327cbe75a76489b61f7bf93f14117d9233ce70b1"}, - {file = "langchain_community-0.2.7.tar.gz", hash = "sha256:f52659dbb8a8f0c011cc7d634247686d11d768843cc3e5fe9e6f52321cde82c0"}, + {file = "langchain_community-0.2.11-py3-none-any.whl", hash = "sha256:465c03ba1603975d141533424185e09546ecf09e379c93aee2671bdc9b325cda"}, + {file = "langchain_community-0.2.11.tar.gz", hash = "sha256:ede261ff8202f1433f004ee90baf89f371cee37cb1abfc16dd0f8392db10b23e"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.7,<0.3.0" -langchain-core = ">=0.2.12,<0.3.0" +langchain = ">=0.2.12,<0.3.0" +langchain-core = ">=0.2.27,<0.3.0" langsmith = ">=0.1.0,<0.2.0" numpy = [ {version = ">=1,<2", markers = "python_version < \"3.12\""}, @@ -1947,13 +1992,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.20" +version = "0.2.29" description = "Building applications with LLMs through composability" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.2.20-py3-none-any.whl", hash = "sha256:16cc4da6f7ebf33accea7af45a70480733dc852ab291030fb6924865bd7caf76"}, - {file = "langchain_core-0.2.20.tar.gz", hash = "sha256:a66c439e085d8c75f822f7650a5551d17bada4003521173c763d875d949e4ed5"}, + {file = "langchain_core-0.2.29-py3-none-any.whl", hash = "sha256:846c04a3bb72e409a9b928e0eb3ea1762e1473f2c4fb6df2596fbd7b3ab75973"}, + {file = "langchain_core-0.2.29.tar.gz", hash = "sha256:491324745a7afee5a7b285c3904edd9dd0c6efa7daf26b92fec6e84a2d2f5d10"}, ] [package.dependencies] @@ -1966,39 +2011,40 @@ pydantic = [ ] PyYAML = ">=5.3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" +typing-extensions = ">=4.7" [[package]] name = "langchain-google-vertexai" -version = "1.0.6" +version = "1.0.8" description = "An integration package connecting Google VertexAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_google_vertexai-1.0.6-py3-none-any.whl", hash = "sha256:240a9be3ae749335ec9a495502ca8f2bff60a432b8400a21cbd93b415e4d166d"}, - {file = "langchain_google_vertexai-1.0.6.tar.gz", hash = "sha256:000c4cfd0dee73317e1752dfeec76a08c5bf24f7a134d79b9905a720ac886b11"}, + {file = "langchain_google_vertexai-1.0.8-py3-none-any.whl", hash = "sha256:e35fb910604bfb05704f191bf17998e7f841a92f21677a0219c4f3a97de945c3"}, + {file = "langchain_google_vertexai-1.0.8.tar.gz", hash = "sha256:db5b28aca9ae2cd0a775d97ec25374f9efac05e0ad336cb1cd5ca665e47b3fc3"}, ] [package.dependencies] google-cloud-aiplatform = ">=1.56.0,<2.0.0" google-cloud-storage = ">=2.17.0,<3.0.0" -langchain-core = ">=0.2.9,<0.3" +langchain-core = ">=0.2.25,<0.3" [package.extras] -anthropic = ["anthropic[vertexai] (>=0.29.0,<1)"] +anthropic = ["anthropic[vertexai] (>=0.30.0,<1)"] [[package]] name = "langchain-openai" -version = "0.1.16" +version = "0.1.20" description = "An integration package connecting OpenAI and LangChain" optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_openai-0.1.16-py3-none-any.whl", hash = "sha256:bff90e9d0be786495920a7851ae4d55247fb084d3a11d1b15bfe91904ce1cb0f"}, - {file = "langchain_openai-0.1.16.tar.gz", hash = "sha256:3dedcc785a64a488ad6a313cc59b0dccea025d27413b55cec73a20dcf3ded4da"}, + {file = "langchain_openai-0.1.20-py3-none-any.whl", hash = "sha256:232ebfe90b1898ef7cf181e364d45191edcf04bfc31b292ecaa1d2121942c28e"}, + {file = "langchain_openai-0.1.20.tar.gz", hash = "sha256:2c91e9f771541076b138e65dd4c5427b26957a2272406a7f4ee747d7896f9b35"}, ] [package.dependencies] -langchain-core = ">=0.2.17,<0.3.0" +langchain-core = ">=0.2.26,<0.3.0" openai = ">=1.32.0,<2.0.0" tiktoken = ">=0.7,<1" @@ -2018,13 +2064,13 @@ langchain-core = ">=0.2.10,<0.3.0" [[package]] name = "langsmith" -version = "0.1.87" +version = "0.1.98" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = true python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.87-py3-none-any.whl", hash = "sha256:4cd19539c29367f812667e43c0fb0b6d304a078246508df85c38c4ea3df2d0cf"}, - {file = "langsmith-0.1.87.tar.gz", hash = "sha256:d2422099708af5717d01559731c1c62d49aebf05a420015e30f6dca5ed44227c"}, + {file = "langsmith-0.1.98-py3-none-any.whl", hash = "sha256:f79e8a128652bbcee4606d10acb6236973b5cd7dde76e3741186d3b97b5698e9"}, + {file = "langsmith-0.1.98.tar.gz", hash = "sha256:e07678219a0502e8f26d35294e72127a39d25e32fafd091af5a7bb661e9a6bd1"}, ] [package.dependencies] @@ -2197,71 +2243,71 @@ files = [ [[package]] name = "miniaudio" -version = "1.60" +version = "1.61" description = "python bindings for the miniaudio library and its decoders (mp3, flac, ogg vorbis, wav)" optional = false python-versions = "*" files = [ - {file = "miniaudio-1.60-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04e30868b470b9fe60ce83065e96070d5929b989b9bde1dfbe365c74ed113ac0"}, - {file = "miniaudio-1.60-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7852cacf53d9ee89dceed22ecc623239ce2d9f9a8ac4426004057670bb465cef"}, - {file = "miniaudio-1.60-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efb3ad034c2d4875b5264480d2053d1c802e0715d6b6d45b9bf9ccf30cb0a8c3"}, - {file = "miniaudio-1.60-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a14cfaf3a0da30fe26b1f59f77837aab03472c6c8ec5652766c8423b374463b"}, - {file = "miniaudio-1.60-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd487e37d98abbef93e2a8c8ebe73eec6defd3009e07fc2886afd9abb7020812"}, - {file = "miniaudio-1.60-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:059dd317330954bd042def228a606d0be77f18f381ffda053f2ff9808c1187a4"}, - {file = "miniaudio-1.60-cp310-cp310-win32.whl", hash = "sha256:144fce160aa3a287b84dfb0af985cd8e0240e25623774a9cf18c3dc39d5c4c48"}, - {file = "miniaudio-1.60-cp310-cp310-win_amd64.whl", hash = "sha256:bc132dae0c0193b85e82f1509eadb74e281e34b73657b4cb09f406e2e3a00c89"}, - {file = "miniaudio-1.60-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:736f783f16dd83cde393cf5e1c2bc0e13a2b2907fff3be5cf8d0e4643fa03d87"}, - {file = "miniaudio-1.60-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2b9060dc806450da7a5c647ab1144562761b44eeec423580cebc941c7034902"}, - {file = "miniaudio-1.60-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebb7fe6a16b99e931a69fb8605b1b4035be7ec9bd676a8fd745bc0e6123b704c"}, - {file = "miniaudio-1.60-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db439671a688a7e123c9cb0055bc4840f81b75fe6b23e6c3bfa358ea5fbdb368"}, - {file = "miniaudio-1.60-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:63d072eaa2ef17a0cae1ee82d0faa3090d226eb0786104d9a0b8c6634962882a"}, - {file = "miniaudio-1.60-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6396059187d03198b40106b212078c90e0cef27d4bc874d85c709fc1afe0030b"}, - {file = "miniaudio-1.60-cp311-cp311-win32.whl", hash = "sha256:fbaae29ddc578e3e0e6f3669504fbdda4e1a52bb6c0acb6e96e571adceba11c0"}, - {file = "miniaudio-1.60-cp311-cp311-win_amd64.whl", hash = "sha256:b2d72cf67184ee0ae24d9c0cf71b43e7523141b1c8b5db6d957d164379ed9130"}, - {file = "miniaudio-1.60-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c097dcb426ac3ef53eeadb9164dc37469a45267952f3b1c378da2d38593fd04a"}, - {file = "miniaudio-1.60-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:060313cdc0e9f9d6415dcf0ed66ba4e469061be3298ee1719fef60f988150ef0"}, - {file = "miniaudio-1.60-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4522c824ed6b1164d1c6f9f0e0c526de14ac7521ab655cc7b92c954392e42e88"}, - {file = "miniaudio-1.60-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5dc9c14b85b77793e98df40662b28a0ce4ac92e0831f52bf9686721efbdb20"}, - {file = "miniaudio-1.60-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a925ac2435649bbb97f52c0170ae849aca1a5b52e73639c425013968a52678c3"}, - {file = "miniaudio-1.60-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2680c05fc5422bc6f6ddeefd388cb9d1c20de38b8e8d0559706712bc10fff3f"}, - {file = "miniaudio-1.60-cp312-cp312-win32.whl", hash = "sha256:d76bb757527e7a87bf20056d9380c4e5c105c82f00c95bff9fa9f3c1ad69ea45"}, - {file = "miniaudio-1.60-cp312-cp312-win_amd64.whl", hash = "sha256:0a7c55fca55a0d47698381cb1b919065d3115f0a5c6e957dcdd6297fbafedb3f"}, - {file = "miniaudio-1.60-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ff2366bb0fb502ca9b2891085793cd58bf9c85e420ae76a1a390a5e6367dde"}, - {file = "miniaudio-1.60-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74ce4c883fa8559e4ec9ee152b49b2856d7a57289c93ccc86c56818c7c73c338"}, - {file = "miniaudio-1.60-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc8691d3710175dd567d2829516445afec182f30f8b50930ed54196b503ed2a"}, - {file = "miniaudio-1.60-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff01436de38a798e91f21bfcdf77df66fb8ce8435f6ac9770adfec245c186cb"}, - {file = "miniaudio-1.60-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c11503d6737b80caad07c2315fb034eae8500e307a087f513c33729885a73c07"}, - {file = "miniaudio-1.60-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d67bf0e1b126926959cc5f6679369a170e0395e561a5b098f8494fd4bd773030"}, - {file = "miniaudio-1.60-cp38-cp38-win32.whl", hash = "sha256:a91b637891736b7a938c54ac4338523948821729b9de199329367e78a42d5959"}, - {file = "miniaudio-1.60-cp38-cp38-win_amd64.whl", hash = "sha256:a4e8a07322e910ad32a3d4a2db01c020a04044b2b269cece63d785947bdd42ff"}, - {file = "miniaudio-1.60-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1a3cb30aa3fbc82b14443939ba6988e57cece87a49fed7bb177d1ce31627d30"}, - {file = "miniaudio-1.60-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96b2ca055b9904c4a5461c10b77512c073254386bff35b4f5f95f3563179dbfb"}, - {file = "miniaudio-1.60-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:289e5b20e490fc5a4be22e5690dee0c43f709f8c599c7ea2c3a135d182a9ed6a"}, - {file = "miniaudio-1.60-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e5d44f868380d5ea0643260c5757b739bdf28d35f34ea6da63c2397d1076d7"}, - {file = "miniaudio-1.60-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:32e6a193bf611997c2bc059b10696f594f480569d367fdcade0d0cb1355e0d44"}, - {file = "miniaudio-1.60-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:953fb4163546241fd04ade2c66fb16dc79d8e072a5a7a5eeb915328f436d8e05"}, - {file = "miniaudio-1.60-cp39-cp39-win32.whl", hash = "sha256:916360f4a61877e7b67175dd985c9df679e102b15efab4ef4b7bc232ed0fec7a"}, - {file = "miniaudio-1.60-cp39-cp39-win_amd64.whl", hash = "sha256:958ad03b797541a698449396e945c005da9a96a6d8bdf1f92ca0b5f460d1d419"}, - {file = "miniaudio-1.60-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1936829a6bcc7d08edee2b01cab70e1e097c57592b6fe9ab0329cb45660e30ba"}, - {file = "miniaudio-1.60-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:932c3b1db06b018fdd7491c7d346abc9ad09b49cf479b08085d130443bd4fbcb"}, - {file = "miniaudio-1.60-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e53bf6dbf74379deeb77da7857247135ee0aeb7a71dc10ac6402edddd84c31f"}, - {file = "miniaudio-1.60-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b15ed148391f96a7b8d2cc35fabe2e48e17443e2b490febfb8a8f86fa4eedc2"}, - {file = "miniaudio-1.60-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:94b46bccaf87358ce78f416de18efdd950369d74f3354338ff760e9964432c77"}, - {file = "miniaudio-1.60-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5e3f8be8871dca8383d040eda4463f763c7f6c13f5f8df60beb74a1515335d65"}, - {file = "miniaudio-1.60-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a9bb3b419aa4c02d639ebd3f6ff86ecde3ee595ace50f03e1ec554ad761a33"}, - {file = "miniaudio-1.60-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d01e5ae889792bd6e1d747c990da78955e7be126ad3b16d701a48e2827b9c4"}, - {file = "miniaudio-1.60-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0facdf9a4821fa057a3c83ef31d064d3473e785d254a1bccfb34136a77e80797"}, - {file = "miniaudio-1.60-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:322da5d24f2d798537d5c8513825f76b5998ea4e17338ede535034997a4cd042"}, - {file = "miniaudio-1.60-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9000df2455fafd35547a52d41fea766953fbe519b47df6be1c8aaa3b2f0e843a"}, - {file = "miniaudio-1.60-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f20fc964fe187825b20ef6853211a91022b87f03b87641c9484b3336dfcd1f9b"}, - {file = "miniaudio-1.60-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206ac8ccd2a0491df9270dc5e408f62fedb8ff0b950d4cc33712a4d49197bbb1"}, - {file = "miniaudio-1.60-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:aa7114c298c3b1d0ad01d828b50b3d9f8a9b9c7e4df8c0ae3d3faa902fbeeca2"}, - {file = "miniaudio-1.60-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:78e34b0ecd8547bea3f410b5df8ff6bc1295cff32b5c6c89f219f966a274323b"}, - {file = "miniaudio-1.60-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d83a17b481bfbb078b15fdb182e6fb1808d4070d2a784095aebc63a3694e84e9"}, - {file = "miniaudio-1.60-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b9de5b75c5d05f3437fa5d33714338fc1eed9dc37a7a402eccb1cb446a4b645"}, - {file = "miniaudio-1.60-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab1b1bd73e82937d1c811f72339a0d0d4e7029bbf97acbe5e4725c73df3bd569"}, - {file = "miniaudio-1.60-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bb4ecb010390369671d44f1deb7da9cf05ed76eb5d51a4a3d408d719c3618ca6"}, - {file = "miniaudio-1.60.tar.gz", hash = "sha256:a89bd70b9d52eb1b787ca3cc4bde990da64e90cf7ad52c13b912b23ccaeec1cb"}, + {file = "miniaudio-1.61-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:154e7bc36b0cde4da2e4d7c84ba5f5ac0b634905f8d6bf93381fdc457a0fb2d7"}, + {file = "miniaudio-1.61-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6aaade7e4e787e789a69b5027e95db6e572759d713bfe321fd40a399f50c0f29"}, + {file = "miniaudio-1.61-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82fb734e7607c45a515f6ab5143aaea356a6fb2ad9562afea029b7c2d7ea6b3a"}, + {file = "miniaudio-1.61-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c029004af862dd96065b4839efa4643484be46e42946a9ce7d182ec32a863de1"}, + {file = "miniaudio-1.61-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7fd7c35b0a8c04a69f658594f3e6139515b513b7d47727b59f631dd5f0b9e10c"}, + {file = "miniaudio-1.61-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95331fee41b9b464b278a2b83ca1e99dff5cd1c3645c2913917759cf2f711916"}, + {file = "miniaudio-1.61-cp310-cp310-win32.whl", hash = "sha256:200b7ab40a360a2d9bb7005273e433b239d6e15d6bf8148a2b68808f3d152e5c"}, + {file = "miniaudio-1.61-cp310-cp310-win_amd64.whl", hash = "sha256:119fdb2ae761916d3e2b840e9b40f1b724acac8e5fbd7fb8002872e17470a70b"}, + {file = "miniaudio-1.61-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c9e18f72e241e14fc63293e1cbe175a7562242f6768b8b7ef526b6ea277303b"}, + {file = "miniaudio-1.61-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e6083cad6116f0bd94d6dfe429b3c2ac200af09d955f80333ad41013bb2d74a6"}, + {file = "miniaudio-1.61-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e67e74a512f388c7df1e401ecee02da0873469596ad156484a145b5c7302df8b"}, + {file = "miniaudio-1.61-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af1d21ea865ade9fbddfb6c803b5094014defff067a36c5d97b968950957448a"}, + {file = "miniaudio-1.61-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0acde34c70338ea7f44f32fd8617707583052b4ac87d7a436ccb3c99439ae48d"}, + {file = "miniaudio-1.61-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c8fe2b3e0ae7b939014a059206d9f60861aa48ad216dc0102517b398ce5c3306"}, + {file = "miniaudio-1.61-cp311-cp311-win32.whl", hash = "sha256:e54254e7397d6fbbd045c604b2180b94b1fd559bfd483f8a86332434ec5db34a"}, + {file = "miniaudio-1.61-cp311-cp311-win_amd64.whl", hash = "sha256:71066552e216d80531d18b87543e1efa68e014a2f8e6064023ef544dc41a1c1e"}, + {file = "miniaudio-1.61-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ff9f6ccd425d76a7e75df210f905b2cfc82695afb716bc7b94bb483e5a5b89d7"}, + {file = "miniaudio-1.61-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:849e4c9e80c24d7576b660dc92f67814b61f3c7d12ae8c90cb169050d685f35a"}, + {file = "miniaudio-1.61-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84b93ecf698288254d5f08f703893d3953097ad4781889a6301fa8f42483c695"}, + {file = "miniaudio-1.61-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c31c2dc2fb4ffc62de7b6af68a2753c9bcfabca661c32f894ac6f6ea1217d609"}, + {file = "miniaudio-1.61-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57766bccbb3da522e8542a2ea076627175933e5e89b022e7a3d999be8ab09ccc"}, + {file = "miniaudio-1.61-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07eed71ec3b297502e178b87d5b9111e85f7d727d6eb7694663d820fd714b9c3"}, + {file = "miniaudio-1.61-cp312-cp312-win32.whl", hash = "sha256:37f1d2602bf9e7e919a9d2cb2c5496180a135cb3406d8acfc7ca1d0d008150bd"}, + {file = "miniaudio-1.61-cp312-cp312-win_amd64.whl", hash = "sha256:268017bc9b30e9f95b0bdaa20c386c9d2cf4dab1235193f0fc774890b77b1dc0"}, + {file = "miniaudio-1.61-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:880697bc95610b7c991b580ceeac907ec15bc5700aa9e753c92de56e516853dc"}, + {file = "miniaudio-1.61-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3b137acf05dc2bbb1b30bee24cdff301a009799139001646aec870ff9bd83030"}, + {file = "miniaudio-1.61-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cedfe252ab85a4607222902c3274c59c0afbaab52ca2562fe8a26f2c9d3ddb50"}, + {file = "miniaudio-1.61-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fce9027c1e55216a8cf723678b3f15998337c28004dab4bad5629cad20e0ccec"}, + {file = "miniaudio-1.61-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:493fdb7cb5b87ea49d378b33be03c3f43e77c3c062c273f531291e748ca0856a"}, + {file = "miniaudio-1.61-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:801eb857effda660a71375ef5d478e15eaa374fbef317c2584f5ab61cbb8fc76"}, + {file = "miniaudio-1.61-cp38-cp38-win32.whl", hash = "sha256:abd3034c31d192af3ceafde16e8cb985e4555aa3a66b84b50f8c8103255ab9d6"}, + {file = "miniaudio-1.61-cp38-cp38-win_amd64.whl", hash = "sha256:850dd2cc54b61a52d367b6b442e992377d337be319aad92d9d71da6ba2dd9f58"}, + {file = "miniaudio-1.61-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d8da81008dec73e0251f1ae817c6e883a34f5cb66cb560ffaf32d59f004b3f90"}, + {file = "miniaudio-1.61-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:49b20903162ca881ebd2577884ea57c3906f1800b701be574e981db724a6d767"}, + {file = "miniaudio-1.61-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8595782080deab028fb0dcac22f416a4bea7ef11df5bf40f8fe41a1f298b745"}, + {file = "miniaudio-1.61-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15134e9ed6d2974f0b3c941434c5e338328e3acf52cac9718c029881a26eec4e"}, + {file = "miniaudio-1.61-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:72c7a05ea33a2f55ab1e5067f5bb7dbe97b6e172f2e6624697bfd8e94182fef5"}, + {file = "miniaudio-1.61-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dd49f78ef8412d2963c0336b1d7e5452ff7e991fe9509b2387672d9d8a3096e9"}, + {file = "miniaudio-1.61-cp39-cp39-win32.whl", hash = "sha256:c0ffb0b621a7cd8481d4049777b34cb9cab75e6a1de16bac27aa9ca31a49af30"}, + {file = "miniaudio-1.61-cp39-cp39-win_amd64.whl", hash = "sha256:a662f853cb6091ca51628ced89c08c43321105c471e9ce07453ad1777c4b0eeb"}, + {file = "miniaudio-1.61-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a3260686e091a9920abe4eddbc6c3445f2be2a6dd6c60a8f7eff559aeb311dd7"}, + {file = "miniaudio-1.61-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:002a29d75bed3d7db5d8689022885735744a43778a46cf63c3f7d4d1f7373710"}, + {file = "miniaudio-1.61-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdf5531fe5f16add40e843f167876412de59c493a5f77f97a27369ba660891e8"}, + {file = "miniaudio-1.61-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5e77c9d702e06afe64dc557e2626a875ecc829b9a23d57a7f987a5de630c6c2"}, + {file = "miniaudio-1.61-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:212896c7d02282fe5415a9fc1443fe090153338a64f54b492c954f677e7e1e8f"}, + {file = "miniaudio-1.61-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:559c5e1b507da32dab221f638f104a88588f073a4d0a12c836245e33d0f12b7e"}, + {file = "miniaudio-1.61-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d70dbbe61b5031707f45070fa4ba1f95888ef4da9b55901becb14140b1a7eb69"}, + {file = "miniaudio-1.61-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26e7e1132a6dd25795eae86f2b3221630e4e26680cb75ea5824634f50ce2bb1d"}, + {file = "miniaudio-1.61-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed8d0bcfe5295a400b2da89f609b5a8317bfbc976c6eb7ea903f93b6b058e781"}, + {file = "miniaudio-1.61-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:42a250e37b4e39fec0f08d343f0f39254ccdf5f84beeb553eb4ca453c3f7c7e8"}, + {file = "miniaudio-1.61-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2b9dee38bddd168d9ec3d2553abf329f0a151b101dfefa63ba0da4c6a553a7b"}, + {file = "miniaudio-1.61-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6713ed71c2fb2bdf6a892d871d31fd0281b6273f77c0e6d008410260739a046a"}, + {file = "miniaudio-1.61-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:029a2cbb0448d76af958b7ce38ab11513e5b078390e4084dfde3a818b0dbb9e2"}, + {file = "miniaudio-1.61-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64d8f06a03cc9a008a15c55048e5ff9e6ce9de4f3d05fa146a70bb756ef7c061"}, + {file = "miniaudio-1.61-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:62afa4077a6364be4d64e6c107b76e4487b4ee0fc42c7f63d7b6c55e42e604d8"}, + {file = "miniaudio-1.61-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d2bea03cdd436f17a425e13ce73ea65f8db09d927f46153f16cbd6d625327f5"}, + {file = "miniaudio-1.61-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8a8aa29489f3ddea344730a4d1a797dd29d8b426d015cdeaa8f6d899ee9d49"}, + {file = "miniaudio-1.61-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466757884984206e6622f91359d91678c8abb4f263188b2d1735adbed98771d4"}, + {file = "miniaudio-1.61-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bc451304e81ff5b4cc1e40e2746c7626a3195e939153734a81e4e333aff3dcbb"}, + {file = "miniaudio-1.61.tar.gz", hash = "sha256:e88e97837d031f0fb6982394218b6487de02eaa382ad273b8fca37791a2b4b15"}, ] [package.dependencies] @@ -2368,44 +2414,44 @@ files = [ [[package]] name = "mypy" -version = "1.10.1" +version = "1.11.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02"}, - {file = "mypy-1.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7"}, - {file = "mypy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a"}, - {file = "mypy-1.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9"}, - {file = "mypy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a"}, - {file = "mypy-1.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84"}, - {file = "mypy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f"}, - {file = "mypy-1.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b"}, - {file = "mypy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7"}, - {file = "mypy-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3"}, - {file = "mypy-1.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e"}, - {file = "mypy-1.10.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04"}, - {file = "mypy-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c"}, - {file = "mypy-1.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade"}, - {file = "mypy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37"}, - {file = "mypy-1.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7"}, - {file = "mypy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3"}, - {file = "mypy-1.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf"}, - {file = "mypy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531"}, - {file = "mypy-1.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3"}, - {file = "mypy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f"}, - {file = "mypy-1.10.1-py3-none-any.whl", hash = "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a"}, - {file = "mypy-1.10.1.tar.gz", hash = "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411"}, + {file = "mypy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03"}, + {file = "mypy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4"}, + {file = "mypy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca"}, + {file = "mypy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de"}, + {file = "mypy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809"}, + {file = "mypy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a"}, + {file = "mypy-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417"}, + {file = "mypy-1.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e"}, + {file = "mypy-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b"}, + {file = "mypy-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0"}, + {file = "mypy-1.11.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd"}, + {file = "mypy-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c"}, + {file = "mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69"}, + {file = "mypy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74"}, + {file = "mypy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b"}, + {file = "mypy-1.11.1-py3-none-any.whl", hash = "sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54"}, + {file = "mypy-1.11.1.tar.gz", hash = "sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2496,71 +2542,73 @@ files = [ [[package]] name = "openai" -version = "1.35.14" +version = "1.40.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.35.14-py3-none-any.whl", hash = "sha256:adadf8c176e0b8c47ad782ed45dc20ef46438ee1f02c7103c4155cff79c8f68b"}, - {file = "openai-1.35.14.tar.gz", hash = "sha256:394ba1dfd12ecec1d634c50e512d24ff1858bbc2674ffcce309b822785a058de"}, + {file = "openai-1.40.1-py3-none-any.whl", hash = "sha256:cf5929076c6ca31c26f1ed207e9fd19eb05404cc9104f64c9d29bb0ac0c5bcd4"}, + {file = "openai-1.40.1.tar.gz", hash = "sha256:cb1294ac1f8c6a1acbb07e090698eb5ad74a7a88484e77126612a4f22579673d"}, ] [package.dependencies] anyio = ">=3.5.0,<5" distro = ">=1.7.0,<2" httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" pydantic = ">=1.9.0,<3" sniffio = "*" tqdm = ">4" -typing-extensions = ">=4.7,<5" +typing-extensions = ">=4.11,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] [[package]] name = "opentelemetry-api" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_api-1.25.0-py3-none-any.whl", hash = "sha256:757fa1aa020a0f8fa139f8959e53dec2051cc26b832e76fa839a6d76ecefd737"}, - {file = "opentelemetry_api-1.25.0.tar.gz", hash = "sha256:77c4985f62f2614e42ce77ee4c9da5fa5f0bc1e1821085e9a47533a9323ae869"}, + {file = "opentelemetry_api-1.26.0-py3-none-any.whl", hash = "sha256:7d7ea33adf2ceda2dd680b18b1677e4152000b37ca76e679da71ff103b943064"}, + {file = "opentelemetry_api-1.26.0.tar.gz", hash = "sha256:2bd639e4bed5b18486fef0b5a520aaffde5a18fc225e808a1ac4df363f43a1ce"}, ] [package.dependencies] deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=7.1" +importlib-metadata = ">=6.0,<=8.0.0" [[package]] name = "opentelemetry-sdk" -version = "1.25.0" +version = "1.26.0" description = "OpenTelemetry Python SDK" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_sdk-1.25.0-py3-none-any.whl", hash = "sha256:d97ff7ec4b351692e9d5a15af570c693b8715ad78b8aafbec5c7100fe966b4c9"}, - {file = "opentelemetry_sdk-1.25.0.tar.gz", hash = "sha256:ce7fc319c57707ef5bf8b74fb9f8ebdb8bfafbe11898410e0d2a761d08a98ec7"}, + {file = "opentelemetry_sdk-1.26.0-py3-none-any.whl", hash = "sha256:feb5056a84a88670c041ea0ded9921fca559efec03905dddeb3885525e0af897"}, + {file = "opentelemetry_sdk-1.26.0.tar.gz", hash = "sha256:c90d2868f8805619535c05562d699e2f4fb1f00dbd55a86dcefca4da6fa02f85"}, ] [package.dependencies] -opentelemetry-api = "1.25.0" -opentelemetry-semantic-conventions = "0.46b0" +opentelemetry-api = "1.26.0" +opentelemetry-semantic-conventions = "0.47b0" typing-extensions = ">=3.7.4" [[package]] name = "opentelemetry-semantic-conventions" -version = "0.46b0" +version = "0.47b0" description = "OpenTelemetry Semantic Conventions" optional = false python-versions = ">=3.8" files = [ - {file = "opentelemetry_semantic_conventions-0.46b0-py3-none-any.whl", hash = "sha256:6daef4ef9fa51d51855d9f8e0ccd3a1bd59e0e545abe99ac6203804e36ab3e07"}, - {file = "opentelemetry_semantic_conventions-0.46b0.tar.gz", hash = "sha256:fbc982ecbb6a6e90869b15c1673be90bd18c8a56ff1cffc0864e38e2edffaefa"}, + {file = "opentelemetry_semantic_conventions-0.47b0-py3-none-any.whl", hash = "sha256:4ff9d595b85a59c1c1413f02bba320ce7ea6bf9e2ead2b0913c4395c7bbc1063"}, + {file = "opentelemetry_semantic_conventions-0.47b0.tar.gz", hash = "sha256:a8d57999bbe3495ffd4d510de26a97dadc1dace53e0275001b2c1b2f67992a7e"}, ] [package.dependencies] -opentelemetry-api = "1.25.0" +deprecated = ">=1.2.6" +opentelemetry-api = "1.26.0" [[package]] name = "orjson" @@ -2646,13 +2694,13 @@ files = [ [[package]] name = "phonenumbers" -version = "8.13.40" +version = "8.13.42" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-8.13.40-py2.py3-none-any.whl", hash = "sha256:9582752c20a1da5ec4449f7f97542bf8a793c8e2fec0ab57f767177bb8fc0b1d"}, - {file = "phonenumbers-8.13.40.tar.gz", hash = "sha256:f137c2848b8e83dd064b71881b65680584417efa202177fd330e2f7ff6c68113"}, + {file = "phonenumbers-8.13.42-py2.py3-none-any.whl", hash = "sha256:18acc22ee03116d27b26e990f53806a1770a3e05f05e1620bc09ad187f889456"}, + {file = "phonenumbers-8.13.42.tar.gz", hash = "sha256:7137904f2db3b991701e853174ce8e1cb8f540b8bfdf27617540de04c0b7bed5"}, ] [[package]] @@ -2705,22 +2753,22 @@ testing = ["google-api-core (>=1.31.5)"] [[package]] name = "protobuf" -version = "4.25.3" +version = "4.25.4" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, - {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, - {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, - {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, - {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, - {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, - {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, - {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, - {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, - {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, + {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, + {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, + {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, + {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, + {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, + {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, + {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, + {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, + {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, + {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, ] [[package]] @@ -2895,13 +2943,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] @@ -2909,6 +2957,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)"] @@ -2970,13 +3019,13 @@ requests = ">=2.31.0,<3.0.0" [[package]] name = "pyjwt" -version = "2.8.0" +version = "2.9.0" description = "JSON Web Token implementation in Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, - {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, ] [package.dependencies] @@ -2984,19 +3033,19 @@ cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"cryp [package.extras] crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -3004,7 +3053,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -3012,13 +3061,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.23.7" +version = "0.23.8" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" files = [ - {file = "pytest_asyncio-0.23.7-py3-none-any.whl", hash = "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b"}, - {file = "pytest_asyncio-0.23.7.tar.gz", hash = "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268"}, + {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] @@ -3154,80 +3203,82 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] name = "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.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [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]] @@ -3247,90 +3298,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]] @@ -3374,110 +3425,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.19.0" +version = "0.20.0" 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.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] @@ -3496,13 +3551,13 @@ pyasn1 = ">=0.1.3" [[package]] name = "sentry-sdk" -version = "2.10.0" +version = "2.12.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.10.0-py2.py3-none-any.whl", hash = "sha256:87b3d413c87d8e7f816cc9334bff255a83d8b577db2b22042651c30c19c09190"}, - {file = "sentry_sdk-2.10.0.tar.gz", hash = "sha256:545fcc6e36c335faa6d6cda84669b6e17025f31efbf3b2211ec14efe008b75d1"}, + {file = "sentry_sdk-2.12.0-py2.py3-none-any.whl", hash = "sha256:7a8d5163d2ba5c5f4464628c6b68f85e86972f7c636acc78aed45c61b98b7a5e"}, + {file = "sentry_sdk-2.12.0.tar.gz", hash = "sha256:8763840497b817d44c49b3fe3f5f7388d083f2337ffedf008b2cdb63b5c86dc6"}, ] [package.dependencies] @@ -3533,7 +3588,7 @@ 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)"] +opentelemetry-experimental = ["opentelemetry-distro"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -3663,60 +3718,60 @@ numpy = ["NumPy"] [[package]] name = "sqlalchemy" -version = "2.0.31" +version = "2.0.32" description = "Database Abstraction Library" optional = true python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, - {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, - {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, ] [package.dependencies] @@ -3962,13 +4017,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -4041,13 +4096,13 @@ files = [ [[package]] name = "types-pyopenssl" -version = "24.1.0.20240425" +version = "24.1.0.20240722" description = "Typing stubs for pyOpenSSL" optional = false python-versions = ">=3.8" files = [ - {file = "types-pyOpenSSL-24.1.0.20240425.tar.gz", hash = "sha256:0a7e82626c1983dc8dc59292bf20654a51c3c3881bcbb9b337c1da6e32f0204e"}, - {file = "types_pyOpenSSL-24.1.0.20240425-py3-none-any.whl", hash = "sha256:f51a156835555dd2a1f025621e8c4fbe7493470331afeef96884d1d29bf3a473"}, + {file = "types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39"}, + {file = "types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54"}, ] [package.dependencies] @@ -4056,13 +4111,13 @@ types-cffi = "*" [[package]] name = "types-redis" -version = "4.6.0.20240425" +version = "4.6.0.20240806" description = "Typing stubs for redis" optional = false python-versions = ">=3.8" files = [ - {file = "types-redis-4.6.0.20240425.tar.gz", hash = "sha256:9402a10ee931d241fdfcc04592ebf7a661d7bb92a8dea631279f0d8acbcf3a22"}, - {file = "types_redis-4.6.0.20240425-py3-none-any.whl", hash = "sha256:ac5bc19e8f5997b9e76ad5d9cf15d0392d9f28cf5fc7746ea4a64b989c45c6a8"}, + {file = "types-redis-4.6.0.20240806.tar.gz", hash = "sha256:60dd02c2b91ea2d42ad079ac58dedc31d71d6eedb1c21d3796811b02baac655d"}, + {file = "types_redis-4.6.0.20240806-py3-none-any.whl", hash = "sha256:9d8fbe0ce37e3660c0a06982db7812384295d10a93d637c7f8604a2f3c88b0e6"}, ] [package.dependencies] @@ -4071,13 +4126,13 @@ types-pyOpenSSL = "*" [[package]] name = "types-regex" -version = "2024.5.15.20240519" +version = "2024.7.24.20240726" description = "Typing stubs for regex" optional = false python-versions = ">=3.8" files = [ - {file = "types-regex-2024.5.15.20240519.tar.gz", hash = "sha256:ef3f594a95a95d6b9b5704a1facf3511a73e4731209ddb8868461db4c42dc12b"}, - {file = "types_regex-2024.5.15.20240519-py3-none-any.whl", hash = "sha256:d5895079cc66f91ae8818aeef14e9337c492ceb87ad0ff3df8c1c04d418cb9dd"}, + {file = "types-regex-2024.7.24.20240726.tar.gz", hash = "sha256:f9cbebe607f53860bf5979de1e2a80cc04faf4849ee324461f982a3d46276d76"}, + {file = "types_regex-2024.7.24.20240726-py3-none-any.whl", hash = "sha256:c436d7eace8e6c33cec31630135c804c15cd4ef110baf9cdd370ac6e376ff661"}, ] [[package]] @@ -4096,13 +4151,13 @@ urllib3 = ">=2" [[package]] name = "types-setuptools" -version = "70.3.0.20240710" +version = "71.1.0.20240806" description = "Typing stubs for setuptools" optional = false python-versions = ">=3.8" files = [ - {file = "types-setuptools-70.3.0.20240710.tar.gz", hash = "sha256:842cbf399812d2b65042c9d6ff35113bbf282dee38794779aa1f94e597bafc35"}, - {file = "types_setuptools-70.3.0.20240710-py3-none-any.whl", hash = "sha256:bd0db2a4b9f2c49ac5564be4e0fb3125c4c46b1f73eafdcbceffa5b005cceca4"}, + {file = "types-setuptools-71.1.0.20240806.tar.gz", hash = "sha256:ae5e7b4d643ab9e99fc00ac00041804118cabe72a56183c30d524fb064897ad6"}, + {file = "types_setuptools-71.1.0.20240806-py3-none-any.whl", hash = "sha256:3bd8dd02039be0bb79ad880d8893b8eefcb022fabbeeb61245c61b20c9ab1ed0"}, ] [[package]] @@ -4150,13 +4205,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" -version = "0.30.1" +version = "0.30.5" description = "The lightning-fast ASGI server." optional = false python-versions = ">=3.8" files = [ - {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, - {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, + {file = "uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, + {file = "uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, ] [package.dependencies] @@ -4220,20 +4275,20 @@ test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)" [[package]] name = "vonage" -version = "3.16.0" +version = "3.16.1" description = "Vonage Server SDK for Python" optional = true python-versions = ">=3.8" files = [ - {file = "vonage-3.16.0-py2.py3-none-any.whl", hash = "sha256:ce14eb29f0942c55899c48254d39cb6624cdc1ff5e9b1ca6d520afea85abc352"}, - {file = "vonage-3.16.0.tar.gz", hash = "sha256:63ea60a70b358ddfc7b5491b1b39d3699d25fa41a6e9246ac4c8f3c5aeeff830"}, + {file = "vonage-3.16.1-py2.py3-none-any.whl", hash = "sha256:89b9ece2c884ff1e33dbd5241b9eb4e294a8f9b7ce305b887c8c1eed34063dd8"}, + {file = "vonage-3.16.1.tar.gz", hash = "sha256:881e99bb4ebf6e7b8b836853ed486ead2f1f7a83d5016ad9996026d7037de89b"}, ] [package.dependencies] Deprecated = "*" pydantic = ">=2.5.2" pytz = ">=2018.5" -requests = ">=2.4.2" +requests = ">=2.32.2" vonage-jwt = ">=1.1.0" [[package]] @@ -4268,86 +4323,98 @@ typing-extensions = ">=4.9.0" [[package]] name = "watchfiles" -version = "0.22.0" +version = "0.23.0" description = "Simple, modern and high performance file watching and code reload in python." optional = false python-versions = ">=3.8" files = [ - {file = "watchfiles-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538"}, - {file = "watchfiles-0.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171"}, - {file = "watchfiles-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39"}, - {file = "watchfiles-0.22.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848"}, - {file = "watchfiles-0.22.0-cp310-none-win32.whl", hash = "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797"}, - {file = "watchfiles-0.22.0-cp310-none-win_amd64.whl", hash = "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96"}, - {file = "watchfiles-0.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1"}, - {file = "watchfiles-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d"}, - {file = "watchfiles-0.22.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c"}, - {file = "watchfiles-0.22.0-cp311-none-win32.whl", hash = "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67"}, - {file = "watchfiles-0.22.0-cp311-none-win_amd64.whl", hash = "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1"}, - {file = "watchfiles-0.22.0-cp311-none-win_arm64.whl", hash = "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, - {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, - {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, - {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a"}, - {file = "watchfiles-0.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13"}, - {file = "watchfiles-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6"}, - {file = "watchfiles-0.22.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1"}, - {file = "watchfiles-0.22.0-cp38-none-win32.whl", hash = "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e"}, - {file = "watchfiles-0.22.0-cp38-none-win_amd64.whl", hash = "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0"}, - {file = "watchfiles-0.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8"}, - {file = "watchfiles-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087"}, - {file = "watchfiles-0.22.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6"}, - {file = "watchfiles-0.22.0-cp39-none-win32.whl", hash = "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93"}, - {file = "watchfiles-0.22.0-cp39-none-win_amd64.whl", hash = "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, - {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bee8ce357a05c20db04f46c22be2d1a2c6a8ed365b325d08af94358e0688eeb4"}, + {file = "watchfiles-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ccd3011cc7ee2f789af9ebe04745436371d36afe610028921cab9f24bb2987b"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb02d41c33be667e6135e6686f1bb76104c88a312a18faa0ef0262b5bf7f1a0f"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf12ac34c444362f3261fb3ff548f0037ddd4c5bb85f66c4be30d2936beb3c5"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0b2c25040a3c0ce0e66c7779cc045fdfbbb8d59e5aabfe033000b42fe44b53e"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf2be4b9eece4f3da8ba5f244b9e51932ebc441c0867bd6af46a3d97eb068d6"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40cb8fa00028908211eb9f8d47744dca21a4be6766672e1ff3280bee320436f1"}, + {file = "watchfiles-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f48c917ffd36ff9a5212614c2d0d585fa8b064ca7e66206fb5c095015bc8207"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9d183e3888ada88185ab17064079c0db8c17e32023f5c278d7bf8014713b1b5b"}, + {file = "watchfiles-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9837edf328b2805346f91209b7e660f65fb0e9ca18b7459d075d58db082bf981"}, + {file = "watchfiles-0.23.0-cp310-none-win32.whl", hash = "sha256:296e0b29ab0276ca59d82d2da22cbbdb39a23eed94cca69aed274595fb3dfe42"}, + {file = "watchfiles-0.23.0-cp310-none-win_amd64.whl", hash = "sha256:4ea756e425ab2dfc8ef2a0cb87af8aa7ef7dfc6fc46c6f89bcf382121d4fff75"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:e397b64f7aaf26915bf2ad0f1190f75c855d11eb111cc00f12f97430153c2eab"}, + {file = "watchfiles-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4ac73b02ca1824ec0a7351588241fd3953748d3774694aa7ddb5e8e46aef3e3"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130a896d53b48a1cecccfa903f37a1d87dbb74295305f865a3e816452f6e49e4"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c5e7803a65eb2d563c73230e9d693c6539e3c975ccfe62526cadde69f3fda0cf"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1aa4cc85202956d1a65c88d18c7b687b8319dbe6b1aec8969784ef7a10e7d1a"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87f889f6e58849ddb7c5d2cb19e2e074917ed1c6e3ceca50405775166492cca8"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37fd826dac84c6441615aa3f04077adcc5cac7194a021c9f0d69af20fb9fa788"}, + {file = "watchfiles-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee7db6e36e7a2c15923072e41ea24d9a0cf39658cb0637ecc9307b09d28827e1"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2368c5371c17fdcb5a2ea71c5c9d49f9b128821bfee69503cc38eae00feb3220"}, + {file = "watchfiles-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:857af85d445b9ba9178db95658c219dbd77b71b8264e66836a6eba4fbf49c320"}, + {file = "watchfiles-0.23.0-cp311-none-win32.whl", hash = "sha256:1d636c8aeb28cdd04a4aa89030c4b48f8b2954d8483e5f989774fa441c0ed57b"}, + {file = "watchfiles-0.23.0-cp311-none-win_amd64.whl", hash = "sha256:46f1d8069a95885ca529645cdbb05aea5837d799965676e1b2b1f95a4206313e"}, + {file = "watchfiles-0.23.0-cp311-none-win_arm64.whl", hash = "sha256:e495ed2a7943503766c5d1ff05ae9212dc2ce1c0e30a80d4f0d84889298fa304"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1db691bad0243aed27c8354b12d60e8e266b75216ae99d33e927ff5238d270b5"}, + {file = "watchfiles-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:62d2b18cb1edaba311fbbfe83fb5e53a858ba37cacb01e69bc20553bb70911b8"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e087e8fdf1270d000913c12e6eca44edd02aad3559b3e6b8ef00f0ce76e0636f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd41d5c72417b87c00b1b635738f3c283e737d75c5fa5c3e1c60cd03eac3af77"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e5f3ca0ff47940ce0a389457b35d6df601c317c1e1a9615981c474452f98de1"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6991e3a78f642368b8b1b669327eb6751439f9f7eaaa625fae67dd6070ecfa0b"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f7252f52a09f8fa5435dc82b6af79483118ce6bd51eb74e6269f05ee22a7b9f"}, + {file = "watchfiles-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e01bcb8d767c58865207a6c2f2792ad763a0fe1119fb0a430f444f5b02a5ea0"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e56fbcdd27fce061854ddec99e015dd779cae186eb36b14471fc9ae713b118c"}, + {file = "watchfiles-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bd3e2d64500a6cad28bcd710ee6269fbeb2e5320525acd0cfab5f269ade68581"}, + {file = "watchfiles-0.23.0-cp312-none-win32.whl", hash = "sha256:eb99c954291b2fad0eff98b490aa641e128fbc4a03b11c8a0086de8b7077fb75"}, + {file = "watchfiles-0.23.0-cp312-none-win_amd64.whl", hash = "sha256:dccc858372a56080332ea89b78cfb18efb945da858fabeb67f5a44fa0bcb4ebb"}, + {file = "watchfiles-0.23.0-cp312-none-win_arm64.whl", hash = "sha256:6c21a5467f35c61eafb4e394303720893066897fca937bade5b4f5877d350ff8"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ba31c32f6b4dceeb2be04f717811565159617e28d61a60bb616b6442027fd4b9"}, + {file = "watchfiles-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:85042ab91814fca99cec4678fc063fb46df4cbb57b4835a1cc2cb7a51e10250e"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24655e8c1c9c114005c3868a3d432c8aa595a786b8493500071e6a52f3d09217"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b1a950ab299a4a78fd6369a97b8763732bfb154fdb433356ec55a5bce9515c1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8d3c5cd327dd6ce0edfc94374fb5883d254fe78a5e9d9dfc237a1897dc73cd1"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ff785af8bacdf0be863ec0c428e3288b817e82f3d0c1d652cd9c6d509020dd0"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02b7ba9d4557149410747353e7325010d48edcfe9d609a85cb450f17fd50dc3d"}, + {file = "watchfiles-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a1b05c0afb2cd2f48c1ed2ae5487b116e34b93b13074ed3c22ad5c743109f0"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:109a61763e7318d9f821b878589e71229f97366fa6a5c7720687d367f3ab9eef"}, + {file = "watchfiles-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9f8e6bb5ac007d4a4027b25f09827ed78cbbd5b9700fd6c54429278dacce05d1"}, + {file = "watchfiles-0.23.0-cp313-none-win32.whl", hash = "sha256:f46c6f0aec8d02a52d97a583782d9af38c19a29900747eb048af358a9c1d8e5b"}, + {file = "watchfiles-0.23.0-cp313-none-win_amd64.whl", hash = "sha256:f449afbb971df5c6faeb0a27bca0427d7b600dd8f4a068492faec18023f0dcff"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2dddc2487d33e92f8b6222b5fb74ae2cfde5e8e6c44e0248d24ec23befdc5366"}, + {file = "watchfiles-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e75695cc952e825fa3e0684a7f4a302f9128721f13eedd8dbd3af2ba450932b8"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2537ef60596511df79b91613a5bb499b63f46f01a11a81b0a2b0dedf645d0a9c"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20b423b58f5fdde704a226b598a2d78165fe29eb5621358fe57ea63f16f165c4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b98732ec893975455708d6fc9a6daab527fc8bbe65be354a3861f8c450a632a4"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee1f5fcbf5bc33acc0be9dd31130bcba35d6d2302e4eceafafd7d9018c7755ab"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f195338a5a7b50a058522b39517c50238358d9ad8284fd92943643144c0c03"}, + {file = "watchfiles-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524fcb8d59b0dbee2c9b32207084b67b2420f6431ed02c18bd191e6c575f5c48"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0eff099a4df36afaa0eea7a913aa64dcf2cbd4e7a4f319a73012210af4d23810"}, + {file = "watchfiles-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a8323daae27ea290ba3350c70c836c0d2b0fb47897fa3b0ca6a5375b952b90d3"}, + {file = "watchfiles-0.23.0-cp38-none-win32.whl", hash = "sha256:aafea64a3ae698695975251f4254df2225e2624185a69534e7fe70581066bc1b"}, + {file = "watchfiles-0.23.0-cp38-none-win_amd64.whl", hash = "sha256:c846884b2e690ba62a51048a097acb6b5cd263d8bd91062cd6137e2880578472"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a753993635eccf1ecb185dedcc69d220dab41804272f45e4aef0a67e790c3eb3"}, + {file = "watchfiles-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6bb91fa4d0b392f0f7e27c40981e46dda9eb0fbc84162c7fb478fe115944f491"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1f67312efa3902a8e8496bfa9824d3bec096ff83c4669ea555c6bdd213aa516"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ca6b71dcc50d320c88fb2d88ecd63924934a8abc1673683a242a7ca7d39e781"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aec5c29915caf08771d2507da3ac08e8de24a50f746eb1ed295584ba1820330"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1733b9bc2c8098c6bdb0ff7a3d7cb211753fecb7bd99bdd6df995621ee1a574b"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02ff5d7bd066c6a7673b17c8879cd8ee903078d184802a7ee851449c43521bdd"}, + {file = "watchfiles-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18e2de19801b0eaa4c5292a223effb7cfb43904cb742c5317a0ac686ed604765"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8ada449e22198c31fb013ae7e9add887e8d2bd2335401abd3cbc55f8c5083647"}, + {file = "watchfiles-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3af1b05361e1cc497bf1be654a664750ae61f5739e4bb094a2be86ec8c6db9b6"}, + {file = "watchfiles-0.23.0-cp39-none-win32.whl", hash = "sha256:486bda18be5d25ab5d932699ceed918f68eb91f45d018b0343e3502e52866e5e"}, + {file = "watchfiles-0.23.0-cp39-none-win_amd64.whl", hash = "sha256:d2d42254b189a346249424fb9bb39182a19289a2409051ee432fb2926bad966a"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6a9265cf87a5b70147bfb2fec14770ed5b11a5bb83353f0eee1c25a81af5abfe"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9f02a259fcbbb5fcfe7a0805b1097ead5ba7a043e318eef1db59f93067f0b49b"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebaebb53b34690da0936c256c1cdb0914f24fb0e03da76d185806df9328abed"}, + {file = "watchfiles-0.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd257f98cff9c6cb39eee1a83c7c3183970d8a8d23e8cf4f47d9a21329285cee"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aba037c1310dd108411d27b3d5815998ef0e83573e47d4219f45753c710f969f"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a96ac14e184aa86dc43b8a22bb53854760a58b2966c2b41580de938e9bf26ed0"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11698bb2ea5e991d10f1f4f83a39a02f91e44e4bd05f01b5c1ec04c9342bf63c"}, + {file = "watchfiles-0.23.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efadd40fca3a04063d40c4448c9303ce24dd6151dc162cfae4a2a060232ebdcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:556347b0abb4224c5ec688fc58214162e92a500323f50182f994f3ad33385dcb"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1cf7f486169986c4b9d34087f08ce56a35126600b6fef3028f19ca16d5889071"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18de0f82c62c4197bea5ecf4389288ac755896aac734bd2cc44004c56e4ac47"}, + {file = "watchfiles-0.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:532e1f2c491274d1333a814e4c5c2e8b92345d41b12dc806cf07aaff786beb66"}, + {file = "watchfiles-0.23.0.tar.gz", hash = "sha256:9338ade39ff24f8086bb005d16c29f8e9f19e55b18dcb04dfa26fcbc09da497b"}, ] [package.dependencies] @@ -4656,4 +4723,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "645eeaebdbc1191899f3c62d06923897d88986d7f3f0010724f974bee266a9f8" +content-hash = "8764521de733dd192ed02ee787441937d3e48eec29cd27cb958ccc773972952e" diff --git a/pyproject.toml b/pyproject.toml index 0a5184e45f..8017072c2b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ groq = { version = "^0.9.0", optional = true } # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } pvkoala = { version = "^2.0.1", optional = true } -cartesia = { version = "^1.0.7", optional = true } +cartesia = { version = "^1.0.10", optional = true } # Transcribers google-cloud-speech = { version = "^2.26.0", optional = true } diff --git a/roadmap.md b/roadmap.md index 27fc2cc209..0a4c375038 100644 --- a/roadmap.md +++ b/roadmap.md @@ -27,6 +27,7 @@ Our roadmap; if an issue has been created or the feature is currently being work - [x] Bark - [x] [Play.ht](http://Play.ht) - [x] Eleven Labs + - [x] Cartesia - [ ] Amazon Polly - [ ] Resemble.AI diff --git a/vocode/streaming/models/synthesizer.py b/vocode/streaming/models/synthesizer.py index df0a2f3ae9..54a38830e9 100644 --- a/vocode/streaming/models/synthesizer.py +++ b/vocode/streaming/models/synthesizer.py @@ -1,5 +1,5 @@ from enum import Enum -from typing import Any, Dict, List, Literal, Optional, TypedDict +from typing import Any, Dict, List, Literal, Optional, Union from pydantic.v1 import validator @@ -230,18 +230,18 @@ class PollySynthesizerConfig(SynthesizerConfig, type=SynthesizerType.POLLY.value DEFAULT_CARTESIA_MODEL_ID = "sonic-english" -DEFAULT_CARTESIA_VOICE_ID = "829ccd10-f8b3-43cd-b8a0-4aeaa81f3b30" +DEFAULT_CARTESIA_VOICE_ID = "f9836c6e-a0bd-460e-9d3c-f7299fa60f94" -class CartesiaVoiceControls(TypedDict): +class CartesiaVoiceControls(BaseModel): """See https://docs.cartesia.ai/user-guides/voice-control""" - speed: str - emotion: List[str] + speed: Optional[Union[float, str]] = None + emotion: Optional[List[str]] = None class CartesiaSynthesizerConfig(SynthesizerConfig, type=SynthesizerType.CARTESIA.value): # type: ignore api_key: Optional[str] = None model_id: str = DEFAULT_CARTESIA_MODEL_ID voice_id: str = DEFAULT_CARTESIA_VOICE_ID - _experimental_voice_controls: Optional[CartesiaVoiceControls] = None + experimental_voice_controls: Optional[CartesiaVoiceControls] = None diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index e9ea6ac210..959ca5ba5e 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -1,3 +1,4 @@ +import asyncio import hashlib from loguru import logger @@ -28,7 +29,11 @@ def __init__( self.cartesia_tts = AsyncCartesia - self._experimental_voice_controls = synthesizer_config._experimental_voice_controls + self._experimental_voice_controls = None + if synthesizer_config.experimental_voice_controls: + self._experimental_voice_controls = ( + synthesizer_config.experimental_voice_controls.dict() + ) if synthesizer_config.audio_encoding == AudioEncoding.LINEAR16: match synthesizer_config.sampling_rate: @@ -85,6 +90,8 @@ def __init__( self.client = self.cartesia_tts(api_key=self.api_key) self.ws = None self.ctx = None + self.no_more_inputs_task = None + self.no_more_inputs_lock = asyncio.Lock() async def initialize_ws(self): if self.ws is None: @@ -96,9 +103,25 @@ async def initialize_ctx(self, is_first_text_chunk: bool): self.ctx = self.ws.context() else: if is_first_text_chunk: + if self.no_more_inputs_task: + self.no_more_inputs_task.cancel() await self.ctx.no_more_inputs() self.ctx = self.ws.context() + # This workaround is necessary to prevent the last chunk getting delayed. + # In the future, `create_speech_uncached` should be modified to handle this properly by adding a flag to the last chunk. + def refresh_no_more_inputs_task(self): + if self.no_more_inputs_task: + self.no_more_inputs_task.cancel() + + async def delayed_no_more_inputs(): + await asyncio.sleep(1) + async with self.no_more_inputs_lock: + if self.ctx: + await self.ctx.no_more_inputs() + + self.no_more_inputs_task = asyncio.create_task(delayed_no_more_inputs()) + async def create_speech_uncached( self, message: BaseMessage, @@ -123,6 +146,11 @@ async def create_speech_uncached( output_format=self.output_format, _experimental_voice_controls=self._experimental_voice_controls, ) + if not is_sole_text_chunk: + try: + self.refresh_no_more_inputs_task() + except Exception as e: + logger.info(f"Caught error while sending no more inputs: {e}") async def chunk_generator(context): buffer = bytearray() @@ -143,6 +171,13 @@ async def chunk_generator(context): ) self.ctx._close() if buffer: + # pad the leftover buffer with silence + if len(buffer) < chunk_size: + padding_size = chunk_size - len(buffer) + if self.output_format["encoding"] == "pcm_mulaw": + buffer.extend(b"\x7f" * padding_size) # 127 is silence in mu-law + elif self.output_format["encoding"] == "pcm_s16le": + buffer.extend(b"\x00\x00" * padding_size) # 0 is silence in s16le yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) return SynthesisResult( @@ -167,6 +202,8 @@ def get_voice_identifier(cls, synthesizer_config: CartesiaSynthesizerConfig): async def tear_down(self): await super().tear_down() + if self.no_more_inputs_task: + self.no_more_inputs_task.cancel() if self.ctx: self.ctx._close() await self.ws.close() diff --git a/vocode/streaming/vector_db/pinecone.py b/vocode/streaming/vector_db/pinecone.py index ba40fda5c2..6dc7453723 100644 --- a/vocode/streaming/vector_db/pinecone.py +++ b/vocode/streaming/vector_db/pinecone.py @@ -1,5 +1,5 @@ import uuid -from typing import Iterable, List, Optional, Tuple +from typing import Any, Iterable, List, Optional, Tuple, TypeGuard from langchain.docstore.document import Document from loguru import logger @@ -9,15 +9,20 @@ from vocode.streaming.vector_db.base_vector_db import VectorDB +def is_non_empty_string(value: Any) -> TypeGuard[str]: + return isinstance(value, str) and len(value) > 0 + + class PineconeDB(VectorDB): def __init__(self, config: PineconeConfig, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.config = config self.index_name = self.config.index - self.pinecone_api_key = getenv("PINECONE_API_KEY") or self.config.api_key - if not self.pinecone_api_key: - raise ValueError("Pinecone API key not set") + pinecone_api_key = getenv("PINECONE_API_KEY") or self.config.api_key + if not is_non_empty_string(pinecone_api_key): + raise ValueError("Pinecone API key not set or invalid") + self.pinecone_api_key = pinecone_api_key self.pinecone_environment = getenv("PINECONE_ENVIRONMENT") or self.config.api_environment self.pinecone_url = f"https://{self.index_name}.svc.{self.pinecone_environment}.pinecone.io" self._text_key = "text" From 6e6f37abff38780bbe50ef1cf32c1f739932aebc Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Wed, 7 Aug 2024 11:36:39 -0700 Subject: [PATCH 137/148] poetry version prerelease (#680) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8017072c2b..3f5e276d20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "vocode" -version = "0.1.114a1" +version = "0.1.114a2" description = "The all-in-one voice SDK" authors = ["Ajay Raj "] license = "MIT License" From 9cda52c1503ea7a4039b43c8155fe46657f459b1 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Thu, 15 Aug 2024 17:28:44 -0700 Subject: [PATCH 138/148] adds compute total chars interface (#683) --- .../synthesizer/azure_synthesizer.py | 48 ++++++++++++++----- .../streaming/synthesizer/base_synthesizer.py | 8 +++- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/vocode/streaming/synthesizer/azure_synthesizer.py b/vocode/streaming/synthesizer/azure_synthesizer.py index 11c4c03649..67171dc4fa 100644 --- a/vocode/streaming/synthesizer/azure_synthesizer.py +++ b/vocode/streaming/synthesizer/azure_synthesizer.py @@ -144,7 +144,10 @@ async def get_phrase_filler_audios(self) -> List[FillerAudio]: audio_data = open(filler_audio_path, "rb").read() else: logger.debug(f"Generating filler audio for {filler_phrase.text}") - ssml = self.create_ssml(filler_phrase.text) + ssml = self.create_ssml( + message=filler_phrase.text, synthesizer_config=self.synthesizer_config + ) + self.total_chars += self.get_total_chars_from_ssml(ssml) result = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesizer.speak_ssml, ssml ) @@ -176,16 +179,35 @@ def add_marks(self, message: str, index=0) -> str: def word_boundary_cb(self, evt, pool): pool.add(evt) - def create_ssml(self, message: str) -> str: - voice_language_code = self.synthesizer_config.voice_name[:5] + @classmethod + def compute_total_chars( + cls, message: BaseMessage, synthesizer_config: AzureSynthesizerConfig + ) -> int: + ssml = ( + message.ssml + if isinstance(message, SSMLMessage) + else cls.create_ssml(message=message.text, synthesizer_config=synthesizer_config) + ) + return cls.get_total_chars_from_ssml(ssml) + + @staticmethod + def get_total_chars_from_ssml(ssml: str) -> int: + regmatch = re.search(_AZURE_INSIDE_VOICE_REGEX, ssml, re.DOTALL) + if regmatch: + return len(regmatch.group(1)) + return 0 + + @staticmethod + def create_ssml(message: str, synthesizer_config: AzureSynthesizerConfig) -> str: + voice_language_code = synthesizer_config.voice_name[:5] ssml_root = ElementTree.fromstring( f'' ) voice = ElementTree.SubElement(ssml_root, "voice") - voice.set("name", self.voice_name) - if self.synthesizer_config.language_code != "en-US": + voice.set("name", synthesizer_config.voice_name) + if synthesizer_config.language_code != "en-US": lang = ElementTree.SubElement(voice, "{%s}lang" % NAMESPACES.get("")) - lang.set("xml:lang", self.synthesizer_config.language_code) + lang.set("xml:lang", synthesizer_config.language_code) voice_root = lang else: voice_root = voice @@ -198,13 +220,10 @@ def create_ssml(self, message: str) -> str: silence.set("value", "500ms") silence.set("type", "Tailing-exact") prosody = ElementTree.SubElement(voice_root, "prosody") - prosody.set("pitch", f"{self.pitch}%") - prosody.set("rate", f"{self.rate}%") + prosody.set("pitch", f"{synthesizer_config.pitch}%") + prosody.set("rate", f"{synthesizer_config.rate}%") prosody.text = message.strip() ssml = ElementTree.tostring(ssml_root, encoding="unicode") - regmatch = re.search(_AZURE_INSIDE_VOICE_REGEX, ssml, re.DOTALL) - if regmatch: - self.total_chars += len(regmatch.group(1)) return ssml def synthesize_ssml(self, ssml: str) -> speechsdk.AudioDataStream: @@ -293,7 +312,12 @@ async def chunk_generator( self.synthesizer.synthesis_word_boundary.connect( lambda event: self.word_boundary_cb(event, word_boundary_event_pool) ) - ssml = message.ssml if isinstance(message, SSMLMessage) else self.create_ssml(message.text) + ssml = ( + message.ssml + if isinstance(message, SSMLMessage) + else self.create_ssml(message=message.text, synthesizer_config=self.synthesizer_config) + ) + self.total_chars += self.get_total_chars_from_ssml(ssml) audio_data_stream = await asyncio.get_event_loop().run_in_executor( self.thread_pool_executor, self.synthesize_ssml, ssml ) diff --git a/vocode/streaming/synthesizer/base_synthesizer.py b/vocode/streaming/synthesizer/base_synthesizer.py index b41c30db74..0b07114294 100644 --- a/vocode/streaming/synthesizer/base_synthesizer.py +++ b/vocode/streaming/synthesizer/base_synthesizer.py @@ -239,6 +239,7 @@ def create_synthesis_result(self, chunk_size) -> SynthesisResult: class BaseSynthesizer(Generic[SynthesizerConfigType]): streaming_conversation: "StreamingConversation" + total_chars: int def __init__( self, @@ -277,9 +278,14 @@ def get_typing_noise_filler_audio(self) -> FillerAudio: seconds_per_chunk=2, ) - def get_cost(self) -> float: + @classmethod + def get_cost(cls, total_chars) -> float: raise NotImplementedError + @classmethod + def compute_total_chars(cls, message: BaseMessage, synthesizer_config: SynthesizerConfigType): + return len(message.text) + async def set_filler_audios(self, filler_audio_config: FillerAudioConfig): if filler_audio_config.use_phrases: self.filler_audios = await self.get_phrase_filler_audios() From d857d7e43cba61e6568db3cb5f6104811d134129 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Fri, 16 Aug 2024 10:24:16 -0700 Subject: [PATCH 139/148] Add link number to nav and refresh interface for link number (#685) --- docs/mint.json | 1 + docs/openapi.json | 2006 ++++++++++++++++++++++++++++++--------------- 2 files changed, 1360 insertions(+), 647 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index 6d661923af..0d94dc61c2 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -125,6 +125,7 @@ "api-reference/numbers/list-numbers", "api-reference/numbers/get-number", "api-reference/numbers/buy-number", + "api-reference/numbers/link-number", "api-reference/numbers/update-number", "api-reference/numbers/cancel-number" ] diff --git a/docs/openapi.json b/docs/openapi.json index 8704e7b822..a959dff13c 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -20,34 +20,38 @@ "tags": ["numbers"], "summary": "List Numbers", "operationId": "list_numbers", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -67,8 +71,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/numbers": { @@ -76,12 +79,13 @@ "tags": ["numbers"], "summary": "Get Number", "operationId": "get_number", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "title": "Phone Number" } } ], "responses": { @@ -101,8 +105,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/numbers/buy": { @@ -149,21 +152,22 @@ "tags": ["numbers"], "summary": "Update Number", "operationId": "update_number", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "title": "Phone Number" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateNumberRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -182,8 +186,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/numbers/cancel": { @@ -191,12 +194,13 @@ "tags": ["numbers"], "summary": "Cancel Number", "operationId": "cancel_number", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "title": "Phone Number" }, "name": "phone_number", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "title": "Phone Number" } } ], "responses": { @@ -216,8 +220,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/numbers/link": { @@ -261,34 +264,38 @@ "tags": ["calls"], "summary": "List Calls", "operationId": "list_calls", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -308,8 +315,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/calls": { @@ -317,12 +323,13 @@ "tags": ["calls"], "summary": "Get Call", "operationId": "get_call", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -342,8 +349,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/calls/end": { @@ -351,12 +357,13 @@ "tags": ["calls"], "summary": "End Call", "operationId": "end_call", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -376,8 +383,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/calls/create": { @@ -419,12 +425,13 @@ "tags": ["calls"], "summary": "Get Recording", "operationId": "get_recording", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -440,8 +447,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/usage": { @@ -467,12 +473,13 @@ "tags": ["actions"], "summary": "Get Action", "operationId": "get_action", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -492,8 +499,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/actions/list": { @@ -501,34 +507,38 @@ "tags": ["actions"], "summary": "List Actions", "operationId": "list_actions", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -548,8 +558,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/actions/create": { @@ -591,23 +600,24 @@ "tags": ["actions"], "summary": "Update Action", "operationId": "update_action", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ActionUpdateParamsRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -626,8 +636,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/agents": { @@ -635,12 +644,13 @@ "tags": ["agents"], "summary": "Get Agent", "operationId": "get_agent", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -660,8 +670,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/agents/list": { @@ -669,34 +678,38 @@ "tags": ["agents"], "summary": "List Agents", "operationId": "list_agents", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -716,8 +729,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/agents/create": { @@ -759,21 +771,22 @@ "tags": ["agents"], "summary": "Update Agent", "operationId": "update_agent", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AgentUpdateParams" } } - }, - "required": true + } }, "responses": { "200": { @@ -792,8 +805,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/voices": { @@ -801,12 +813,13 @@ "tags": ["voices"], "summary": "Get Voice", "operationId": "get_voice", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -826,8 +839,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/voices/list": { @@ -835,34 +847,38 @@ "tags": ["voices"], "summary": "List Voices", "operationId": "list_voices", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -882,8 +898,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/voices/create": { @@ -925,23 +940,24 @@ "tags": ["voices"], "summary": "Update Voice", "operationId": "update_voice", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VoiceUpdateParamsRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -960,8 +976,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/webhooks": { @@ -969,12 +984,13 @@ "tags": ["webhooks"], "summary": "Get Webhook", "operationId": "get_webhook", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -994,8 +1010,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/webhooks/list": { @@ -1003,34 +1018,38 @@ "tags": ["webhooks"], "summary": "List Webhooks", "operationId": "list_webhooks", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -1050,8 +1069,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/webhooks/create": { @@ -1093,21 +1111,22 @@ "tags": ["webhooks"], "summary": "Update Webhook", "operationId": "update_webhook", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookUpdateParams" } } - }, - "required": true + } }, "responses": { "200": { @@ -1126,8 +1145,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/prompts": { @@ -1135,12 +1153,13 @@ "tags": ["prompts"], "summary": "Get Prompt", "operationId": "get_prompt", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -1160,8 +1179,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/prompts/list": { @@ -1169,34 +1187,38 @@ "tags": ["prompts"], "summary": "List Prompts", "operationId": "list_prompts", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -1216,8 +1238,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/prompts/create": { @@ -1259,21 +1280,22 @@ "tags": ["prompts"], "summary": "Update Prompt", "operationId": "update_prompt", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PromptUpdateParams" } } - }, - "required": true + } }, "responses": { "200": { @@ -1292,8 +1314,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/vector_databases": { @@ -1301,12 +1322,13 @@ "tags": ["vector_databases"], "summary": "Get Vector Database", "operationId": "get_vector_database", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -1328,8 +1350,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/vector_databases/list": { @@ -1337,34 +1358,38 @@ "tags": ["vector_databases"], "summary": "List Vector Databases", "operationId": "list_vector_databases", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -1384,8 +1409,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/vector_databases/create": { @@ -1431,23 +1455,24 @@ "tags": ["vector_databases"], "summary": "Update Vector Database", "operationId": "update_vector_database", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PineconeVectorDatabaseUpdateParams" } } - }, - "required": true + } }, "responses": { "200": { @@ -1468,8 +1493,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/account_connections": { @@ -1477,12 +1501,13 @@ "tags": ["account_connections"], "summary": "Get Account Connection", "operationId": "get_account_connection", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "responses": { @@ -1504,8 +1529,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/account_connections/list": { @@ -1513,34 +1537,38 @@ "tags": ["account_connections"], "summary": "List Account Connections", "operationId": "list_account_connections", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": false, - "schema": { "type": "integer", "title": "Page", "default": 1 }, "name": "page", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 1, "title": "Page" } }, { - "required": false, - "schema": { "type": "integer", "title": "Size", "default": 10 }, "name": "size", - "in": "query" + "in": "query", + "required": false, + "schema": { "type": "integer", "default": 10, "title": "Size" } }, { - "required": false, - "schema": { "type": "string", "title": "Sort Column" }, "name": "sort_column", - "in": "query" + "in": "query", + "required": false, + "schema": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Sort Column" + } }, { + "name": "sort_desc", + "in": "query", "required": false, "schema": { - "type": "boolean", - "title": "Sort Desc", - "default": false - }, - "name": "sort_desc", - "in": "query" + "anyOf": [{ "type": "boolean" }, { "type": "null" }], + "default": false, + "title": "Sort Desc" + } } ], "responses": { @@ -1562,8 +1590,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/account_connections/create": { @@ -1609,23 +1636,24 @@ "tags": ["account_connections"], "summary": "Update Account Connection", "operationId": "update_account_connection", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AccountConnectionUpdateParamsRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -1646,8 +1674,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/account_connections/add_to_steering_pool": { @@ -1655,19 +1682,24 @@ "tags": ["account_connections"], "summary": "Add To Steering Pool", "operationId": "add_to_steering_pool", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AddToSteeringPoolRequest" + "anyOf": [ + { "$ref": "#/components/schemas/AddToSteeringPoolRequest" }, + { "type": "null" } + ], + "title": "Add To Steering Pool Request" } } } @@ -1685,8 +1717,7 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } } }, "/v1/account_connections/remove_from_steering_pool": { @@ -1694,23 +1725,24 @@ "tags": ["account_connections"], "summary": "Remove From Steering Pool", "operationId": "remove_from_steering_pool", + "security": [{ "HTTPBearer": [] }], "parameters": [ { - "required": true, - "schema": { "type": "string", "format": "uuid", "title": "Id" }, "name": "id", - "in": "query" + "in": "query", + "required": true, + "schema": { "type": "string", "format": "uuid", "title": "Id" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RemoveFromSteeringPoolRequest" } } - }, - "required": true + } }, "responses": { "200": { @@ -1725,8 +1757,20 @@ } } } - }, - "security": [{ "HTTPBearer": [] }] + } + } + }, + "/metrics": { + "get": { + "summary": "Metrics", + "description": "Endpoint that serves Prometheus metrics.", + "operationId": "metrics_metrics_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { "application/json": { "schema": {} } } + } + } } } }, @@ -1743,8 +1787,8 @@ "discriminator": { "propertyName": "type", "mapping": { - "account_connection_twilio": "#/components/schemas/TwilioAccountConnection", - "account_connection_openai": "#/components/schemas/OpenAIAccountConnection" + "account_connection_openai": "#/components/schemas/OpenAIAccountConnection", + "account_connection_twilio": "#/components/schemas/TwilioAccountConnection" } } }, @@ -1780,8 +1824,8 @@ "discriminator": { "propertyName": "type", "mapping": { - "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionParams", - "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionParams" + "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionParams", + "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionParams" } } }, @@ -1794,8 +1838,8 @@ "discriminator": { "propertyName": "type", "mapping": { - "account_connection_twilio": "#/components/schemas/TwilioAccountConnection", - "account_connection_openai": "#/components/schemas/OpenAIAccountConnection" + "account_connection_openai": "#/components/schemas/OpenAIAccountConnection", + "account_connection_twilio": "#/components/schemas/TwilioAccountConnection" } } }, @@ -1810,8 +1854,8 @@ "discriminator": { "propertyName": "type", "mapping": { - "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionUpdateParams", - "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionUpdateParams" + "account_connection_openai": "#/components/schemas/OpenAIAccountConnectionUpdateParams", + "account_connection_twilio": "#/components/schemas/TwilioAccountConnectionUpdateParams" } } }, @@ -1830,12 +1874,12 @@ "discriminator": { "propertyName": "type", "mapping": { - "action_transfer_call": "#/components/schemas/TransferCallAction", - "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_dtmf": "#/components/schemas/DTMFAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_external": "#/components/schemas/ExternalAction", "action_set_hold": "#/components/schemas/SetHoldAction", - "action_external": "#/components/schemas/ExternalAction" + "action_transfer_call": "#/components/schemas/TransferCallAction" } } }, @@ -1875,12 +1919,12 @@ "discriminator": { "propertyName": "type", "mapping": { - "action_transfer_call": "#/components/schemas/TransferCallActionParams", - "action_end_conversation": "#/components/schemas/EndConversationActionParams", - "action_dtmf": "#/components/schemas/DTMFActionParams", "action_add_to_conference": "#/components/schemas/AddToConferenceActionParams", + "action_dtmf": "#/components/schemas/DTMFActionParams", + "action_end_conversation": "#/components/schemas/EndConversationActionParams", + "action_external": "#/components/schemas/ExternalActionParams", "action_set_hold": "#/components/schemas/SetHoldActionParams", - "action_external": "#/components/schemas/ExternalActionParams" + "action_transfer_call": "#/components/schemas/TransferCallActionParams" } } }, @@ -1897,12 +1941,12 @@ "discriminator": { "propertyName": "type", "mapping": { - "action_transfer_call": "#/components/schemas/TransferCallAction", - "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_dtmf": "#/components/schemas/DTMFAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_external": "#/components/schemas/ExternalAction", "action_set_hold": "#/components/schemas/SetHoldAction", - "action_external": "#/components/schemas/ExternalAction" + "action_transfer_call": "#/components/schemas/TransferCallAction" } } }, @@ -1919,12 +1963,12 @@ "discriminator": { "propertyName": "type", "mapping": { - "action_transfer_call": "#/components/schemas/TransferCallActionUpdateParams", - "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", - "action_dtmf": "#/components/schemas/DTMFActionUpdateParams", "action_add_to_conference": "#/components/schemas/AddToConferenceActionUpdateParams", + "action_dtmf": "#/components/schemas/DTMFActionUpdateParams", + "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", + "action_external": "#/components/schemas/ExternalActionUpdateParams", "action_set_hold": "#/components/schemas/SetHoldActionUpdateParams", - "action_external": "#/components/schemas/ExternalActionUpdateParams" + "action_transfer_call": "#/components/schemas/TransferCallActionUpdateParams" } } }, @@ -1935,13 +1979,14 @@ "type": { "type": "string", "enum": ["action_add_to_conference"], + "const": "action_add_to_conference", "title": "Type" }, "config": { "$ref": "#/components/schemas/AddToConferenceConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Output" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -1949,7 +1994,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Output" } } } @@ -1963,13 +2008,14 @@ "type": { "type": "string", "enum": ["action_add_to_conference"], + "const": "action_add_to_conference", "title": "Type" }, "config": { "$ref": "#/components/schemas/AddToConferenceConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -1977,7 +2023,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" } } } @@ -1991,6 +2037,7 @@ "type": { "type": "string", "enum": ["action_add_to_conference"], + "const": "action_add_to_conference", "title": "Type" }, "config": { @@ -2005,8 +2052,17 @@ { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] + { + "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + } }, { "$ref": "#/components/schemas/Undefined" } ], @@ -2033,17 +2089,22 @@ }, "AddToSteeringPoolRequest": { "properties": { - "phone_number": { "type": "string", "title": "Phone Number" } + "phone_number": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Phone Number" + } }, "type": "object", - "required": ["phone_number"], "title": "AddToSteeringPoolRequest" }, "Agent": { "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "name": { "type": "string", "title": "Name" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, "prompt": { "$ref": "#/components/schemas/Prompt" }, "language": { "allOf": [{ "$ref": "#/components/schemas/Language" }], @@ -2062,12 +2123,12 @@ "discriminator": { "propertyName": "type", "mapping": { - "action_transfer_call": "#/components/schemas/TransferCallAction", - "action_end_conversation": "#/components/schemas/EndConversationAction", - "action_dtmf": "#/components/schemas/DTMFAction", "action_add_to_conference": "#/components/schemas/AddToConferenceAction", + "action_dtmf": "#/components/schemas/DTMFAction", + "action_end_conversation": "#/components/schemas/EndConversationAction", + "action_external": "#/components/schemas/ExternalAction", "action_set_hold": "#/components/schemas/SetHoldAction", - "action_external": "#/components/schemas/ExternalAction" + "action_transfer_call": "#/components/schemas/TransferCallAction" } } }, @@ -2079,29 +2140,45 @@ { "$ref": "#/components/schemas/AzureVoice" }, { "$ref": "#/components/schemas/RimeVoice" }, { "$ref": "#/components/schemas/ElevenLabsVoice" }, - { "$ref": "#/components/schemas/PlayHtVoice" } + { "$ref": "#/components/schemas/PlayHtVoice" }, + { "$ref": "#/components/schemas/VocodeVoice" } ], "title": "Voice", "discriminator": { "propertyName": "type", "mapping": { "voice_azure": "#/components/schemas/AzureVoice", - "voice_rime": "#/components/schemas/RimeVoice", "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", - "voice_play_ht": "#/components/schemas/PlayHtVoice" + "voice_play_ht": "#/components/schemas/PlayHtVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_vocode": "#/components/schemas/VocodeVoice" } } }, - "initial_message": { "type": "string", "title": "Initial Message" }, - "webhook": { "$ref": "#/components/schemas/Webhook" }, + "initial_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Initial Message" + }, + "webhook": { + "anyOf": [ + { "$ref": "#/components/schemas/Webhook" }, + { "type": "null" } + ] + }, "vector_database": { - "$ref": "#/components/schemas/PineconeVectorDatabase" + "anyOf": [ + { "$ref": "#/components/schemas/PineconeVectorDatabase" }, + { "type": "null" } + ] }, "interrupt_sensitivity": { "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "low" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "noise_suppression": { "type": "boolean", "title": "Noise Suppression", @@ -2130,7 +2207,7 @@ "default": 0.0 }, "openai_model_name_override": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Openai Model Name Override" }, "ask_if_human_present_on_idle": { @@ -2139,13 +2216,34 @@ "default": false }, "openai_account_connection": { - "$ref": "#/components/schemas/OpenAIAccountConnection" + "anyOf": [ + { "$ref": "#/components/schemas/OpenAIAccountConnection" }, + { "type": "null" } + ] }, "run_do_not_call_detection": { "type": "boolean", "title": "Run Do Not Call Detection", "default": false }, + "llm_fallback": { + "anyOf": [ + { "$ref": "#/components/schemas/InternalLLMFallback" }, + { "type": "null" } + ] + }, + "deepgram_keywords": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [{ "type": "integer" }, { "type": "number" }] + }, + "type": "object" + }, + { "type": "null" } + ], + "title": "Deepgram Keywords" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -2185,7 +2283,10 @@ }, "AgentParams": { "properties": { - "name": { "type": "string", "title": "Name" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -2213,7 +2314,18 @@ }, { "$ref": "#/components/schemas/SetHoldActionParams" }, { "$ref": "#/components/schemas/ExternalActionParams" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_add_to_conference": "#/components/schemas/AddToConferenceActionParams", + "action_dtmf": "#/components/schemas/DTMFActionParams", + "action_end_conversation": "#/components/schemas/EndConversationActionParams", + "action_external": "#/components/schemas/ExternalActionParams", + "action_set_hold": "#/components/schemas/SetHoldActionParams", + "action_transfer_call": "#/components/schemas/TransferCallActionParams" + } + } } ] }, @@ -2229,24 +2341,40 @@ { "$ref": "#/components/schemas/AzureVoiceParams" }, { "$ref": "#/components/schemas/RimeVoiceParams" }, { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, - { "$ref": "#/components/schemas/PlayHtVoiceParams" } - ] + { "$ref": "#/components/schemas/PlayHtVoiceParams" }, + { "$ref": "#/components/schemas/VocodeVoiceParams" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoiceParams", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceParams", + "voice_play_ht": "#/components/schemas/PlayHtVoiceParams", + "voice_rime": "#/components/schemas/RimeVoiceParams", + "voice_vocode": "#/components/schemas/VocodeVoiceParams" + } + } } ], "title": "Voice" }, - "initial_message": { "type": "string", "title": "Initial Message" }, + "initial_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Initial Message" + }, "webhook": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/WebhookParams" } + { "$ref": "#/components/schemas/WebhookParams" }, + { "type": "null" } ], "title": "Webhook" }, "vector_database": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" }, + { "type": "null" } ], "title": "Vector Database" }, @@ -2254,7 +2382,10 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "low" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "noise_suppression": { "type": "boolean", "title": "Noise Suppression", @@ -2283,7 +2414,7 @@ "default": 0.0 }, "openai_model_name_override": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Openai Model Name Override" }, "ask_if_human_present_on_idle": { @@ -2294,7 +2425,8 @@ "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, - { "type": "string", "format": "uuid" } + { "type": "string", "format": "uuid" }, + { "type": "null" } ], "title": "Openai Account Connection" }, @@ -2303,6 +2435,24 @@ "title": "Run Do Not Call Detection", "default": false }, + "llm_fallback": { + "anyOf": [ + { "$ref": "#/components/schemas/InternalLLMFallback" }, + { "type": "null" } + ] + }, + "deepgram_keywords": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [{ "type": "integer" }, { "type": "number" }] + }, + "type": "object" + }, + { "type": "null" } + ], + "title": "Deepgram Keywords" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -2318,7 +2468,8 @@ "name": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Name" }, @@ -2363,7 +2514,18 @@ { "$ref": "#/components/schemas/ExternalActionUpdateParams" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_add_to_conference": "#/components/schemas/AddToConferenceActionUpdateParams", + "action_dtmf": "#/components/schemas/DTMFActionUpdateParams", + "action_end_conversation": "#/components/schemas/EndConversationActionUpdateParams", + "action_external": "#/components/schemas/ExternalActionUpdateParams", + "action_set_hold": "#/components/schemas/SetHoldActionUpdateParams", + "action_transfer_call": "#/components/schemas/TransferCallActionUpdateParams" + } + } } ] }, @@ -2383,8 +2545,19 @@ { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" }, - { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" } - ] + { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" }, + { "$ref": "#/components/schemas/VocodeVoiceUpdateParams" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoiceUpdateParams", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceUpdateParams", + "voice_play_ht": "#/components/schemas/PlayHtVoiceUpdateParams", + "voice_rime": "#/components/schemas/RimeVoiceUpdateParams", + "voice_vocode": "#/components/schemas/VocodeVoiceUpdateParams" + } + } }, { "$ref": "#/components/schemas/Undefined" } ], @@ -2393,7 +2566,8 @@ "initial_message": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Initial Message" }, @@ -2401,7 +2575,8 @@ "anyOf": [ { "type": "string", "format": "uuid" }, { "$ref": "#/components/schemas/WebhookUpdateParams" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Webhook" }, @@ -2411,7 +2586,8 @@ { "$ref": "#/components/schemas/PineconeVectorDatabaseUpdateParams" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Vector Database" }, @@ -2425,7 +2601,8 @@ "context_endpoint": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Context Endpoint" }, @@ -2467,7 +2644,8 @@ "openai_model_name_override": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Openai Model Name Override" }, @@ -2482,7 +2660,8 @@ "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Openai Account Connection" }, @@ -2492,6 +2671,27 @@ { "$ref": "#/components/schemas/Undefined" } ], "title": "Run Do Not Call Detection" + }, + "llm_fallback": { + "anyOf": [ + { "$ref": "#/components/schemas/InternalLLMFallback" }, + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } + ], + "title": "Llm Fallback" + }, + "deepgram_keywords": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [{ "type": "integer" }, { "type": "number" }] + }, + "type": "object" + }, + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } + ], + "title": "Deepgram Keywords" } }, "type": "object", @@ -2504,6 +2704,7 @@ "type": { "type": "string", "enum": ["voice_azure"], + "const": "voice_azure", "title": "Type" }, "voice_name": { "type": "string", "title": "Voice Name" }, @@ -2519,6 +2720,7 @@ "type": { "type": "string", "enum": ["voice_azure"], + "const": "voice_azure", "title": "Type" }, "voice_name": { "type": "string", "title": "Voice Name" }, @@ -2534,6 +2736,7 @@ "type": { "type": "string", "enum": ["voice_azure"], + "const": "voice_azure", "title": "Type" }, "voice_name": { @@ -2564,7 +2767,10 @@ }, "BuyPhoneNumberRequest": { "properties": { - "area_code": { "type": "string", "title": "Area Code" }, + "area_code": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Area Code" + }, "telephony_provider": { "type": "string", "enum": ["vonage", "twilio"], @@ -2572,9 +2778,20 @@ "default": "vonage" }, "telephony_account_connection": { - "type": "string", - "format": "uuid", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], "title": "Telephony Account Connection" + }, + "inbound_agent": { + "anyOf": [ + { "$ref": "#/components/schemas/AgentParams" }, + { "type": "string", "format": "uuid" }, + { "type": "string", "enum": ["default"], "const": "default" }, + { "type": "null" } + ], + "title": "Inbound Agent" } }, "type": "object", @@ -2588,52 +2805,93 @@ "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], "default": "not_started" }, - "error_message": { "type": "string", "title": "Error Message" }, + "error_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Error Message" + }, "recording_available": { "type": "boolean", "title": "Recording Available", "default": false }, - "transcript": { "type": "string", "title": "Transcript" }, + "transcript": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Transcript" + }, "human_detection_result": { - "type": "string", - "enum": ["human", "no_human"], + "anyOf": [ + { "type": "string", "enum": ["human", "no_human"] }, + { "type": "null" } + ], "title": "Human Detection Result" }, "do_not_call_result": { - "type": "boolean", + "anyOf": [{ "type": "boolean" }, { "type": "null" }], "title": "Do Not Call Result" }, - "telephony_id": { "type": "string", "title": "Telephony Id" }, + "telephony_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Telephony Id" + }, "stage": { - "type": "string", - "enum": [ - "created", - "picked_up", - "transfer_started", - "transfer_successful" + "anyOf": [ + { + "type": "string", + "enum": [ + "created", + "picked_up", + "transfer_started", + "transfer_successful" + ] + }, + { "type": "null" } ], "title": "Stage" }, "stage_outcome": { - "type": "string", - "enum": [ - "human_unanswered", - "call_did_not_connect", - "human_disconnected", - "bot_disconnected", - "transfer_unanswered", - "transfer_disconnected" + "anyOf": [ + { + "type": "string", + "enum": [ + "human_unanswered", + "call_did_not_connect", + "human_disconnected", + "bot_disconnected", + "transfer_unanswered", + "transfer_disconnected" + ] + }, + { "type": "null" } ], "title": "Stage Outcome" }, "telephony_metadata": { "anyOf": [ - { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, - { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + { + "oneOf": [ + { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, + { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "telephony_metadata_twilio": "#/components/schemas/TwilioTelephonyMetadata", + "telephony_metadata_vonage": "#/components/schemas/VonageTelephonyMetadata" + } + } + }, + { "type": "null" } ], "title": "Telephony Metadata" }, + "start_time": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Start Time" + }, + "end_time": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "End Time" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "$ref": "#/components/schemas/Agent" }, @@ -2646,41 +2904,46 @@ "type": "string", "title": "Agent Phone Number" }, - "start_time": { - "type": "string", - "format": "date-time", - "title": "Start Time" - }, - "end_time": { - "type": "string", - "format": "date-time", - "title": "End Time" - }, "hipaa_compliant": { "type": "boolean", "title": "Hipaa Compliant", "default": false }, "on_no_human_answer": { - "type": "string", - "enum": ["continue", "hangup"], + "anyOf": [ + { "type": "string", "enum": ["continue", "hangup"] }, + { "type": "null" } + ], "title": "On No Human Answer" }, "context": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Context" }, "run_do_not_call_detection": { - "type": "boolean", + "anyOf": [{ "type": "boolean" }, { "type": "null" }], "title": "Run Do Not Call Detection" }, "telephony_account_connection": { - "$ref": "#/components/schemas/TwilioAccountConnection" + "anyOf": [ + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "type": "null" } + ] }, "telephony_params": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Telephony Params" } }, @@ -2726,19 +2989,22 @@ "CallStatus": { "type": "string", "enum": ["not_started", "in_progress", "error", "ended"], - "title": "CallStatus", - "description": "An enumeration." + "title": "CallStatus" }, "CollectField": { "properties": { "field_type": { "type": "string", "enum": ["field_type_email"], + "const": "field_type_email", "title": "Field Type" }, "label": { "type": "string", "title": "Label" }, "name": { "type": "string", "title": "Name" }, - "description": { "type": "string", "title": "Description" } + "description": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Description" + } }, "type": "object", "required": ["field_type", "label", "name"], @@ -2746,7 +3012,10 @@ }, "CreateCallAgentParams": { "properties": { - "name": { "type": "string", "title": "Name" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -2774,7 +3043,18 @@ }, { "$ref": "#/components/schemas/SetHoldActionParams" }, { "$ref": "#/components/schemas/ExternalActionParams" } - ] + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_add_to_conference": "#/components/schemas/AddToConferenceActionParams", + "action_dtmf": "#/components/schemas/DTMFActionParams", + "action_end_conversation": "#/components/schemas/EndConversationActionParams", + "action_external": "#/components/schemas/ExternalActionParams", + "action_set_hold": "#/components/schemas/SetHoldActionParams", + "action_transfer_call": "#/components/schemas/TransferCallActionParams" + } + } } ] }, @@ -2790,24 +3070,40 @@ { "$ref": "#/components/schemas/AzureVoiceParams" }, { "$ref": "#/components/schemas/RimeVoiceParams" }, { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, - { "$ref": "#/components/schemas/PlayHtVoiceParams" } - ] + { "$ref": "#/components/schemas/PlayHtVoiceParams" }, + { "$ref": "#/components/schemas/VocodeVoiceParams" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "voice_azure": "#/components/schemas/AzureVoiceParams", + "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceParams", + "voice_play_ht": "#/components/schemas/PlayHtVoiceParams", + "voice_rime": "#/components/schemas/RimeVoiceParams", + "voice_vocode": "#/components/schemas/VocodeVoiceParams" + } + } } ], "title": "Voice" }, - "initial_message": { "type": "string", "title": "Initial Message" }, + "initial_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Initial Message" + }, "webhook": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/WebhookParams" } + { "$ref": "#/components/schemas/WebhookParams" }, + { "type": "null" } ], "title": "Webhook" }, "vector_database": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" }, + { "type": "null" } ], "title": "Vector Database" }, @@ -2815,7 +3111,10 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "low" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "noise_suppression": { "type": "boolean", "title": "Noise Suppression", @@ -2844,7 +3143,7 @@ "default": 0.0 }, "openai_model_name_override": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Openai Model Name Override" }, "ask_if_human_present_on_idle": { @@ -2855,7 +3154,8 @@ "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, - { "type": "string", "format": "uuid" } + { "type": "string", "format": "uuid" }, + { "type": "null" } ], "title": "Openai Account Connection" }, @@ -2864,6 +3164,24 @@ "title": "Run Do Not Call Detection", "default": false }, + "llm_fallback": { + "anyOf": [ + { "$ref": "#/components/schemas/InternalLLMFallback" }, + { "type": "null" } + ] + }, + "deepgram_keywords": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [{ "type": "integer" }, { "type": "number" }] + }, + "type": "object" + }, + { "type": "null" } + ], + "title": "Deepgram Keywords" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -2892,7 +3210,7 @@ "default": "continue" }, "run_do_not_call_detection": { - "type": "boolean", + "anyOf": [{ "type": "boolean" }, { "type": "null" }], "title": "Run Do Not Call Detection" }, "hipaa_compliant": { @@ -2901,13 +3219,23 @@ "default": false }, "context": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Context" }, "telephony_params": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Telephony Params" } }, @@ -2922,23 +3250,15 @@ "type": { "type": "string", "enum": ["action_dtmf"], + "const": "action_dtmf", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + "allOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" } ], - "title": "Action Trigger", - "default": { "type": "action_trigger_function_call", "config": {} }, - "discriminator": { - "propertyName": "type", - "mapping": { - "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" - } - } + "default": { "type": "action_trigger_function_call", "config": {} } } }, "type": "object", @@ -2950,23 +3270,15 @@ "type": { "type": "string", "enum": ["action_dtmf"], + "const": "action_dtmf", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + "allOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" } ], - "title": "Action Trigger", - "default": { "type": "action_trigger_function_call", "config": {} }, - "discriminator": { - "propertyName": "type", - "mapping": { - "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" - } - } + "default": { "type": "action_trigger_function_call", "config": {} } } }, "type": "object", @@ -2978,6 +3290,7 @@ "type": { "type": "string", "enum": ["action_dtmf"], + "const": "action_dtmf", "title": "Type" }, "config": { @@ -2989,12 +3302,7 @@ }, "action_trigger": { "anyOf": [ - { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] - }, + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, { "$ref": "#/components/schemas/Undefined" } ], "title": "Action Trigger", @@ -3012,17 +3320,30 @@ "type": { "type": "string", "enum": ["voice_eleven_labs"], + "const": "voice_eleven_labs", "title": "Type" }, "voice_id": { "type": "string", "title": "Voice Id" }, - "stability": { "type": "number", "title": "Stability" }, - "similarity_boost": { "type": "number", "title": "Similarity Boost" }, - "api_key": { "type": "string", "title": "Api Key" }, + "stability": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Stability" + }, + "similarity_boost": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Similarity Boost" + }, + "api_key": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Key" + }, "optimize_streaming_latency": { - "type": "integer", + "anyOf": [{ "type": "integer" }, { "type": "null" }], "title": "Optimize Streaming Latency" }, - "model_id": { "type": "string", "title": "Model Id" }, + "model_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Model Id" + }, "experimental_input_streaming": { "type": "boolean", "title": "Experimental Input Streaming", @@ -3038,17 +3359,30 @@ "type": { "type": "string", "enum": ["voice_eleven_labs"], + "const": "voice_eleven_labs", "title": "Type" }, "voice_id": { "type": "string", "title": "Voice Id" }, - "stability": { "type": "number", "title": "Stability" }, - "similarity_boost": { "type": "number", "title": "Similarity Boost" }, - "api_key": { "type": "string", "title": "Api Key" }, + "stability": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Stability" + }, + "similarity_boost": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Similarity Boost" + }, + "api_key": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Key" + }, "optimize_streaming_latency": { - "type": "integer", + "anyOf": [{ "type": "integer" }, { "type": "null" }], "title": "Optimize Streaming Latency" }, - "model_id": { "type": "string", "title": "Model Id" }, + "model_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Model Id" + }, "experimental_input_streaming": { "type": "boolean", "title": "Experimental Input Streaming", @@ -3064,6 +3398,7 @@ "type": { "type": "string", "enum": ["voice_eleven_labs"], + "const": "voice_eleven_labs", "title": "Type" }, "voice_id": { @@ -3076,35 +3411,40 @@ "stability": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Stability" }, "similarity_boost": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Similarity Boost" }, "api_key": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Api Key" }, "optimize_streaming_latency": { "anyOf": [ { "type": "integer" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Optimize Streaming Latency" }, "model_id": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Model Id" }, @@ -3132,13 +3472,14 @@ "type": { "type": "string", "enum": ["action_end_conversation"], + "const": "action_end_conversation", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Output" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -3146,7 +3487,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Output" } } } @@ -3160,13 +3501,14 @@ "type": { "type": "string", "enum": ["action_end_conversation"], + "const": "action_end_conversation", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -3174,7 +3516,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" } } } @@ -3188,6 +3530,7 @@ "type": { "type": "string", "enum": ["action_end_conversation"], + "const": "action_end_conversation", "title": "Type" }, "config": { @@ -3202,8 +3545,17 @@ { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] + { + "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + } }, { "$ref": "#/components/schemas/Undefined" } ], @@ -3227,8 +3579,7 @@ "event_recording", "event_human_detection" ], - "title": "EventType", - "description": "An enumeration." + "title": "EventType" }, "ExternalAction": { "properties": { @@ -3237,23 +3588,15 @@ "type": { "type": "string", "enum": ["action_external"], + "const": "action_external", "title": "Type" }, "config": { "$ref": "#/components/schemas/ExternalActionConfig" }, "action_trigger": { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + "allOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" } ], - "title": "Action Trigger", - "default": { "type": "action_trigger_function_call", "config": {} }, - "discriminator": { - "propertyName": "type", - "mapping": { - "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" - } - } + "default": { "type": "action_trigger_function_call", "config": {} } } }, "type": "object", @@ -3265,6 +3608,7 @@ "processing_mode": { "type": "string", "enum": ["muted"], + "const": "muted", "title": "Processing Mode", "default": "muted" }, @@ -3273,7 +3617,11 @@ "url": { "type": "string", "title": "Url" }, "input_schema": { "type": "object", "title": "Input Schema" }, "speak_on_send": { "type": "boolean", "title": "Speak On Send" }, - "speak_on_receive": { "type": "boolean", "title": "Speak On Receive" } + "speak_on_receive": { + "type": "boolean", + "title": "Speak On Receive" + }, + "signature_secret": { "type": "string", "title": "Signature Secret" } }, "type": "object", "required": [ @@ -3291,23 +3639,15 @@ "type": { "type": "string", "enum": ["action_external"], + "const": "action_external", "title": "Type" }, "config": { "$ref": "#/components/schemas/ExternalActionConfig" }, "action_trigger": { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + "allOf": [ + { "$ref": "#/components/schemas/FunctionCallActionTrigger" } ], - "title": "Action Trigger", - "default": { "type": "action_trigger_function_call", "config": {} }, - "discriminator": { - "propertyName": "type", - "mapping": { - "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" - } - } + "default": { "type": "action_trigger_function_call", "config": {} } } }, "type": "object", @@ -3319,6 +3659,7 @@ "type": { "type": "string", "enum": ["action_external"], + "const": "action_external", "title": "Type" }, "config": { @@ -3330,12 +3671,7 @@ }, "action_trigger": { "anyOf": [ - { - "oneOf": [ - { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] - }, + { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, { "$ref": "#/components/schemas/Undefined" } ], "title": "Action Trigger", @@ -3351,6 +3687,7 @@ "type": { "type": "string", "enum": ["action_trigger_function_call"], + "const": "action_trigger_function_call", "title": "Type" }, "config": { @@ -3369,8 +3706,7 @@ "HTTPMethod": { "type": "string", "enum": ["GET", "POST"], - "title": "HTTPMethod", - "description": "An enumeration." + "title": "HTTPMethod" }, "HTTPValidationError": { "properties": { @@ -3383,11 +3719,23 @@ "type": "object", "title": "HTTPValidationError" }, + "InternalLLMFallback": { + "properties": { + "provider": { + "type": "string", + "enum": ["openai", "azure"], + "title": "Provider" + }, + "model_name": { "type": "string", "title": "Model Name" } + }, + "type": "object", + "required": ["provider", "model_name"], + "title": "InternalLLMFallback" + }, "InterruptSensitivity": { "type": "string", "enum": ["low", "high"], - "title": "InterruptSensitivity", - "description": "An enumeration." + "title": "InterruptSensitivity" }, "Language": { "type": "string", @@ -3404,8 +3752,7 @@ "ja", "ko" ], - "title": "Language", - "description": "An enumeration." + "title": "Language" }, "LinkPhoneNumberRequest": { "properties": { @@ -3419,6 +3766,15 @@ "type": "boolean", "title": "Outbound Only", "default": false + }, + "inbound_agent": { + "anyOf": [ + { "$ref": "#/components/schemas/AgentParams" }, + { "type": "string", "format": "uuid" }, + { "type": "string", "enum": ["default"], "const": "default" }, + { "type": "null" } + ], + "title": "Inbound Agent" } }, "type": "object", @@ -3429,7 +3785,10 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "name": { "type": "string", "title": "Name" }, + "name": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Name" + }, "prompt": { "anyOf": [ { "type": "string", "format": "uuid" }, @@ -3447,12 +3806,22 @@ "title": "Actions" }, "voice": { "type": "string", "format": "uuid", "title": "Voice" }, - "initial_message": { "type": "string", "title": "Initial Message" }, - "webhook": { "type": "string", "format": "uuid", "title": "Webhook" }, + "initial_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Initial Message" + }, + "webhook": { + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], + "title": "Webhook" + }, "vector_database": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" } + { "$ref": "#/components/schemas/PineconeVectorDatabaseParams" }, + { "type": "null" } ], "title": "Vector Database" }, @@ -3460,7 +3829,10 @@ "allOf": [{ "$ref": "#/components/schemas/InterruptSensitivity" }], "default": "low" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "noise_suppression": { "type": "boolean", "title": "Noise Suppression", @@ -3489,7 +3861,7 @@ "default": 0.0 }, "openai_model_name_override": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Openai Model Name Override" }, "ask_if_human_present_on_idle": { @@ -3500,7 +3872,8 @@ "openai_account_connection": { "anyOf": [ { "$ref": "#/components/schemas/OpenAIAccountConnection" }, - { "type": "string", "format": "uuid" } + { "type": "string", "format": "uuid" }, + { "type": "null" } ], "title": "Openai Account Connection" }, @@ -3509,6 +3882,24 @@ "title": "Run Do Not Call Detection", "default": false }, + "llm_fallback": { + "anyOf": [ + { "$ref": "#/components/schemas/InternalLLMFallback" }, + { "type": "null" } + ] + }, + "deepgram_keywords": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [{ "type": "integer" }, { "type": "number" }] + }, + "type": "object" + }, + { "type": "null" } + ], + "title": "Deepgram Keywords" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -3527,52 +3918,93 @@ "allOf": [{ "$ref": "#/components/schemas/CallStatus" }], "default": "not_started" }, - "error_message": { "type": "string", "title": "Error Message" }, + "error_message": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Error Message" + }, "recording_available": { "type": "boolean", "title": "Recording Available", "default": false }, - "transcript": { "type": "string", "title": "Transcript" }, + "transcript": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Transcript" + }, "human_detection_result": { - "type": "string", - "enum": ["human", "no_human"], + "anyOf": [ + { "type": "string", "enum": ["human", "no_human"] }, + { "type": "null" } + ], "title": "Human Detection Result" }, "do_not_call_result": { - "type": "boolean", + "anyOf": [{ "type": "boolean" }, { "type": "null" }], "title": "Do Not Call Result" }, - "telephony_id": { "type": "string", "title": "Telephony Id" }, + "telephony_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Telephony Id" + }, "stage": { - "type": "string", - "enum": [ - "created", - "picked_up", - "transfer_started", - "transfer_successful" + "anyOf": [ + { + "type": "string", + "enum": [ + "created", + "picked_up", + "transfer_started", + "transfer_successful" + ] + }, + { "type": "null" } ], "title": "Stage" }, "stage_outcome": { - "type": "string", - "enum": [ - "human_unanswered", - "call_did_not_connect", - "human_disconnected", - "bot_disconnected", - "transfer_unanswered", - "transfer_disconnected" + "anyOf": [ + { + "type": "string", + "enum": [ + "human_unanswered", + "call_did_not_connect", + "human_disconnected", + "bot_disconnected", + "transfer_unanswered", + "transfer_disconnected" + ] + }, + { "type": "null" } ], "title": "Stage Outcome" }, "telephony_metadata": { "anyOf": [ - { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, - { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + { + "oneOf": [ + { "$ref": "#/components/schemas/VonageTelephonyMetadata" }, + { "$ref": "#/components/schemas/TwilioTelephonyMetadata" } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "telephony_metadata_twilio": "#/components/schemas/TwilioTelephonyMetadata", + "telephony_metadata_vonage": "#/components/schemas/VonageTelephonyMetadata" + } + } + }, + { "type": "null" } ], "title": "Telephony Metadata" }, + "start_time": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Start Time" + }, + "end_time": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "End Time" + }, "to_number": { "type": "string", "title": "To Number" }, "from_number": { "type": "string", "title": "From Number" }, "agent": { "type": "string", "format": "uuid", "title": "Agent" }, @@ -3585,45 +4017,48 @@ "type": "string", "title": "Agent Phone Number" }, - "start_time": { - "type": "string", - "format": "date-time", - "title": "Start Time" - }, - "end_time": { - "type": "string", - "format": "date-time", - "title": "End Time" - }, "hipaa_compliant": { "type": "boolean", "title": "Hipaa Compliant", "default": false }, "on_no_human_answer": { - "type": "string", - "enum": ["continue", "hangup"], + "anyOf": [ + { "type": "string", "enum": ["continue", "hangup"] }, + { "type": "null" } + ], "title": "On No Human Answer" }, "context": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Context" }, "run_do_not_call_detection": { - "type": "boolean", + "anyOf": [{ "type": "boolean" }, { "type": "null" }], "title": "Run Do Not Call Detection" }, "telephony_account_connection": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/TwilioAccountConnection" } + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "type": "null" } ], "title": "Telephony Account Connection" }, "telephony_params": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Telephony Params" } }, @@ -3646,8 +4081,10 @@ "active": { "type": "boolean", "title": "Active", "default": true }, "label": { "type": "string", "title": "Label", "default": "" }, "inbound_agent": { - "type": "string", - "format": "uuid", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], "title": "Inbound Agent" }, "outbound_only": { @@ -3656,8 +4093,13 @@ "default": false }, "example_context": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Example Context" }, "number": { "type": "string", "title": "Number" }, @@ -3670,13 +4112,14 @@ "telephony_account_connection": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/TwilioAccountConnection" } + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "type": "null" } ], "title": "Telephony Account Connection" } }, "type": "object", - "required": ["id", "user_id", "inbound_agent", "number"], + "required": ["id", "user_id", "number"], "title": "NormalizedPhoneNumber" }, "NormalizedPrompt": { @@ -3685,14 +4128,24 @@ "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "content": { "type": "string", "title": "Content", "default": "" }, "collect_fields": { - "items": { "$ref": "#/components/schemas/CollectField" }, - "type": "array", + "anyOf": [ + { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array" + }, + { "type": "null" } + ], "title": "Collect Fields" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "prompt_template": { - "type": "string", - "format": "uuid", + "anyOf": [ + { "type": "string", "format": "uuid" }, + { "type": "null" } + ], "title": "Prompt Template" } }, @@ -3708,6 +4161,7 @@ "type": { "type": "string", "enum": ["account_connection_openai"], + "const": "account_connection_openai", "title": "Type" } }, @@ -3721,6 +4175,7 @@ "type": { "type": "string", "enum": ["account_connection_openai"], + "const": "account_connection_openai", "title": "Type" } }, @@ -3740,6 +4195,7 @@ "type": { "type": "string", "enum": ["account_connection_openai"], + "const": "account_connection_openai", "title": "Type" } }, @@ -3761,15 +4217,25 @@ "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "active": { "type": "boolean", "title": "Active", "default": true }, "label": { "type": "string", "title": "Label", "default": "" }, - "inbound_agent": { "$ref": "#/components/schemas/Agent" }, + "inbound_agent": { + "anyOf": [ + { "$ref": "#/components/schemas/Agent" }, + { "type": "null" } + ] + }, "outbound_only": { "type": "boolean", "title": "Outbound Only", "default": false }, "example_context": { - "additionalProperties": { "type": "string" }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + { "type": "null" } + ], "title": "Example Context" }, "number": { "type": "string", "title": "Number" }, @@ -3780,11 +4246,14 @@ "default": "vonage" }, "telephony_account_connection": { - "$ref": "#/components/schemas/TwilioAccountConnection" + "anyOf": [ + { "$ref": "#/components/schemas/TwilioAccountConnection" }, + { "type": "null" } + ] } }, "type": "object", - "required": ["id", "user_id", "inbound_agent", "number"], + "required": ["id", "user_id", "number"], "title": "PhoneNumber" }, "PhoneNumberPage": { @@ -3814,11 +4283,28 @@ ], "title": "PhoneNumberPage" }, - "PhraseBasedActionTrigger": { + "PhraseBasedActionTrigger-Input": { + "properties": { + "type": { + "type": "string", + "enum": ["action_trigger_phrase_based"], + "const": "action_trigger_phrase_based", + "title": "Type" + }, + "config": { + "$ref": "#/components/schemas/PhraseBasedActionTriggerConfig" + } + }, + "type": "object", + "required": ["type", "config"], + "title": "PhraseBasedActionTrigger" + }, + "PhraseBasedActionTrigger-Output": { "properties": { "type": { "type": "string", "enum": ["action_trigger_phrase_based"], + "const": "action_trigger_phrase_based", "title": "Type" }, "config": { @@ -3847,7 +4333,8 @@ "conditions": { "items": { "type": "string", - "enum": ["phrase_condition_type_contains"] + "enum": ["phrase_condition_type_contains"], + "const": "phrase_condition_type_contains" }, "type": "array", "title": "Conditions" @@ -3864,6 +4351,7 @@ "type": { "type": "string", "enum": ["vector_database_pinecone"], + "const": "vector_database_pinecone", "title": "Type" }, "index": { "type": "string", "title": "Index" }, @@ -3886,6 +4374,7 @@ "type": { "type": "string", "enum": ["vector_database_pinecone"], + "const": "vector_database_pinecone", "title": "Type" }, "index": { "type": "string", "title": "Index" }, @@ -3901,6 +4390,7 @@ "type": { "type": "string", "enum": ["vector_database_pinecone"], + "const": "vector_database_pinecone", "title": "Type" }, "index": { @@ -3937,8 +4427,7 @@ "plan_enterprise", "plan_unlimited" ], - "title": "PlanType", - "description": "An enumeration." + "title": "PlanType" }, "PlayHtVoice": { "properties": { @@ -3947,27 +4436,54 @@ "type": { "type": "string", "enum": ["voice_play_ht"], + "const": "voice_play_ht", "title": "Type" }, "voice_id": { "type": "string", "title": "Voice Id" }, - "api_user_id": { "type": "string", "title": "Api User Id" }, - "api_key": { "type": "string", "title": "Api Key" }, + "api_user_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api User Id" + }, + "api_key": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Key" + }, "version": { "type": "string", "enum": ["1", "2"], "title": "Version", "default": "2" }, - "speed": { "type": "number", "title": "Speed" }, + "speed": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Speed" + }, "quality": { - "type": "string", - "enum": ["faster", "draft", "low", "medium", "high", "premium"], + "anyOf": [ + { + "type": "string", + "enum": ["faster", "draft", "low", "medium", "high", "premium"] + }, + { "type": "null" } + ], "title": "Quality" }, - "temperature": { "type": "number", "title": "Temperature" }, - "top_p": { "type": "number", "title": "Top P" }, - "text_guidance": { "type": "number", "title": "Text Guidance" }, - "voice_guidance": { "type": "number", "title": "Voice Guidance" }, + "temperature": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Temperature" + }, + "top_p": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Top P" + }, + "text_guidance": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Text Guidance" + }, + "voice_guidance": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Voice Guidance" + }, "experimental_remove_silence": { "type": "boolean", "title": "Experimental Remove Silence", @@ -3983,27 +4499,54 @@ "type": { "type": "string", "enum": ["voice_play_ht"], + "const": "voice_play_ht", "title": "Type" }, "voice_id": { "type": "string", "title": "Voice Id" }, - "api_user_id": { "type": "string", "title": "Api User Id" }, - "api_key": { "type": "string", "title": "Api Key" }, + "api_user_id": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api User Id" + }, + "api_key": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Api Key" + }, "version": { "type": "string", "enum": ["1", "2"], "title": "Version", "default": "2" }, - "speed": { "type": "number", "title": "Speed" }, + "speed": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Speed" + }, "quality": { - "type": "string", - "enum": ["faster", "draft", "low", "medium", "high", "premium"], + "anyOf": [ + { + "type": "string", + "enum": ["faster", "draft", "low", "medium", "high", "premium"] + }, + { "type": "null" } + ], "title": "Quality" }, - "temperature": { "type": "number", "title": "Temperature" }, - "top_p": { "type": "number", "title": "Top P" }, - "text_guidance": { "type": "number", "title": "Text Guidance" }, - "voice_guidance": { "type": "number", "title": "Voice Guidance" }, + "temperature": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Temperature" + }, + "top_p": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Top P" + }, + "text_guidance": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Text Guidance" + }, + "voice_guidance": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Voice Guidance" + }, "experimental_remove_silence": { "type": "boolean", "title": "Experimental Remove Silence", @@ -4019,6 +4562,7 @@ "type": { "type": "string", "enum": ["voice_play_ht"], + "const": "voice_play_ht", "title": "Type" }, "voice_id": { @@ -4031,14 +4575,16 @@ "api_user_id": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Api User Id" }, "api_key": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Api Key" }, @@ -4052,7 +4598,8 @@ "speed": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Speed" }, @@ -4062,35 +4609,40 @@ "type": "string", "enum": ["faster", "draft", "low", "medium", "high", "premium"] }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Quality" }, "temperature": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Temperature" }, "top_p": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Top P" }, "text_guidance": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Text Guidance" }, "voice_guidance": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Voice Guidance" }, @@ -4112,12 +4664,25 @@ "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "content": { "type": "string", "title": "Content", "default": "" }, "collect_fields": { - "items": { "$ref": "#/components/schemas/CollectField" }, - "type": "array", + "anyOf": [ + { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array" + }, + { "type": "null" } + ], "title": "Collect Fields" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, - "prompt_template": { "$ref": "#/components/schemas/PromptTemplate" } + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, + "prompt_template": { + "anyOf": [ + { "$ref": "#/components/schemas/PromptTemplate" }, + { "type": "null" } + ] + } }, "type": "object", "required": ["id", "user_id"], @@ -4154,15 +4719,24 @@ "properties": { "content": { "type": "string", "title": "Content", "default": "" }, "collect_fields": { - "items": { "$ref": "#/components/schemas/CollectField" }, - "type": "array", + "anyOf": [ + { + "items": { "$ref": "#/components/schemas/CollectField" }, + "type": "array" + }, + { "type": "null" } + ], "title": "Collect Fields" }, - "context_endpoint": { "type": "string", "title": "Context Endpoint" }, + "context_endpoint": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Context Endpoint" + }, "prompt_template": { "anyOf": [ { "type": "string", "format": "uuid" }, - { "$ref": "#/components/schemas/PromptTemplate" } + { "$ref": "#/components/schemas/PromptTemplate" }, + { "type": "null" } ], "title": "Prompt Template" } @@ -4200,14 +4774,16 @@ "items": { "$ref": "#/components/schemas/CollectField" }, "type": "array" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Collect Fields" }, "context_endpoint": { "anyOf": [ { "type": "string" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Context Endpoint" }, @@ -4215,7 +4791,8 @@ "anyOf": [ { "type": "string", "format": "uuid" }, { "$ref": "#/components/schemas/PromptTemplate" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Prompt Template" } @@ -4235,13 +4812,22 @@ "properties": { "id": { "type": "string", "format": "uuid", "title": "Id" }, "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, - "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, + "type": { + "type": "string", + "enum": ["voice_rime"], + "const": "voice_rime", + "title": "Type" + }, "speaker": { "type": "string", "title": "Speaker" }, - "speed_alpha": { "type": "number", "title": "Speed Alpha" }, + "speed_alpha": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Speed Alpha" + }, "model_id": { "anyOf": [ { "type": "string", "enum": ["mist", "v1"] }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Model Id" } @@ -4252,13 +4838,22 @@ }, "RimeVoiceParams": { "properties": { - "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, + "type": { + "type": "string", + "enum": ["voice_rime"], + "const": "voice_rime", + "title": "Type" + }, "speaker": { "type": "string", "title": "Speaker" }, - "speed_alpha": { "type": "number", "title": "Speed Alpha" }, + "speed_alpha": { + "anyOf": [{ "type": "number" }, { "type": "null" }], + "title": "Speed Alpha" + }, "model_id": { "anyOf": [ { "type": "string", "enum": ["mist", "v1"] }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Model Id" } @@ -4269,7 +4864,12 @@ }, "RimeVoiceUpdateParams": { "properties": { - "type": { "type": "string", "enum": ["voice_rime"], "title": "Type" }, + "type": { + "type": "string", + "enum": ["voice_rime"], + "const": "voice_rime", + "title": "Type" + }, "speaker": { "anyOf": [ { "type": "string" }, @@ -4280,14 +4880,16 @@ "speed_alpha": { "anyOf": [ { "type": "number" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Speed Alpha" }, "model_id": { "anyOf": [ { "type": "string", "enum": ["mist", "v1"] }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Model Id" } @@ -4303,13 +4905,14 @@ "type": { "type": "string", "enum": ["action_set_hold"], + "const": "action_set_hold", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Output" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -4317,7 +4920,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Output" } } } @@ -4331,13 +4934,14 @@ "type": { "type": "string", "enum": ["action_set_hold"], + "const": "action_set_hold", "title": "Type" }, "config": { "$ref": "#/components/schemas/EmptyActionConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -4345,7 +4949,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" } } } @@ -4359,6 +4963,7 @@ "type": { "type": "string", "enum": ["action_set_hold"], + "const": "action_set_hold", "title": "Type" }, "config": { @@ -4373,8 +4978,17 @@ { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] + { + "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + } }, { "$ref": "#/components/schemas/Undefined" } ], @@ -4393,13 +5007,14 @@ "type": { "type": "string", "enum": ["action_transfer_call"], + "const": "action_transfer_call", "title": "Type" }, "config": { "$ref": "#/components/schemas/TransferCallConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Output" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -4407,7 +5022,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Output" } } } @@ -4421,13 +5036,14 @@ "type": { "type": "string", "enum": ["action_transfer_call"], + "const": "action_transfer_call", "title": "Type" }, "config": { "$ref": "#/components/schemas/TransferCallConfig" }, "action_trigger": { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } + { "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" } ], "title": "Action Trigger", "default": { "type": "action_trigger_function_call", "config": {} }, @@ -4435,7 +5051,7 @@ "propertyName": "type", "mapping": { "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", - "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger" + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" } } } @@ -4449,6 +5065,7 @@ "type": { "type": "string", "enum": ["action_transfer_call"], + "const": "action_transfer_call", "title": "Type" }, "config": { @@ -4463,8 +5080,17 @@ { "oneOf": [ { "$ref": "#/components/schemas/FunctionCallActionTrigger" }, - { "$ref": "#/components/schemas/PhraseBasedActionTrigger" } - ] + { + "$ref": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "action_trigger_function_call": "#/components/schemas/FunctionCallActionTrigger", + "action_trigger_phrase_based": "#/components/schemas/PhraseBasedActionTrigger-Input" + } + } }, { "$ref": "#/components/schemas/Undefined" } ], @@ -4492,6 +5118,7 @@ "type": { "type": "string", "enum": ["account_connection_twilio"], + "const": "account_connection_twilio", "title": "Type" }, "steering_pool": { @@ -4515,6 +5142,7 @@ "type": { "type": "string", "enum": ["account_connection_twilio"], + "const": "account_connection_twilio", "title": "Type" }, "steering_pool": { @@ -4544,6 +5172,7 @@ "type": { "type": "string", "enum": ["account_connection_twilio"], + "const": "account_connection_twilio", "title": "Type" } }, @@ -4571,20 +5200,30 @@ "type": { "type": "string", "enum": ["telephony_metadata_twilio"], + "const": "telephony_metadata_twilio", "title": "Type", "default": "telephony_metadata_twilio" }, - "call_sid": { "type": "string", "title": "Call Sid" }, - "call_status": { "type": "string", "title": "Call Status" }, + "call_sid": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Call Sid" + }, + "call_status": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Call Status" + }, "transfer_call_sid": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Transfer Call Sid" }, "transfer_call_status": { - "type": "string", + "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Transfer Call Status" }, - "conference_sid": { "type": "string", "title": "Conference Sid" } + "conference_sid": { + "anyOf": [{ "type": "string" }, { "type": "null" }], + "title": "Conference Sid" + } }, "type": "object", "title": "TwilioTelephonyMetadata" @@ -4610,7 +5249,8 @@ "additionalProperties": { "type": "string" }, "type": "object" }, - { "$ref": "#/components/schemas/Undefined" } + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Example Context" }, @@ -4623,9 +5263,10 @@ }, "inbound_agent": { "anyOf": [ - { "type": "string", "format": "uuid" }, { "$ref": "#/components/schemas/AgentUpdateParams" }, - { "$ref": "#/components/schemas/Undefined" } + { "type": "string", "format": "uuid" }, + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } ], "title": "Inbound Agent" } @@ -4642,7 +5283,7 @@ "title": "Monthly Usage Minutes" }, "monthly_usage_limit_minutes": { - "type": "integer", + "anyOf": [{ "type": "integer" }, { "type": "null" }], "title": "Monthly Usage Limit Minutes" } }, @@ -4691,6 +5332,66 @@ ], "title": "VectorDatabasePage" }, + "VocodeVoice": { + "properties": { + "id": { "type": "string", "format": "uuid", "title": "Id" }, + "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, + "type": { + "type": "string", + "enum": ["voice_vocode"], + "const": "voice_vocode", + "title": "Type" + }, + "voice_id": { + "type": "string", + "enum": ["joe"], + "const": "joe", + "title": "Voice Id" + } + }, + "type": "object", + "required": ["id", "user_id", "type", "voice_id"], + "title": "VocodeVoice" + }, + "VocodeVoiceParams": { + "properties": { + "type": { + "type": "string", + "enum": ["voice_vocode"], + "const": "voice_vocode", + "title": "Type" + }, + "voice_id": { + "type": "string", + "enum": ["joe"], + "const": "joe", + "title": "Voice Id" + } + }, + "type": "object", + "required": ["type", "voice_id"], + "title": "VocodeVoiceParams" + }, + "VocodeVoiceUpdateParams": { + "properties": { + "type": { + "type": "string", + "enum": ["voice_vocode"], + "const": "voice_vocode", + "title": "Type" + }, + "voice_id": { + "anyOf": [ + { "type": "string", "enum": ["joe"], "const": "joe" }, + { "$ref": "#/components/schemas/Undefined" } + ], + "title": "Voice Id" + } + }, + "type": "object", + "required": ["type"], + "title": "VocodeVoiceUpdateParams" + }, "VoicePage": { "properties": { "items": { @@ -4699,15 +5400,17 @@ { "$ref": "#/components/schemas/AzureVoice" }, { "$ref": "#/components/schemas/RimeVoice" }, { "$ref": "#/components/schemas/ElevenLabsVoice" }, - { "$ref": "#/components/schemas/PlayHtVoice" } + { "$ref": "#/components/schemas/PlayHtVoice" }, + { "$ref": "#/components/schemas/VocodeVoice" } ], "discriminator": { "propertyName": "type", "mapping": { "voice_azure": "#/components/schemas/AzureVoice", - "voice_rime": "#/components/schemas/RimeVoice", "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", - "voice_play_ht": "#/components/schemas/PlayHtVoice" + "voice_play_ht": "#/components/schemas/PlayHtVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_vocode": "#/components/schemas/VocodeVoice" } } }, @@ -4739,16 +5442,18 @@ { "$ref": "#/components/schemas/AzureVoiceParams" }, { "$ref": "#/components/schemas/RimeVoiceParams" }, { "$ref": "#/components/schemas/ElevenLabsVoiceParams" }, - { "$ref": "#/components/schemas/PlayHtVoiceParams" } + { "$ref": "#/components/schemas/PlayHtVoiceParams" }, + { "$ref": "#/components/schemas/VocodeVoiceParams" } ], "title": "VoiceParamsRequest", "discriminator": { "propertyName": "type", "mapping": { "voice_azure": "#/components/schemas/AzureVoiceParams", - "voice_rime": "#/components/schemas/RimeVoiceParams", "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceParams", - "voice_play_ht": "#/components/schemas/PlayHtVoiceParams" + "voice_play_ht": "#/components/schemas/PlayHtVoiceParams", + "voice_rime": "#/components/schemas/RimeVoiceParams", + "voice_vocode": "#/components/schemas/VocodeVoiceParams" } } }, @@ -4757,16 +5462,18 @@ { "$ref": "#/components/schemas/AzureVoice" }, { "$ref": "#/components/schemas/RimeVoice" }, { "$ref": "#/components/schemas/ElevenLabsVoice" }, - { "$ref": "#/components/schemas/PlayHtVoice" } + { "$ref": "#/components/schemas/PlayHtVoice" }, + { "$ref": "#/components/schemas/VocodeVoice" } ], "title": "VoiceResponseModel", "discriminator": { "propertyName": "type", "mapping": { "voice_azure": "#/components/schemas/AzureVoice", - "voice_rime": "#/components/schemas/RimeVoice", "voice_eleven_labs": "#/components/schemas/ElevenLabsVoice", - "voice_play_ht": "#/components/schemas/PlayHtVoice" + "voice_play_ht": "#/components/schemas/PlayHtVoice", + "voice_rime": "#/components/schemas/RimeVoice", + "voice_vocode": "#/components/schemas/VocodeVoice" } } }, @@ -4775,16 +5482,18 @@ { "$ref": "#/components/schemas/AzureVoiceUpdateParams" }, { "$ref": "#/components/schemas/RimeVoiceUpdateParams" }, { "$ref": "#/components/schemas/ElevenLabsVoiceUpdateParams" }, - { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" } + { "$ref": "#/components/schemas/PlayHtVoiceUpdateParams" }, + { "$ref": "#/components/schemas/VocodeVoiceUpdateParams" } ], "title": "VoiceUpdateParamsRequest", "discriminator": { "propertyName": "type", "mapping": { "voice_azure": "#/components/schemas/AzureVoiceUpdateParams", - "voice_rime": "#/components/schemas/RimeVoiceUpdateParams", "voice_eleven_labs": "#/components/schemas/ElevenLabsVoiceUpdateParams", - "voice_play_ht": "#/components/schemas/PlayHtVoiceUpdateParams" + "voice_play_ht": "#/components/schemas/PlayHtVoiceUpdateParams", + "voice_rime": "#/components/schemas/RimeVoiceUpdateParams", + "voice_vocode": "#/components/schemas/VocodeVoiceUpdateParams" } } }, @@ -4793,6 +5502,7 @@ "type": { "type": "string", "enum": ["telephony_metadata_vonage"], + "const": "telephony_metadata_vonage", "title": "Type", "default": "telephony_metadata_vonage" } @@ -4806,7 +5516,8 @@ "user_id": { "type": "string", "format": "uuid", "title": "User Id" }, "subscriptions": { "items": { "$ref": "#/components/schemas/EventType" }, - "type": "array" + "type": "array", + "title": "Subscriptions" }, "url": { "type": "string", "title": "Url" }, "method": { @@ -4849,7 +5560,8 @@ "properties": { "subscriptions": { "items": { "$ref": "#/components/schemas/EventType" }, - "type": "array" + "type": "array", + "title": "Subscriptions" }, "url": { "type": "string", "title": "Url" }, "method": { From 86514bb40c3fe45880c5919166fec8470e658d08 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Mon, 26 Aug 2024 16:43:03 -0700 Subject: [PATCH 140/148] Poll time for idle changed to half of idle time threshold (#692) --- vocode/streaming/streaming_conversation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index dffb154203..af5749d2d8 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -773,7 +773,7 @@ async def check_for_idle(self): ) check_human_present_count += 1 # wait till the idle time would have passed the threshold if no action occurs - await asyncio.sleep(ALLOWED_IDLE_TIME) + await asyncio.sleep(self.idle_time_threshold / 2) async def send_single_message( self, From b0ca4d84cd28138e29c82c67d862750bad39eaf4 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Tue, 27 Aug 2024 16:17:07 -0700 Subject: [PATCH 141/148] Update agent to include idle_time_seconds (#694) --- docs/openapi.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/openapi.json b/docs/openapi.json index a959dff13c..33f19ee87e 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2244,6 +2244,10 @@ ], "title": "Deepgram Keywords" }, + "idle_time_seconds": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Idle Time Seconds" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -2453,6 +2457,10 @@ ], "title": "Deepgram Keywords" }, + "idle_time_seconds": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Idle Time Seconds" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -2692,6 +2700,14 @@ { "type": "null" } ], "title": "Deepgram Keywords" + }, + "idle_time_seconds": { + "anyOf": [ + { "type": "integer" }, + { "$ref": "#/components/schemas/Undefined" }, + { "type": "null" } + ], + "title": "Idle Time Seconds" } }, "type": "object", @@ -3182,6 +3198,10 @@ ], "title": "Deepgram Keywords" }, + "idle_time_seconds": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Idle Time Seconds" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", @@ -3900,6 +3920,10 @@ ], "title": "Deepgram Keywords" }, + "idle_time_seconds": { + "anyOf": [{ "type": "integer" }, { "type": "null" }], + "title": "Idle Time Seconds" + }, "llm_temperature": { "type": "number", "title": "Llm Temperature", From 84c297114e0b7a2a333d17f2257452e65abd0528 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Fri, 30 Aug 2024 15:58:53 -0700 Subject: [PATCH 142/148] Reset check_human_present_count when human is actually present (#696) --- vocode/streaming/streaming_conversation.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index af5749d2d8..a880faf3a3 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -275,6 +275,7 @@ async def process(self, transcription: Transcription): if self.conversation.current_transcription_is_interrupt: logger.debug("sent interrupt") logger.debug("Human started speaking") + self.conversation.is_human_still_there = True transcription.is_interrupt = self.conversation.current_transcription_is_interrupt self.conversation.is_human_speaking = not transcription.is_final @@ -667,6 +668,7 @@ def __init__( self.check_for_idle_task: Optional[asyncio.Task] = None self.check_for_idle_paused = False + self.is_human_still_there = True self.current_transcription_is_interrupt: bool = False @@ -762,12 +764,16 @@ async def check_for_idle(self): check_human_present_count = 0 check_human_present_threshold = self.agent.get_agent_config().num_check_human_present_times while self.is_active(): + if check_human_present_count > 0 and self.is_human_still_there == True: + # Reset the counter if the human is still there + check_human_present_count = 0 if ( not self.check_for_idle_paused ) and time.time() - self.last_action_timestamp > self.idle_time_threshold: if check_human_present_count >= check_human_present_threshold: # Stop the phone call after some retries to prevent infinitely long call where human is just silent. await self.action_on_idle() + self.is_human_still_there = False await self.send_single_message( message=BaseMessage(text=random.choice(CHECK_HUMAN_PRESENT_MESSAGE_CHOICES)), ) From 1bfc1e2b60d13ed2d372cd4b6c46187a4c66c301 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Thu, 5 Sep 2024 10:14:11 -0700 Subject: [PATCH 143/148] Add gpt-4o-2024-08-06 to token map (#701) * Have all gpt-4o tokens use the same limit --- vocode/streaming/agent/token_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vocode/streaming/agent/token_utils.py b/vocode/streaming/agent/token_utils.py index bf014b2b7f..7288f0d4dd 100644 --- a/vocode/streaming/agent/token_utils.py +++ b/vocode/streaming/agent/token_utils.py @@ -56,13 +56,14 @@ "gpt-4-0125-preview": 127940, "gpt-4-turbo": 127940, "gpt-4o": 127940, - "gpt-4o-2024-05-13": 127940, } def get_chat_gpt_max_tokens(model_name: str): if model_name.startswith("ft:"): model_name = model_name.split(":")[1] + if model_name.startswith("gpt-4o"): + model_name = "gpt-4o" if model_name in CHAT_GPT_MAX_TOKENS: return CHAT_GPT_MAX_TOKENS[model_name] From dc983a046afbd54d177d59e4887a6828a5a8ead3 Mon Sep 17 00:00:00 2001 From: Timothy Luong Date: Fri, 6 Sep 2024 19:59:42 -0400 Subject: [PATCH 144/148] [Cartesia] Upgrading the message cutoff for Cartesia Synthesizer to use timestamps (#700) * Upgrading the message cutoff for Cartesia Synthesizer to use timestamps * Linting * Adding typing to * fix lint --------- Co-authored-by: Ajay Raj --- .../synthesizer/cartesia_synthesizer.py | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/vocode/streaming/synthesizer/cartesia_synthesizer.py b/vocode/streaming/synthesizer/cartesia_synthesizer.py index 959ca5ba5e..e9387253ef 100644 --- a/vocode/streaming/synthesizer/cartesia_synthesizer.py +++ b/vocode/streaming/synthesizer/cartesia_synthesizer.py @@ -1,5 +1,6 @@ import asyncio import hashlib +from typing import List, Tuple from loguru import logger @@ -90,6 +91,8 @@ def __init__( self.client = self.cartesia_tts(api_key=self.api_key) self.ws = None self.ctx = None + self.ctx_message = BaseMessage(text="") + self.ctx_timestamps: List[Tuple[str, float, float]] = [] self.no_more_inputs_task = None self.no_more_inputs_lock = asyncio.Lock() @@ -99,10 +102,14 @@ async def initialize_ws(self): async def initialize_ctx(self, is_first_text_chunk: bool): if self.ctx is None or self.ctx.is_closed(): + self.ctx_message = BaseMessage(text="") + self.ctx_timestamps = [] if self.ws: self.ctx = self.ws.context() else: if is_first_text_chunk: + self.ctx_message = BaseMessage(text="") + self.ctx_timestamps = [] if self.no_more_inputs_task: self.no_more_inputs_task.cancel() await self.ctx.no_more_inputs() @@ -144,6 +151,7 @@ async def create_speech_uncached( voice_id=self.voice_id, continue_=not is_sole_text_chunk, output_format=self.output_format, + add_timestamps=True, _experimental_voice_controls=self._experimental_voice_controls, ) if not is_sole_text_chunk: @@ -159,12 +167,20 @@ async def chunk_generator(context): try: async for event in context.receive(): audio = event.get("audio") - buffer.extend(audio) - while len(buffer) >= chunk_size: - yield SynthesisResult.ChunkResult( - chunk=buffer[:chunk_size], is_last_chunk=False - ) - buffer = buffer[chunk_size:] + word_timestamps = event.get("word_timestamps") + if word_timestamps: + words = word_timestamps["words"] + start_times = word_timestamps["start"] + end_times = word_timestamps["end"] + for word, start, end in zip(words, start_times, end_times): + self.ctx_timestamps.append((word, start, end)) + if audio: + buffer.extend(audio) + while len(buffer) >= chunk_size: + yield SynthesisResult.ChunkResult( + chunk=buffer[:chunk_size], is_last_chunk=False + ) + buffer = buffer[chunk_size:] except Exception as e: logger.info( f"Caught error while receiving audio chunks from CartesiaSynthesizer: {e}" @@ -180,11 +196,28 @@ async def chunk_generator(context): buffer.extend(b"\x00\x00" * padding_size) # 0 is silence in s16le yield SynthesisResult.ChunkResult(chunk=buffer, is_last_chunk=True) + self.ctx_message.text += transcript + + def get_message_cutoff_ctx(message, seconds, words_per_minute=150): + if seconds: + closest_index = 0 + if len(self.ctx_timestamps) > 0: + for index, word_timestamp in enumerate(self.ctx_timestamps): + _word, start, end = word_timestamp + closest_index = index + if end >= seconds: + break + if closest_index: + # Check if they're less than 2 seconds apart, fall back to words per minute otherwise + if self.ctx_timestamps[closest_index][2] - seconds < 2: + return " ".join( + [word for word, *_ in self.ctx_timestamps[: closest_index + 1]] + ) + return self.get_message_cutoff_from_voice_speed(message, seconds, words_per_minute) + return SynthesisResult( chunk_generator=chunk_generator(self.ctx), - get_message_up_to=lambda seconds: self.get_message_cutoff_from_voice_speed( - message, seconds - ), + get_message_up_to=lambda seconds: get_message_cutoff_ctx(self.ctx_message, seconds), ) @classmethod From a40c59b5b49baf963a89f6bb6343fb7a7a7e461a Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Fri, 20 Sep 2024 09:14:32 -0700 Subject: [PATCH 145/148] Support passing in custom connector for AsyncRequestor (#706) --- vocode/streaming/utils/async_requester.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/vocode/streaming/utils/async_requester.py b/vocode/streaming/utils/async_requester.py index 5b23875cca..d3577f5909 100644 --- a/vocode/streaming/utils/async_requester.py +++ b/vocode/streaming/utils/async_requester.py @@ -1,17 +1,22 @@ +from typing import Optional + import aiohttp import httpx +from aiohttp import BaseConnector +from pydantic import BaseModel from vocode.streaming.utils.singleton import Singleton class AsyncRequestor(Singleton): - def __init__(self): - self.session = aiohttp.ClientSession() + def __init__(self, connector: Optional[BaseConnector] = None): + self.session = aiohttp.ClientSession(connector=connector) self.async_client = httpx.AsyncClient() + self.connector = connector def get_session(self): if self.session.closed: - self.session = aiohttp.ClientSession() + self.session = aiohttp.ClientSession(connector=self.connector) return self.session def get_client(self): From c3c41f2fef170b46122e59e801a05780b551fdc0 Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Thu, 26 Sep 2024 14:23:03 -0700 Subject: [PATCH 146/148] Adds a log to see what caused an interrupt (#708) * Adds a log to see what caused an interrupt --- vocode/streaming/streaming_conversation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vocode/streaming/streaming_conversation.py b/vocode/streaming/streaming_conversation.py index a880faf3a3..e6c7d746dc 100644 --- a/vocode/streaming/streaming_conversation.py +++ b/vocode/streaming/streaming_conversation.py @@ -273,6 +273,9 @@ async def process(self, transcription: Transcription): ) self.has_associated_unignored_utterance = not transcription.is_final if self.conversation.current_transcription_is_interrupt: + logger.debug( + f"Interrupting transcription: {transcription.message}, confidence: {transcription.confidence}" + ) logger.debug("sent interrupt") logger.debug("Human started speaking") self.conversation.is_human_still_there = True From fb8e0796b2cedda58bce4fe485b7bf714b02386d Mon Sep 17 00:00:00 2001 From: vocode-petern Date: Wed, 9 Oct 2024 09:45:49 -0700 Subject: [PATCH 147/148] Don't close session on transfer call (#717) --- vocode/streaming/action/transfer_call.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/vocode/streaming/action/transfer_call.py b/vocode/streaming/action/transfer_call.py index 397dd7a4ef..2fe270024e 100644 --- a/vocode/streaming/action/transfer_call.py +++ b/vocode/streaming/action/transfer_call.py @@ -104,13 +104,14 @@ async def transfer_call(self, twilio_call_sid: str, to_phone: str): payload = {"Twiml": twiml_data} - async with AsyncRequestor().get_session() as session: - async with session.post(url, data=payload, auth=twilio_client.auth) as response: - if response.status != 200: - logger.error(f"Failed to transfer call: {response.status} {response.reason}") - raise Exception("failed to update call") - else: - return await response.json() + async with AsyncRequestor().get_session().post( + url, data=payload, auth=twilio_client.auth + ) as response: + if response.status != 200: + logger.error(f"Failed to transfer call: {response.status} {response.reason}") + raise Exception("failed to update call") + else: + return await response.json() async def run( self, action_input: ActionInput[TransferCallParameters] From e054c33a72787b6a4920f91eb8598ad0bafb4240 Mon Sep 17 00:00:00 2001 From: Ajay Raj Date: Fri, 15 Nov 2024 14:16:58 -0800 Subject: [PATCH 148/148] upgrades websockets and cartesia to latest versions (#729) * upgrades websockets and cartesia to latest versions * fix lint * fix typecheck --- .../agent/websocket_user_implemented_agent.py | 2 +- poetry.lock | 622 ++++++++++-------- pyproject.toml | 4 +- .../agent/websocket_user_implemented_agent.py | 8 +- .../eleven_labs_websocket_synthesizer.py | 2 +- .../transcriber/assembly_ai_transcriber.py | 2 +- .../transcriber/deepgram_transcriber.py | 12 +- .../transcriber/rev_ai_transcriber.py | 6 +- 8 files changed, 377 insertions(+), 281 deletions(-) diff --git a/playground/streaming/agent/websocket_user_implemented_agent.py b/playground/streaming/agent/websocket_user_implemented_agent.py index 56698bc445..1f6ce1805a 100644 --- a/playground/streaming/agent/websocket_user_implemented_agent.py +++ b/playground/streaming/agent/websocket_user_implemented_agent.py @@ -1,6 +1,6 @@ import asyncio -from websockets.server import serve +from websockets.asyncio.server import serve from vocode.streaming.models.websocket_agent import ( WebSocketAgentMessage, diff --git a/poetry.lock b/poetry.lock index e9caa21b30..8367a8eec2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,97 +13,98 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.1" +version = "3.11.2" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:47b4c2412960e64d97258f40616efddaebcb34ff664c8a972119ed38fac2a62c"}, - {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7dbf637f87dd315fa1f36aaed8afa929ee2c607454fb7791e74c88a0d94da59"}, - {file = "aiohttp-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8fb76214b5b739ce59e2236a6489d9dc3483649cfd6f563dbf5d8e40dbdd57d"}, - {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c577cdcf8f92862363b3d598d971c6a84ed8f0bf824d4cc1ce70c2fb02acb4a"}, - {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:777e23609899cb230ad2642b4bdf1008890f84968be78de29099a8a86f10b261"}, - {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b07286a1090483799599a2f72f76ac396993da31f6e08efedb59f40876c144fa"}, - {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9db600a86414a9a653e3c1c7f6a2f6a1894ab8f83d11505247bd1b90ad57157"}, - {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c3f1eb280008e51965a8d160a108c333136f4a39d46f516c64d2aa2e6a53f2"}, - {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f5dd109a925fee4c9ac3f6a094900461a2712df41745f5d04782ebcbe6479ccb"}, - {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8c81ff4afffef9b1186639506d70ea90888218f5ddfff03870e74ec80bb59970"}, - {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2a384dfbe8bfebd203b778a30a712886d147c61943675f4719b56725a8bbe803"}, - {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b9fb6508893dc31cfcbb8191ef35abd79751db1d6871b3e2caee83959b4d91eb"}, - {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:88596384c3bec644a96ae46287bb646d6a23fa6014afe3799156aef42669c6bd"}, - {file = "aiohttp-3.10.1-cp310-cp310-win32.whl", hash = "sha256:68164d43c580c2e8bf8e0eb4960142919d304052ccab92be10250a3a33b53268"}, - {file = "aiohttp-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:d6bbe2c90c10382ca96df33b56e2060404a4f0f88673e1e84b44c8952517e5f3"}, - {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6979b4f20d3e557a867da9d9227de4c156fcdcb348a5848e3e6190fd7feb972"}, - {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03c0c380c83f8a8d4416224aafb88d378376d6f4cadebb56b060688251055cd4"}, - {file = "aiohttp-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c2b104e81b3c3deba7e6f5bc1a9a0e9161c380530479970766a6655b8b77c7c"}, - {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b023b68c61ab0cd48bd38416b421464a62c381e32b9dc7b4bdfa2905807452a4"}, - {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a07c76a82390506ca0eabf57c0540cf5a60c993c442928fe4928472c4c6e5e6"}, - {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41d8dab8c64ded1edf117d2a64f353efa096c52b853ef461aebd49abae979f16"}, - {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615348fab1a9ef7d0960a905e83ad39051ae9cb0d2837da739b5d3a7671e497a"}, - {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:256ee6044214ee9d66d531bb374f065ee94e60667d6bbeaa25ca111fc3997158"}, - {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d5bb926805022508b7ddeaad957f1fce7a8d77532068d7bdb431056dc630cd"}, - {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:028faf71b338f069077af6315ad54281612705d68889f5d914318cbc2aab0d50"}, - {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5c12310d153b27aa630750be44e79313acc4e864c421eb7d2bc6fa3429c41bf8"}, - {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:de1a91d5faded9054957ed0a9e01b9d632109341942fc123947ced358c5d9009"}, - {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9c186b270979fb1dee3ababe2d12fb243ed7da08b30abc83ebac3a928a4ddb15"}, - {file = "aiohttp-3.10.1-cp311-cp311-win32.whl", hash = "sha256:4a9ce70f5e00380377aac0e568abd075266ff992be2e271765f7b35d228a990c"}, - {file = "aiohttp-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:a77c79bac8d908d839d32c212aef2354d2246eb9deb3e2cb01ffa83fb7a6ea5d"}, - {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2212296cdb63b092e295c3e4b4b442e7b7eb41e8a30d0f53c16d5962efed395d"}, - {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4dcb127ca3eb0a61205818a606393cbb60d93b7afb9accd2fd1e9081cc533144"}, - {file = "aiohttp-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb8b79a65332e1a426ccb6290ce0409e1dc16b4daac1cc5761e059127fa3d134"}, - {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc24f707ed9cb961f6ee04020ca01de2c89b2811f3cf3361dc7c96a14bfbcc"}, - {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cb54f5725b4b37af12edf6c9e834df59258c82c15a244daa521a065fbb11717"}, - {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d03e948e53b3639ce4d438f3d1d8202898ec6655cadcc09ec99229d4adc2a9"}, - {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786299d719eb5d868f161aeec56d589396b053925b7e0ce36e983d30d0a3e55c"}, - {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abda4009a30d51d3f06f36bc7411a62b3e647fa6cc935ef667e3e3d3a7dd09b1"}, - {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67f7639424c313125213954e93a6229d3a1d386855d70c292a12628f600c7150"}, - {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e5a26d7aac4c0d8414a347da162696eea0629fdce939ada6aedf951abb1d745"}, - {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:120548d89f14b76a041088b582454d89389370632ee12bf39d919cc5c561d1ca"}, - {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f5293726943bdcea24715b121d8c4ae12581441d22623b0e6ab12d07ce85f9c4"}, - {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f8605e573ed6c44ec689d94544b2c4bb1390aaa723a8b5a2cc0a5a485987a68"}, - {file = "aiohttp-3.10.1-cp312-cp312-win32.whl", hash = "sha256:e7168782621be4448d90169a60c8b37e9b0926b3b79b6097bc180c0a8a119e73"}, - {file = "aiohttp-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fbf8c0ded367c5c8eaf585f85ca8dd85ff4d5b73fb8fe1e6ac9e1b5e62e11f7"}, - {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:54b7f4a20d7cc6bfa4438abbde069d417bb7a119f870975f78a2b99890226d55"}, - {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fa643ca990323db68911b92f3f7a0ca9ae300ae340d0235de87c523601e58d9"}, - {file = "aiohttp-3.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8311d0d690487359fe2247ec5d2cac9946e70d50dced8c01ce9e72341c21151"}, - {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222821c60b8f6a64c5908cb43d69c0ee978a1188f6a8433d4757d39231b42cdb"}, - {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7b55d9ede66af7feb6de87ff277e0ccf6d51c7db74cc39337fe3a0e31b5872d"}, - {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a95151a5567b3b00368e99e9c5334a919514f60888a6b6d2054fea5e66e527e"}, - {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9e9171d2fe6bfd9d3838a6fe63b1e91b55e0bf726c16edf265536e4eafed19"}, - {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a57e73f9523e980f6101dc9a83adcd7ac0006ea8bf7937ca3870391c7bb4f8ff"}, - {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0df51a3d70a2bfbb9c921619f68d6d02591f24f10e9c76de6f3388c89ed01de6"}, - {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b0de63ff0307eac3961b4af74382d30220d4813f36b7aaaf57f063a1243b4214"}, - {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8db9b749f589b5af8e4993623dbda6716b2b7a5fcb0fa2277bf3ce4b278c7059"}, - {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6b14c19172eb53b63931d3e62a9749d6519f7c121149493e6eefca055fcdb352"}, - {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cd57ad998e3038aa87c38fe85c99ed728001bf5dde8eca121cadee06ee3f637"}, - {file = "aiohttp-3.10.1-cp38-cp38-win32.whl", hash = "sha256:df31641e3f02b77eb3c5fb63c0508bee0fc067cf153da0e002ebbb0db0b6d91a"}, - {file = "aiohttp-3.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:93094eba50bc2ad4c40ff4997ead1fdcd41536116f2e7d6cfec9596a8ecb3615"}, - {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:440954ddc6b77257e67170d57b1026aa9545275c33312357472504eef7b4cc0b"}, - {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9f8beed277488a52ee2b459b23c4135e54d6a819eaba2e120e57311015b58e9"}, - {file = "aiohttp-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8a8221a63602008550022aa3a4152ca357e1dde7ab3dd1da7e1925050b56863"}, - {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a702bd3663b5cbf3916e84bf332400d24cdb18399f0877ca6b313ce6c08bfb43"}, - {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1988b370536eb14f0ce7f3a4a5b422ab64c4e255b3f5d7752c5f583dc8c967fc"}, - {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ccf1f0a304352c891d124ac1a9dea59b14b2abed1704aaa7689fc90ef9c5be1"}, - {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3ea6ef2a83edad84bbdb5d96e22f587b67c68922cd7b6f9d8f24865e655bcf"}, - {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b47c125ab07f0831803b88aeb12b04c564d5f07a1c1a225d4eb4d2f26e8b5e"}, - {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21778552ef3d44aac3278cc6f6d13a6423504fa5f09f2df34bfe489ed9ded7f5"}, - {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bde0693073fd5e542e46ea100aa6c1a5d36282dbdbad85b1c3365d5421490a92"}, - {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bf66149bb348d8e713f3a8e0b4f5b952094c2948c408e1cfef03b49e86745d60"}, - {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:587237571a85716d6f71f60d103416c9df7d5acb55d96d3d3ced65f39bff9c0c"}, - {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bfe33cba6e127d0b5b417623c9aa621f0a69f304742acdca929a9fdab4593693"}, - {file = "aiohttp-3.10.1-cp39-cp39-win32.whl", hash = "sha256:9fbff00646cf8211b330690eb2fd64b23e1ce5b63a342436c1d1d6951d53d8dd"}, - {file = "aiohttp-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:5951c328f9ac42d7bce7a6ded535879bc9ae13032818d036749631fa27777905"}, - {file = "aiohttp-3.10.1.tar.gz", hash = "sha256:8b0d058e4e425d3b45e8ec70d49b402f4d6b21041e674798b1f91ba027c73f28"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:783741f534c14957fbe657d62a34b947ec06db23d45a2fd4a8aeb73d9c84d7e6"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:435f7a08d8aa42371a94e7c141205a9cb092ba551084b5e0c57492e6673601a3"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c681f34e2814bc6e1eef49752b338061b94a42c92734d0be9513447d3f83718c"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a664478ae1ea011b5a710fb100b115ca8b2146864fa0ce4143ff944df714b8"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1d06c8fd8b453c3e553c956bd3b8395100401060430572174bb7876dd95ad49"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b1f4844909321ef2c1cee50ddeccbd6018cd8c8d1ddddda3f553e94a5859497"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdc6f8dce09281ae534eaf08a54f0d38612398375f28dad733a8885f3bf9b978"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2d942421cf3a1d1eceae8fa192f1fbfb74eb9d3e207d35ad2696bd2ce2c987c"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:08ebe7a1d6c1e5ca766d68407280d69658f5f98821c2ba6c41c63cabfed159af"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2793d3297f3e49015140e6d3ea26142c967e07998e2fb00b6ee8d041138fbc4e"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4a23475d8d5c56e447b7752a1e2ac267c1f723f765e406c81feddcd16cdc97bc"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:556564d89e2f4a6e8fe000894c03e4e84cf0b6cfa5674e425db122633ee244d1"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:57993f406ce3f114b2a6756d7809be3ffd0cc40f33e8f8b9a4aa1b027fd4e3eb"}, + {file = "aiohttp-3.11.2-cp310-cp310-win32.whl", hash = "sha256:177b000efaf8d2f7012c649e8aee5b0bf488677b1162be5e7511aa4f9d567607"}, + {file = "aiohttp-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:ff5d22eece44528023254b595c670dfcf9733ac6af74c4b6cb4f6a784dc3870c"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50e0aee4adc9abcd2109c618a8d1b2c93b85ac277b24a003ab147d91e068b06d"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9aa4e68f1e4f303971ec42976fb170204fb5092de199034b57199a1747e78a2d"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d84930b4145991214602372edd7305fc76b700220db79ac0dd57d3afd0f0a1ca"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ec8afd362356b8798c8caa806e91deb3f0602d8ffae8e91d2d3ced2a90c35e"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb0544a0e8294a5a5e20d3cacdaaa9a911d7c0a9150f5264aef36e7d8fdfa07e"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7b0a1618060e3f5aa73d3526ca2108a16a1b6bf86612cd0bb2ddcbef9879d06"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d878a0186023ac391861958035174d0486f3259cabf8fd94e591985468da3ea"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e33a7eddcd07545ccf5c3ab230f60314a17dc33e285475e8405e26e21f02660"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4d7fad8c456d180a6d2f44c41cfab4b80e2e81451815825097db48b8293f59d5"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d954ba0eae7f33884d27dc00629ca4389d249eb8d26ca07c30911257cae8c96"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:afa55e863224e664a782effa62245df73fdfc55aee539bed6efacf35f6d4e4b7"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:10a5f91c319d9d4afba812f72984816b5fcd20742232ff7ecc1610ffbf3fc64d"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6e8e19a80ba194db5c06915a9df23c0c06e0e9ca9a4db9386a6056cca555a027"}, + {file = "aiohttp-3.11.2-cp311-cp311-win32.whl", hash = "sha256:9c8d1db4f65bbc9d75b7b271d68fb996f1c8c81a525263862477d93611856c2d"}, + {file = "aiohttp-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:2adb967454e10e69478ba4a8d8afbba48a7c7a8619216b7c807f8481cc66ddfb"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f833a80d9de9307d736b6af58c235b17ef7f90ebea7b9c49cd274dec7a66a2f1"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:382f853516664d2ebfc75dc01da4a10fdef5edcb335fe7b45cf471ce758ecb18"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3a2bcf6c81639a165da93469e1e0aff67c956721f3fa9c0560f07dd1e505116"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3b4d5fb5d69749104b880a157f38baeea7765c93d9cd3837cedd5b84729e10"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a90a0dc4b054b5af299a900bf950fe8f9e3e54322bc405005f30aa5cacc5c98"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32334f35824811dd20a12cc90825d000e6b50faaeaa71408d42269151a66140d"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cba0b8d25aa2d450762f3dd6df85498f5e7c3ad0ddeb516ef2b03510f0eea32"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bbb2dbc2701ab7e9307ca3a8fa4999c5b28246968e0a0202a5afabf48a42e22"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97fba98fc5d9ccd3d33909e898d00f2494d6a9eec7cbda3d030632e2c8bb4d00"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0ebdf5087e2ce903d8220cc45dcece90c2199ae4395fd83ca616fcc81010db2c"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:122768e3ae9ce74f981b46edefea9c6e5a40aea38aba3ac50168e6370459bf20"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5587da333b7d280a312715b843d43e734652aa382cba824a84a67c81f75b338b"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85de9904bc360fd29a98885d2bfcbd4e02ab33c53353cb70607f2bea2cb92468"}, + {file = "aiohttp-3.11.2-cp312-cp312-win32.whl", hash = "sha256:b470de64d17156c37e91effc109d3b032b39867000e2c126732fe01d034441f9"}, + {file = "aiohttp-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:3f617a48b70f4843d54f52440ea1e58da6bdab07b391a3a6aed8d3b311a4cc04"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d90b5a3b0f32a5fecf5dd83d828713986c019585f5cddf40d288ff77f366615"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d23854e5867650d40cba54d49956aad8081452aa80b2cf0d8c310633f4f48510"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:486273d3b5af75a80c31c311988931bdd2a4b96a74d5c7f422bad948f99988ef"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9075313f8e41b481e4cb10af405054564b0247dc335db5398ed05f8ec38787e2"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44b69c69c194ffacbc50165911cf023a4b1b06422d1e1199d3aea82eac17004e"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b339d91ac9060bd6ecdc595a82dc151045e5d74f566e0864ef3f2ba0887fec42"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e8f5178958a9954043bc8cd10a5ae97352c3f2fc99aa01f2aebb0026010910"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3129151378f858cdc4a0a4df355c9a0d060ab49e2eea7e62e9f085bac100551b"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14eb6c628432720e41b4fab1ada879d56cfe7034159849e083eb536b4c2afa99"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e57a10aacedcf24666f4c90d03e599f71d172d1c5e00dcf48205c445806745b0"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:66e58a2e8c7609a3545c4b38fb8b01a6b8346c4862e529534f7674c5265a97b8"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9b6d15adc9768ff167614ca853f7eeb6ee5f1d55d5660e3af85ce6744fed2b82"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2914061f5ca573f990ec14191e6998752fa8fe50d518e3405410353c3f44aa5d"}, + {file = "aiohttp-3.11.2-cp313-cp313-win32.whl", hash = "sha256:1c2496182e577042e0e07a328d91c949da9e77a2047c7291071e734cd7a6e780"}, + {file = "aiohttp-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:cccb2937bece1310c5c0163d0406aba170a2e5fb1f0444d7b0e7fdc9bd6bb713"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:994cb893936dd2e1803655ae8667a45066bfd53360b148e22b4e3325cc5ea7a3"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3666c750b73ce463a413692e3a57c60f7089e2d9116a2aa5a0f0eaf2ae325148"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6ad9a7d2a3a0f235184426425f80bd3b26c66b24fd5fddecde66be30c01ebe6e"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c979fc92aba66730b66099cd5becb42d869a26c0011119bc1c2478408a8bf7a"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:766d0ebf8703d28f854f945982aa09224d5a27a29594c70d921c43c3930fe7ac"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79efd1ee3827b2f16797e14b1e45021206c3271249b4d0025014466d416d7413"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6e069b882c1fdcbe5577dc4be372eda705180197140577a4cddb648c29d22e"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9a766c346b2ed7e88937919d84ed64b4ef489dad1d8939f806ee52901dc142"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2b02a68b9445c70d7f5c8b578c5f5e5866b1d67ca23eb9e8bc8658ae9e3e2c74"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:374baefcb1b6275f350da605951f5f02487a9bc84a574a7d5b696439fabd49a3"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d2f991c18132f3e505c108147925372ffe4549173b7c258cf227df1c5977a635"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:34f37c59b12bc3afc52bab6fcd9cd3be82ff01c4598a84cbea934ccb3a9c54a0"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33af11eca7bb0f5c6ffaf5e7d9d2336c2448f9c6279b93abdd6f3c35f9ee321f"}, + {file = "aiohttp-3.11.2-cp39-cp39-win32.whl", hash = "sha256:83a70e22e0f6222effe7f29fdeba6c6023f9595e59a0479edacfbd7de4b77bb7"}, + {file = "aiohttp-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c28c1677ea33ccb8b14330560094cc44d3ff4fad617a544fd18beb90403fe0f1"}, + {file = "aiohttp-3.11.2.tar.gz", hash = "sha256:68d1f46f9387db3785508f5225d3acbc5825ca13d9c29f2b5cce203d5863eb79"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -312,26 +313,21 @@ files = [ [[package]] name = "cartesia" -version = "1.0.10" +version = "1.1.0" description = "The official Python library for the Cartesia API." optional = true -python-versions = ">=3.8.0" +python-versions = ">=3.9" files = [ - {file = "cartesia-1.0.10-py2.py3-none-any.whl", hash = "sha256:99a25ca4e00a7104f4395d3dda9b1d04bb9112e51eea8a1756172877b9f2e889"}, - {file = "cartesia-1.0.10.tar.gz", hash = "sha256:b9d839e0fe7db4daacd3da858f6ef2c82c70daf18828c38e10dbc70dd9c060cd"}, + {file = "cartesia-1.1.0-py3-none-any.whl", hash = "sha256:0413e6fff941d64c6e29192ccb12f8973cca2bb55f64ad54d23334149f258704"}, + {file = "cartesia-1.1.0.tar.gz", hash = "sha256:baabf0d691db850d9a3f86186f5e50cccfeb567c3da952aed1b1f788ba1feead"}, ] [package.dependencies] -aiohttp = "*" -httpx = "*" -iterators = "*" -pytest-asyncio = "*" -requests = "*" -websockets = "*" - -[package.extras] -all = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] -dev = ["numpy", "pytest (>=8.0.2)", "pytest-cov (>=4.1.0)", "setuptools", "twine", "wheel"] +aiohttp = ">=3.10.10" +httpx = ">=0.27.2" +iterators = ">=0.2.0" +requests = ">=2.32.3" +websockets = ">=13.1" [[package]] name = "certifi" @@ -1627,13 +1623,13 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.27.0" +version = "0.27.2" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, ] [package.dependencies] @@ -1648,6 +1644,7 @@ brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "huggingface-hub" @@ -2734,6 +2731,113 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "proto-plus" version = "1.24.0" @@ -4422,83 +4526,80 @@ anyio = ">=3.0.0" [[package]] name = "websockets" -version = "12.0" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, - {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, - {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, - {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, - {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, - {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, - {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, - {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, - {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, - {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, - {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, - {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, - {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, - {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, - {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, - {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, - {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, - {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] @@ -4596,106 +4697,99 @@ files = [ [[package]] name = "yarl" -version = "1.9.4" +version = "1.17.1" description = "Yet another URL library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, - {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, - {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, - {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, - {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, - {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, - {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, - {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, - {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, - {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, - {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, - {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, - {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, - {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, - {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, - {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, - {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, - {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, - {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, - {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, - {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, - {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, - {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, - {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, - {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, - {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, - {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, - {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, - {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, - {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, - {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, - {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, - {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da"}, + {file = "yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3"}, + {file = "yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f"}, + {file = "yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931"}, + {file = "yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b"}, + {file = "yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988"}, + {file = "yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d"}, + {file = "yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4"}, + {file = "yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4"}, + {file = "yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7"}, + {file = "yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d"}, + {file = "yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147"}, + {file = "yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c"}, + {file = "yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199"}, + {file = "yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96"}, + {file = "yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374"}, + {file = "yarl-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e"}, + {file = "yarl-1.17.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299"}, + {file = "yarl-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258"}, + {file = "yarl-1.17.1-cp313-cp313-win32.whl", hash = "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2"}, + {file = "yarl-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159"}, + {file = "yarl-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934"}, + {file = "yarl-1.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5"}, + {file = "yarl-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f"}, + {file = "yarl-1.17.1-cp39-cp39-win32.whl", hash = "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473"}, + {file = "yarl-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138"}, + {file = "yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06"}, + {file = "yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [[package]] name = "zipp" @@ -4723,4 +4817,4 @@ transcribers = ["google-cloud-speech"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "8764521de733dd192ed02ee787441937d3e48eec29cd27cb958ccc773972952e" +content-hash = "2a170e93bca45cb3c8a6a5c83054685cc7639d4ff8b8a181343d497ecdc74f68" diff --git a/pyproject.toml b/pyproject.toml index 3f5e276d20..5dd464fe33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ sentry-sdk = { extras = ["fastapi"], version = "^2.3.1" } sounddevice = "^0.4.7" tiktoken = "^0.7.0" uvicorn = "^0.30.0" -websockets = "^12.0" +websockets = "^14.1" nltk = "^3.8.1" # LLM Providers @@ -43,7 +43,7 @@ groq = { version = "^0.9.0", optional = true } # Synthesizers google-cloud-texttospeech = { version = "^2.16.3", optional = true } pvkoala = { version = "^2.0.1", optional = true } -cartesia = { version = "^1.0.10", optional = true } +cartesia = {version = "^1.1.0", optional = true} # Transcribers google-cloud-speech = { version = "^2.26.0", optional = true } diff --git a/vocode/streaming/agent/websocket_user_implemented_agent.py b/vocode/streaming/agent/websocket_user_implemented_agent.py index 0faa522544..c10c26c662 100644 --- a/vocode/streaming/agent/websocket_user_implemented_agent.py +++ b/vocode/streaming/agent/websocket_user_implemented_agent.py @@ -3,7 +3,7 @@ import websockets from loguru import logger -from websockets.client import WebSocketClientProtocol, connect +from websockets.asyncio.client import ClientConnection from vocode.streaming.agent.base_agent import ( AgentInput, @@ -73,10 +73,10 @@ async def _process(self) -> None: socket_url = self.get_agent_config().respond.url logger.info("Connecting to web socket agent %s", socket_url) - async with connect(socket_url) as ws: + async with websockets.connect(socket_url) as ws: async def sender( - ws: WebSocketClientProtocol, + ws: ClientConnection, ) -> None: # sends audio to websocket while not self.has_ended: logger.info("Waiting for data from agent request queue") @@ -109,7 +109,7 @@ async def sender( logger.debug("Terminating web socket agent sender") - async def receiver(ws: WebSocketClientProtocol) -> None: + async def receiver(ws: ClientConnection) -> None: while not self.has_ended: try: msg = await ws.recv() diff --git a/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py index d95271c41d..1d10a0463e 100644 --- a/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py +++ b/vocode/streaming/synthesizer/eleven_labs_websocket_synthesizer.py @@ -176,7 +176,7 @@ async def establish_websocket_listeners(self, chunk_size): async with websockets.connect( url, - extra_headers=headers, + additional_headers=headers, ) as ws: async def write() -> None: diff --git a/vocode/streaming/transcriber/assembly_ai_transcriber.py b/vocode/streaming/transcriber/assembly_ai_transcriber.py index 00953bd44d..70e0119a04 100644 --- a/vocode/streaming/transcriber/assembly_ai_transcriber.py +++ b/vocode/streaming/transcriber/assembly_ai_transcriber.py @@ -94,7 +94,7 @@ async def process(self): async with websockets.connect( URL, - extra_headers=(("Authorization", self.api_key),), + additional_headers=(("Authorization", self.api_key),), ping_interval=5, ping_timeout=20, ) as ws: diff --git a/vocode/streaming/transcriber/deepgram_transcriber.py b/vocode/streaming/transcriber/deepgram_transcriber.py index 7f64f4a976..af7ce22313 100644 --- a/vocode/streaming/transcriber/deepgram_transcriber.py +++ b/vocode/streaming/transcriber/deepgram_transcriber.py @@ -8,7 +8,7 @@ import websockets from loguru import logger from pydantic.v1 import BaseModel, Field -from websockets.client import WebSocketClientProtocol +from websockets.asyncio.client import ClientConnection from vocode import getenv from vocode.streaming.models.audio import AudioEncoding @@ -389,16 +389,18 @@ async def process(self): self.audio_cursor = 0.0 self.start_ts = now() - extra_headers = {"Authorization": f"Token {self.api_key}"} + additional_headers = {"Authorization": f"Token {self.api_key}"} deepgram_url = self.get_deepgram_url() logger.info(f"Connecting to Deepgram at {deepgram_url}") try: - async with websockets.connect(deepgram_url, extra_headers=extra_headers) as ws: + async with websockets.connect( + deepgram_url, additional_headers=additional_headers + ) as ws: self.connected_ts = now() async def sender( - ws: WebSocketClientProtocol, + ws: ClientConnection, ): # sends audio to websocket byte_rate = self.get_byte_rate() @@ -417,7 +419,7 @@ async def sender( logger.debug("Terminating Deepgram transcriber sender") - async def receiver(ws: WebSocketClientProtocol): + async def receiver(ws: ClientConnection): buffer = "" buffer_avg_confidence = 0.0 num_buffer_utterances = 1 diff --git a/vocode/streaming/transcriber/rev_ai_transcriber.py b/vocode/streaming/transcriber/rev_ai_transcriber.py index bb5ae4d0c9..0323969282 100644 --- a/vocode/streaming/transcriber/rev_ai_transcriber.py +++ b/vocode/streaming/transcriber/rev_ai_transcriber.py @@ -5,7 +5,7 @@ import websockets from loguru import logger -from websockets.client import WebSocketClientProtocol +from websockets.asyncio.client import ClientConnection from vocode import getenv from vocode.streaming.models.transcriber import ( @@ -71,7 +71,7 @@ async def _run_loop(self): async def process(self): async with websockets.connect(self.get_rev_ai_url()) as ws: - async def sender(ws: WebSocketClientProtocol): + async def sender(ws: ClientConnection): while not self.closed: try: data = await asyncio.wait_for(self._input_queue.get(), 5) @@ -81,7 +81,7 @@ async def sender(ws: WebSocketClientProtocol): await ws.close() logger.debug("Terminating Rev.AI transcriber sender") - async def receiver(ws: WebSocketClientProtocol): + async def receiver(ws: ClientConnection): buffer = "" while not self.closed: